Loading...

Learning   Examples | Foundations | Hacking | Links

Examples > Communication

MIDI Note Player

本教程展示如何用Arduino来播放MIDI音符。

MIDI, the Musical Instrument Digital Interface, 是一个非常有用的协议,能够用来控制 合成,时序,和其他音乐设备。 MIDI设备一般分为两大类:控制器(即基于人类活动产生的MIDI信号的设备)和合成器(包括采样器,音序器,等等)。后者接收MIDI数据,能够产生使声,光,或是其他一些效果。

MIDI是一个串行协议,波特率为31250 bps 。Arduino自带的串口(包括MEGA),都可以发送此波特率的数据。

MIDI流分为两种类型:命令字节和数据字节。命令字节一般是128或更大的数,16进制中表示为 0x80到0xFF。数据字节一般小于127,16进制中为0x00 到0x7F。命令字节包括诸如note on,note off,pitch bend等。数据流包括音符的音高,速度,响度和 amount of picht bend等等。如果需要了解详细的信息,请参阅MIDI规范MIDI Protocol Guides

由于MIDIbank和设备以16为基数分组,所以MIDI数据一般表示为16进制。

了解更多请看这里 MIDI介绍 或者这个 示例.

硬件需求

  • Arduino 板
  • (1) MIDI 接口
  • (1) 220 欧姆电阻
  • 连接线
  • MIDI设备 (可选, 测试用)

Circuit

MIDI的规范规定所有的MIDI连接器都是母头,下面讲解如何将MIDI连接器和Arduino连接起来

  • Arduino 的digital pin 1 连接到 MIDI 接口的 pin 5
  • MIDI 接口的 pin 2 连接到地GND。
  • MIDI 接口的 pin 4 串联一个220欧姆的电阻后连接至+5V。

点击图片即可看到大图

图片是用软件 Fritzing画的. 需要看到更多的电路图例子,点这里Fritzing project page

原理图

点击图片即可得到大图

click the image to enlarge

Code

/*
 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 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.
 
 http://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);
}

See Also: