概要
昔からMIDIを触りたいと思って、いろいろ準備していたのですが触れずじまいでした。ESP32-S3を入手してUSB HOSTが使えましたので、いろいろなインターフェースでMIDIを触っていきたいと思います。
MIDIとは?
楽器を連携させるための信号の規格で、電子ピアノなどにMIDI端子がついていたりします。
- MMA Technical Standards Board/ AMEI MIDI Committee(一般社団法人 音楽電子事業協会)
上記に通信部分の電気的仕様です。基本的には31,250bpsのシリアル通信になります。最近だと31Kbpsは比較的遅いシリアル通信となります。
MIDIケーブルを利用したMIDI以外にも、最近の機材はUSBケーブルを利用したUSB MIDIの方が一般的です。そしてBluetoothを利用してのワイヤレス接続もできるようになってきています。通信方法はいろいろありますが、中身はシリアル通信になりますので非常にシンプルなプロトコルとなっています。
BLE-MIDIは上記で実験したことがあったので、今回はUSB MIDIにチャレンジしたいと思います。
予備実験

用意した機材です。USB MIDIキーボードにSC-88音源、スピーカーにMIDI Unit for GROVEになります。
MIDIキーボード
たぶんこのキーボードになります。中古のを適当に購入したのでなんでもいいと思います。
MIDI音源
SC-88Proは購入できなかったので、SC-88にしました。ただ最近起動してみたら動かなくなっていました。昔は初期化すれば動いたのですが、ついに故障してしまいました。。。
PCに接続すればMIDI音源は必要ないのですが、動作確認に便利だったので準備はしていました。
MIDI Unit for GROVE
- MIDI Unit for GROVE(スイッチサイエンス)
necobitさんのGroveケーブルからMIDIケーブルに接続するためのユニットです。ここの部分も自作したかったのですが、まずは確実に動くものを準備しました。
USB MIDIケーブル
これも持っていました。こちらを使うことでパソコンと接続可能ですのでパソコン上のMIDI音源やキーボードなどからMIDIを操作することが可能です。
ESP32-S3
上記のボードなのですが、今現在秋月さん以外では技適マークつくのボードが購入できません。
- ESP32-S3-DevKitC-1(秋月電子)
上記のボードを購入しています。
実験
上記のように動かすことができました。これはUSBキーボードをESP32-S3で入力し、MIDIケーブル経由でSC-88を鳴らしています。

構成的にはUSB MIDI (←USBケーブル→) ESP32-S3 (←GROVE→) MIDI Unit (←MIDI ケーブル→) SC-88と接続しています。
利用ライブラリ
- ESP32 S2 USB Host Jumpstart(touchgadget)
上記ライブラリを利用させていただきました。ポイントとしてESP32-S3-DevKitC-1のボードにあるUSB端子は5Vが出力されていません。そのためUSBキーボードに電源供給されませんので、電源だけ違うポートから取得するか、上記みたいにUSBポートは使わずにピンから直接USBポートに接続する必要があります。
実験基板にしてみた

さすがに配線だら~んで良くないので、実験用に基板を作成してみました。左側の基板はESP32-S3-DevKitC-1の端子を拡張しているだけの基板となります。5Vに接続されているUSB端子を最初から用意しつつ、Grove端子もつけました。そして上の方にボックス型のコネクタがありますが、ここがPicoScopeのロジックアナライザに接続できるようになっています。

これは非常に便利で、上記みたいにフラットケーブルを接続することで主要な16種類の入力をすぐに確認することができます。上記はUARTのデコードをしていますが、すぐにデータを確認できるのはやっぱり便利でした。オシロスコープでも確認できるのですが、トリガーがかかった瞬間だけ表示されていて、すぐに画面から消えてしまうので不便でした。
さて、このツール便利でしたがシリアルデコードのところが電流バッファになっています。なんで電流なのかと思ったのですが変更したら「すべてのバッファ」になりました。つまり電流バッファは「current buffer」で、現在のバッファが正しい訳になります。この誤訳はよくやりがちですよね。

右側にあるのが自作基板になります。Grove端子付きのMIDIコネクタです。必要な端子だけ接続することが可能です。
下のカラフルなブロックは上記の製品で、レゴブロックやテクニックに接続することができます。穴があるのでネジ止めも可能で非常に便利です。横連結も可能なので3つ連結してみました。
ただ、、、きれいにできていますがうまく動きません。。。OUTは適当でいいやと思って、電源5Vのまま信号を3.3Vで送信しましたが、データが化けてしまってうまくいきませんでした。ちゃんと電源3.3Vに落とさないとだめですね。同じ理由でスルーもダメでした。受信はうまく動いたのですが、よくよく考えるとGNDも接続してしまっているのでMIDI的にはNG基板です。
こちらはもう少し見直して基板作り直しになります。
まとめ
とりあえずESP32-S3の基板側は成功して、配線がきれいになったので嬉しいです。MIDI端子側はもう少し見直しが必要です。
あとライブラリについて少し使いにくいところがあるので自作する予定です。それほどボリュームがないので参考にしつつスクラッチで組み直し予定になります。ArduinoのMIDI制御についてはArduino MIDI Libraryという、有名なライブラリがあるので同じ利用方法で使えるライブラリにしようと思っています。
コメント
いつも参考にさせて頂いております!
ESP32-S3を使用して、USB MIDIデバイスが作れないかなぁと考えているのですが、
こちらの記事では、ESP32-S3をUSB HOSTとしてお使いになっているので、
MIDI INに相当するのかなと思いますが、
USBをMIDI OUTとして使うこともできるのでしょうか??
何卒よろしくお願いいたします。
できます!
中身はシリアルの入出力なのでどちらの方向にもできるはずです
ただし、、、ライブラリとかの整備はすすんでいません、、、
Since you are using an ESP32-S3, I’m wondering why you don’t use one of the 2 USB-C ports to connect the keyboard?
Are you using pins 19 and 20 instead?
in your library EspUsbHost, are we supposed to connect a USB adapter to pins 19 and 20 (USB D+ and USB D-)?
Thanks
Power is not connected to the USB OUT of ESP32-S3-DevKitC-1.
A USB host must output power to the device.
https://github.com/Freenove/Freenove_ESP32_S3_WROOM_Board
If it is a Freenove board, you can connect it as is.