Serial/USB/BLE/Wifiをつなげる ESP32+32U4/MIDIインターフェース実験レポート
ArduinoのMIDI関連ライブラリが充実してきましたのでESP32と32U4ボードをSPI通信でつなげてみました。
SerialMidi/USBMidi(32u4)<-SPI->(ESP32)BLEmidi/rtpMIDI
両ボードに対のHardSPIとSoftSPIを組んでサークルバッファで受けてそれぞれのライブラリにパースしています。
ProMicroはSSpinがLEDになっています。写真でもうっすら見えますがそこに直接接続してもうまくいきました。
ProMicroはDean Camera様のHidBootloaderで書き換えています。
MidiOxでは、どれか1つ、例えばSerialMidiにコードを送るとほかの3つのディバイスからコードが帰ってきます。
MIDIファイルををUSBMIDIに送りSerialMidiにPitchChangeを送ると合成されたデータがBLEMIDIとrtpMIDIからでてきます。
最初すべてにループバックコードかいて試したらループが止まらなくなりクラッシュしました。入れるならSerialだけにしましょう。
3.3Vの32U4ボードにすれば5V/3.3V変換ICが省けていいかもしれません。
BleでMTCコードの出力は処理速度が追い付かずクラッシュしたので1/8のコードに間引きしました。MIDIクロックはレイテンシーはありますがクラッシュはしませんでした。
Bleはレイテンシーを確かに感じますがMidiOxのKeyboradで5和音以上いけました。
BLEドライバーは再起動後自動認識されますがそれでは動かず、一旦OFFにして再度認識させる必要があるようです。
rtpMIDIはレイテンシーもあまりなくスムーズです。
SysExのアウトはBleで4000byte、rtp16000byte(要libraryMod)位までいけした。USBとシリアルはライブラリのおかげで結構長いSYSEXでも大丈夫なようです。
この4000byteというのはスタックメモリサイズかなと思いDualCoreを試してみましたが、うまくいかず今後の課題としました。
自前のWebMidiApiでも認識できましたがBLEとUSBはドライバの仕様で1つのアプリでしか使えないようです。LoopMidiでアプリ間は回すことはできるでしょう。ちなみにUM-1はROLANDのUSBMIDIインターフェースで32U4のSerialMidiがここにつながっています。
Serial Midi ~Uno 32U4
Midi規格が網羅されています。基本はMIDI 1.0規格書はMIDIコードについて網羅されています。
またハードウェアについてはMIDI 1.0 電気的仕様改訂(日本語版)は必読、3.3VのMidi回路も規格化されています
dkadriosさんArduino Midi Library Mod版をお勧めします。LongSysExが扱えます。
Arduino Midi Library の使い方を詳しくまとめてくださっています。
USB Midi ~ 32U4
Teensy2.0(32U4)でOSのMIDIドライバを使いUSBMIDIインターフェース作成可能です。
LeonardoでOSのMIDIドライバを使いUSBMIDIインターフェース作成可能です。
BLE Midi ~ ESP32
BLE- Midiの規格書です。ややこしい仕様になってますので必読です。
こちらのコードとkorgのBle Midi driverでWINDOWS10で動作しました。
ESP32ではないのですがBLEmidiのコードがありBLEデータからMIDIにパースするとき参考にしました
RtpMidi AppleMidi ~ ESP32
AppleMidiのdriver規格書です。
RFC4695 RTP Payload Format for MIDI(日本語)_PENTAN様
AppleMidiのコード規格書です。こちらもややこしい仕様でして必読です。
WindowsでWIFIでMidiがつかえるドライバです。
lathoub/Arduino-AppleMIDI-Library
rtpMIDIとあわせてWIFIでMidiがつかえるESP32のライブラリです。もちろんAppleMIDIでも使えます。
MIDI回路 | フォトカプラ
汎用 4 ピンフォトカプラを使った MIDI 入力
秋月、売切れの高速フォトカプラPC900の代替案を提示してくれています。凡庸フォトカプラ代替でもばっちり動きます。