## **MIDI音乐**
> 本例向你展示如何从Arduino或Genuino板通过**标准5端子DIN接口**(standard 5 poles DIN)发送MIDI音符标准发送到MIDI乐器。
MIDI是**乐器数字接口**(**Musical Instrument Digital Interface**)的简称。它是用来控制电子合成器、编曲机以及其他乐器的一个很有用的协议。MIDI设备主要分为两个大类:第一类是控制器(换句话说就是根据人类操作生成MIDI音符的设备)。第二类是合成器(包括采样器、编曲机等等诸如此类),合成器读取MIDI数据来发声、发光或者产生其他效果。
MIDI其实是一个串口协议,在**比特率** 31250bit/s工作。板子内置的串口(包括MEGA板)能够以这个速率传输数据。
MIDI **字节**(byte )可以被分为两种:**控制字节**和**数据字节**。控制字节值一般都>=128(十六进制0x80-0xFF)。数据字节值一般都在0到127之间(十六进制0x00-0x7F)。控制字节包含了音符播放、音符停止、滑音等诸如此类。数据字节则包含单个音符的音调、速度或者音符的强弱(响度),滑音的量等诸如此类。想要了解更多关于MIDI的细节,请参看互联网上的各种MIDI协议说明书。
MIDI数据通常以十六进制计数,因为MIDI banks和MIDI乐器都用的是用16进制
想要了解更多关于MIDI,你可以了解下[introduction to MIDI ](http://www.tigoe.net/pcomp/code/communication/midi)或者[这个例子](http://itp.nyu.edu/physcomp/Labs/MIDIOutput)。
### **所需硬件**
Arduino Uno板或Genuino Uno板
MIDI母接口
2个220Ω电阻
跳线
可用的MIDI设备(可选,为了测试)
连接线
### **电路**
根据MIDI协议要求,所有的MIDI接口都应是母口。
下面展示如何连接MIDI母口:
![图片来自官网](http://img.blog.csdn.net/20160512173831258)
MIDI母头5号引脚用一个220Ω电阻连接到数字引脚1
MIDI母头2号连接到GND
MIDI母头4号通过220Ω电阻+5V
### **原理图**
![图片来自官网](http://img.blog.csdn.net/20160512173858232)
### **代码**
注意!如果你在用搭载ATmega32U4型号处理器的板子(比如DUE或者Leonardo),请不要用Serial(TX0/RX0),而应使用Serial1(TX1/RX1),在下列代码中也要把Serial改为Serial1。
~~~
/*
MIDI音乐
本例向你展示如何是用1号引脚(串口传送引脚)来发送MIDI音符数据。
如果将MIDI乐器连上MIDI乐器,Arduino就会不断的“弹奏”F#-0 (0x1E)到F#-5 (0x5A)的音阶。
电路搭建:
* MIDI母头5号引脚用一个220Ω电阻连接到数字引脚1
* MIDI母头2号连接到GND
* MIDI母头4号通过220Ω电阻+5V
连接MIDI线到接头上,并且把MIDI线插上乐器。然后就享受Arduino演奏家的奇妙旋律吧!
代码是公开的
*/
void setup() {
// 给串口设置MIDI的波特率:
Serial.begin(31250);
}
void loop() {
//从F#-0 (0x1E)弹到F#-5 (0x5A):
for (int note = 0x1E; note < 0x5A; note ++) {
//在参数一传入了channel 1 (0x90),参数二传入了一些音符值 (note), 参数二传入了silent 速度(0x00):
noteOn(0x90, note, 0x00);
delay(100);
}
}
// 弹奏音符,请不要尝试给第一个参数cmd传入任何大于127的值:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
~~~
### **相关资料**
[serial.begin()](https://www.arduino.cc/en/Serial/Begin)
[for()循环](https://www.arduino.cc/en/Reference/For)
- 说明
- 系统示例文件目录结构及说明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (与特定硬件相关,暂无)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暂无)
- ArduinoISP