Arduino内置教程-通讯-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组。
更多介绍,看introduction to MIDI或者这个例子
硬件要求
- Arduino or Genuino Uno
- MIDI母座
- 2 220 ohm 电阻
- 连接线
- MIDI 启动设备(可选, 测试用)
电路
根据MIDI说明书,所有MIDI连接器都是母座。这里是怎样把连接器连接到开发板。
- MIDI插座pin5通过220 ohm电阻连接到数字引脚pin1。
- MIDI插座pin2连接到地。
- MIDI插座pin4通过220 ohm电阻连接到+5V。
原理图
样例代码
注意:如果你用带有ATmega3U4的开发板(如DUE或者Leonardo),请根据下面程序用Serial1来替换Serial。
/*
MIDI note player
This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data.
If this circuit is connected to a MIDI synth, it will play
the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence.
The circuit:
* digital in 1 connected to MIDI jack pin 5
* MIDI jack pin 2 connected to ground
* MIDI jack pin 4 connected to +5V through 220-ohm resistor
Attach a MIDI cable to the jack, then to a MIDI synth, and play music.
created 13 Jun 2006
modified 13 Aug 2012
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/Midi
*/
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);
}
更多
- serial.begin()
- for() loop
- ASCIITable - 示范使用Arduino的高等的串口输出函数。
- Dimmer - 移动鼠标来改变LED灯的亮度
- Graph - 发送数据到电脑,然后在Processing里画出它的图表。
- MultiSerialMega - 使能Arduino Mega上2个串口。
- PhysicalPixel - 通过从Processing或者Max/MSP发送数据到Arduino上,使LED开关。
- ReadASCIIString - 分析整数里一个用逗号分隔的字符串,来使一个LED灯褪色。
- SerialCallResponse - 通过一个呼-应的方法(握手)来发送多个变数
- SerialCallResponseASCII - 通过一个呼-应的方法(握手)来发送多个变数,并在发送前解码(ASCII)这些数值。
- SerialEvent - 使用SerialEvent()函数
- VirtualColorMixer - 从Arduino发送多个变数到你的电脑,然后在Processing或者Max/MSP上读取这些数据