释放双眼,带上耳机,听听看~!
这个教程展示怎么从Arduino或者Genuino开发板通过一个5极DIN电缆来发送MIDI音符到一个MIDI乐器。
目录
MIDI 音符播放器
- 这个教程展示怎么从Arduino或者Genuino开发板通过一个5极DIN电缆来发送MIDI音符到一个MIDI乐器。
- MIDI,乐器的数字接口,一个用于控制合成器,音序器,和其他音乐设备的协议。MIDI设备通常分为两大类:控制器(基于人的动作来产生MIDI信号的设备)和合成器(包括采样器,音序器等等)。后者输入MIDI数据,就会产生声音,光,或者其他的东西。
- MIDI使一个串口协议,可以每秒钟操作31,250字节。开发板的内置串口接口(所有在Mega上的串口接口都一样)可以在那个速率上发送数据。
- MIDI字节被分成两类型:命令字节和数据字节。命令字节通常是大于128,或者0x80到0xFF(十六进制)。数据字节通常少于127,或者0x00到0x7F(十六进制)。命令包括类似note on, note off, pitch bend等等。数据字节包括弹奏音符的音高,速率,或者,音符音量,弯音等等。更多细节,查看MIDI特性或者MIDI Protocol Guides on the Web。
- MIDI数据通常用十六进制符号表示,因为MIDI音阶和乐器被分成16组。
硬件要求
- Arduino or Genuino Uno
- MIDI母座
- 220Ω 电阻
- 连接线
- MIDI 启动设备(可选, 测试用)
电路
根据MIDI说明书,所有MIDI连接器都是母座。这里是怎样把连接器连接到开发板。
- MIDI插座pin5通过220 Ω电阻连接到数字引脚pin1。
- MIDI插座pin2连接到地。
- MIDI插座pin4通过220 Ω电阻连接到+5V。
原理图
样例代码
注意:如果你用带有ATmega3U4的开发板(如DUE或者Leonardo),请根据下面程序用Serial1来替换Serial。
void setup() {
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {
// play notes from F#-0 (0x1E) to F#-5 (0x5A):
for (int note = 0x1E; note < 0x5A; note ++) {
//Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
noteOn(0x90, note, 0x45);
delay(100);
//Note on channel 1 (0x90), some note value (note), silent velocity (0x00):
noteOn(0x90, note, 0x00);
delay(100);
}
}
// plays a MIDI note. Doesn't check to see that
// cmd is greater than 127, or that data values are less than 127:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}