わたくしが使えるデバイスは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とフォトカプラ間のケーブルは抜いておいた方がいいです。
</追記>
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より使いやすいかも?
0 件のコメント:
コメントを投稿