## **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母口:?
?
MIDI母頭5號引腳用一個220Ω電阻連接到數字引腳1?
MIDI母頭2號連接到GND?
MIDI母頭4號通過220Ω電阻+5V
### **原理圖**

### **代碼**
注意!如果你在用搭載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