背景
最近、上記記事を書いたが、そもそもM5Stack CoreS3はESP32-S3なのでそれ単体でUSB Hostに対応しているので、USB Hostモジュールなど追加せずとも直接MIDI機器をUSB-Cに挿したらやりたいことができるのでは?とおもいやってみた。
やったこと
やってみたと言っても、ひたすら調べて結果見つけた以下のサンプルコードを焼いてみたらできた。ESP32S2向けのようだが、M5Stack CoreS3でも動いた。
examples/usbhmidi/usbhmidi.ino
サンプルは割とローレベルのUSB実装がメインでMIDI.hのようなMIDIに特化したことはやっていなく、以下のように受信したMIDIイベントのバイト列をそのままログ表示しているだけにとどまるので実際に作る際にはもう少し使いやすくした方が良さそうだ。
uint8_t *const p = transfer->data_buffer;
for (int i = 0; i < transfer->actual_num_bytes; i += 4) {
if ((p[i] + p[i+1] + p[i+2] + p[i+3]) == 0) break;
ESP_LOGI("", "midi: %02x %02x %02x %02x",
p[i], p[i+1], p[i+2], p[i+3]);
}
焼くときはUSB MODEをHardware CDC and JTAGにする (USB OTGにする必要はない)
注意点
これらを実施するとUSB-C Portを機器との接続使ってしまうため、PCでSerialログが表示できなくなる。
例えば、以下のようにしてデバッグする。
- M5StackのLCDを使ってログを表示する(手軽だが表示領域が狭い)
- Serial2にログを出力する。TX pin(M5Stack CoreS3ではG17)をUSB Serial converterのRXに繋いでPCで別ポートとして認識させる
また、M5StackはUSB-Cポートからの給電はしていないのでUSB Hostからの電源供給を前提としている機器は外部から電源供給しないといけないが、給電方法についてもこのサイトのREADMEに書いてある。