Arduino でMIDI を扱うネタはこれまで何度か紹介しています。
今回は Arduino IDE 1.0 でMIDI ライブラリを使う方法を紹介します。
回路はこちらのシールドを使用します。
MIDI 送信は標準のサンプルがあります。
File > Examples > 4.Communication > MIDI
以前のサンプルと異なり、
Serial.print(val,BYTE);
ではなく、
Serial.write(val);
を使っています。
BYTE を指定する書き方は、Arduino 1.0 IDE ではエラーになるので、以前の書き方で作ったスケッチは修正する必要があります。
受信には、MIDI メッセージのパースが必要なので、ライブラリを使います。
MIDI のライブラリは Arduino Playground で紹介されている Arduino MIDI Library と、以前紹介した Tymm's MIDI Library などがあります。
Playground の MIDI Library v3.1 はまだ1.0 対応していないようです(簡単な修正で使えます)。
Tymm's MIDILibrary は1.0 テスト版があるので、こちら紹介します。
サンプルコードは MidiSendExample、MidiReceiveExample、MidiPneumaticsExample があります。
(Pneumatics は内容が良くわかりません。)
MidiReceiveExample を使ってみましょう。
MIDI の送信は iOS アプリとMIDI アダプタを使って、iPod Touch から行ないます。
このサンプルは Note On メッセージで LED On、Note Off でLED Off という簡単なものです。
これは、MIDI 対応 鍵盤アプリを使って簡単に試す事が出来ます。(例えば bs-16i など)。
次に、MIDI スライダーを使って、LED の明るさをコントロールしてみましょう。
スライダーが使える iOS アプリの Touch OSC または、MIDI Monitor などを使います。
MIDI Monitor の Mixed Control では CC #11 からCC #16 がスライダーに割り当てられています。
Touch OSC の Simple Layout はCC #0からCC #3 が スライダー(縦)に割り当てられています。
CC (ControlChange) メッセージ を受け取るには、handleNoteOn, handleNoteOff などにつづいて、handleControlChange を実装します。
(コメントアウトされた状態で用意されています。)
例えば
void handleControlChange(unsigned int channel, unsigned int controller, unsigned int value){
if (controller==0 || controller==11){
analogWrite(3, map(value,0,127,0,255));
}
if (controller==1 || controller==12){
analogWrite(5, map(value,0,127,0,255));
}
if (controller==2 || controller==13){
analogWrite(6, map(value,0,127,0,255));
}
}
この例では、CC #0 またはCC #11 で 3番ピンを、CC #1 または CC#12 で 5番ピンを、 CC #2 または CC #13 で6番ピンを、それぞれ PWM 制御しています。
PWM の使えるピンは 3,5,6,9,10,11 の6本なので、これらのピンを使ってRGB 制御をすることができます。(→こちらの記事参照)
MIDI で送るデータは、0から127 の128 段階なので、map 関数で0から255 に範囲を変えています。(128段階なのは変わりません)
Note On/Off や ControlChange 以外のMIDI メッセージもこのライブラリで扱う事が出来ます。
何を何に割り当てるかは自分で自由に決められるので 本来のMIDI の枠に捕われずに使って良いと思います。