2018年4月25日水曜日

Arduino MIDILibraryを使ってみる。

自作のシンセをPCのDAWからコントロールできないかと思ってマイコンのMIDIライブラリを調べてみました。

わたくしが使えるデバイスはArduino、Nucleo(mbed)、PSoC5LPなので一通り当たってみました。

Arduino


開発環境がこなれているので一番信頼しています。←だいたいすでに誰かがやってくれている。

オフィシャルサイトのPlaygroundにMIDILibraryがあります。これは基本的にはシーケンサーやMIDI機器とMIDIケーブルで接続してArduinoと通信するライブラリです。

Midi Firmware for Arduino Uno (Moco)というファームウェアもあって、MIDILibraryと組み合わせればusb midiとして使えるそうです。

参考「超簡単!Arduino UNOをMIDIコントローラーにしよう! <Arduino MIDI Library 4.2対応版>

ただしMocoはオフィシャルのArduino UnoのようにUSB-Serial変換にATMega8U2/16U2を用いているものしか使えません。互換品はUSB-Serial変換にたいがいCH340を使っているのでMocoは使えません。

オフィシャルのArduino Unoも持っているのですが、ATMega16U2のファームウェアを書き換えるので、下手して動かなくなったらいやなので保留(^q^;

互換品でも「Elegoo UNO R3 ボード」や「keyestudio UNO R3 開発ボード」はUSB-Serial変換にATMega16U2を搭載しているようです。←持ってないので未確認です。


mbed


mbedにもArduinoから移植されたMidiLibraryがあります。

また、オフィシャルサイトのCookBookにUSBMIDIライブラリがあります。手軽そうでいいのですが、ターゲットにNucleo F446を指定してコンパイルすると
Error: #error directive: "CMSIS Target not recognised" in "extras/mbed/cmsis.h", Line: 16, Col: 3
というエラーが出てコンパイルできませんでした。ライブラリのソースをチラ見すると「LPC_USB」というオブジェクト名が出てきてLPC専用なのかもしれません。

LPCもトラ技の付録のライターを持っているのですが(参考「トラ技ARMライタでLチカ (LPC810)」)全然使っていないのでこれも保留。

PSoC5LP


PSoC5LPにもUSBMIDIがあるようです。

参考「USBMIDI of PSoC5LP 」「CE95395 - USB MIDI with PSoC 3/5LP

Arduino MIDILibraryを使ってみる。


というわけで、まずはArduinoのMIDILibraryを試してみることにしました。フォトカプラを使ったMIDI受信は以前簡単に試したことがあります。

MIDI信号を受信する TLP552編(メモ)

BASIC_IO


Arduino IDEにMIDILibraryをインストールしてExample/BASIC_IOを動作させました。

ブレッドボード配線図


<追記:2018.04.28>

Arduinoへのプログラミング中にMIDI信号を受信すると書き込みに失敗するので、プログラミング中はD0とフォトカプラ間のケーブルは抜いておいた方がいいです。

</追記>

MIDI信号はPCのAbleton LiveからTASCAM US-144MKIIに出力し、MIDIケーブル経由でフォトカプラ(TLP552)で受信しました。

Ableton Liveの設定は下図の通りトラックの「MIDI To」で送信するデバイス(TASCAM US-144MKII)とMIDI Ch.に4を指定しました。←BASIC_IO Exampleはch.4を受信するように書かれています。


MIDIシーケンスはBPMに60を指定し、1小節目の1拍目にC3を1発出して、2秒に1回MIDI信号が送られるようにしました。BASIC_IOはMIDI信号を受信すると1秒間LEDを点灯させるので、これで2秒に1回の周期でArduinoのLEDが点滅します。

また、RX(D0)にMIDI信号を受信したとき、TX(D1)からプログラムに書かれている通りのMIDIメッセージが送出されます。

MIDI送受信のようす

ch1:MIDI IN(D0)  ch2:MIDI OUT(D1)


SimpleSynth

受信したMIDI信号の音階をArduinoのtone()関数で再生するものです。

ブレッドボード配線図


D10にスピーカーをつないで、無事チープなメロディーが再生されました(^q^/

※普通のスピーカーをつなぐと爆音になると思います。実験用に低効率のスピーカーをつないでいます。

こちらは送出側のMIDI Ch.を1にしないとダメなようです。

<追記:2018.04.28>

MIDILibraryのMIDI.hを見ると

public:
    void begin(Channel inChannel = 1);

となっていて、引数を省略してMIDI.begin()するとCh. 1を指定したことになるようです。

その他@yudai220さんの「Arduino MIDI Library の使い方」でかなり詳細に解説されています。

</追記>

D13にGate信号も出力されているので(LEDの点滅に利用されています)、CV出力用にDACをつなげれば、これだけでMIDI-CV/Gateコンバーターになりそうな感じです。

メモ:


MIDIに限ればDominoというフリーのシーケンサーがあって、こちらの方が慣れればAbleton Liveより使いやすいかも?