概要
XIAO MIDI シンセサイザーのカスタムファームを作って、PC や iOS から鳴らせる超お手軽外部音源にした(BLE/USB MIDI)。
お品書き
- ファームを更新するだけ、BLE MIDI
- 内部ボードを換装して USB MIDI に
はじめに
Seeed Studio から発売された超小型の音楽ガジェット XIAO MIDI Synthesizer を購入しました。
- 公式サイト: Seeed Studio - XIAO MIDI Synthesizer
-
公式Wiki(日本語): XIAO MIDI シンセサイザーの入門ガイド
※恐らくAliExpressで買うのが一番手軽です。
初期ファームウェアでは本体ボタンを使った単体アプリ(メトロノーム等)が入っていますが、PC や iOS(iPhone/iPad)から MIDI データを送信して外部音源モジュールとして活用したかったため、カスタム ファームウェアを作成しました。
本記事では、ハードウェアの特徴から、ESP32C3 を活かした「BLE MIDI」化、さらに XIAO ESP32S3 へ換装しての「USB MIDI」化について記載します。
1. XIAO MIDI シンセサイザーのここがスゴイ!
最大の特徴は、「3Dプリンタ製のシェル(ケース)」と「SAM2695」、「スピーカ」がセットなっているです。
ケース付きですので取り扱いが非常に楽です。
しかも、スピーカ内蔵なので 電源用 USB-C の接続だけで済みます。
また、自作派におなじみの音源チップ「MIDI野郎」と同じ SAM2695 (最大64音ポリフォニー、数百種類の楽器音色)を搭載です。
そんでもって アリエクで 3,500円弱 + 送料です(過去のセールだと 2,500~3,000円くらい)。
つまり、USB-C を繋ぐだけでその場ですぐに再生できちゃう、超お手軽で素敵な MIDI 音源に仕上がっています。
2. カスタム ファームウェアの実装
PC や iOS から接続して一般的な外部音源として認識させるため、2つのアプローチでファームウェアを作成しました。
A. BLE MIDI で鳴らす(XIAO ESP32C3)
標準の XIAO ESP32C3 が持つBluetooth機能を活かし、BLE MIDIに対応させました。
- 作成したリポジトリ: blemidi-esp32c3 (GitLab)
単にデータを流すだけでなく、MIDIのタイムスタンプ(Timestamp)もきちんとパースして反映させる実装にしています。
動作確認環境
- iOS: MIDI Wrench を使用して、問題なくMIDI信号を受信・発音できることを確認しました。
- Windows: Windows では、KORG BLE-MIDI Driverをインストールすると、通常の MIDI デバイスとして認識します。
B. USB MIDI で鳴らす(XIAO ESP32S3 への換装)
XIAO MIDI シンセサイザーはバッテリー非搭載のため、給電用に必ず USB ポートを接続する必要があります。「どうせ USB ケーブルを挿すなら、そのまま電源供給 + USB MIDIデバイスとして1本で完結させたい」と考えました。
しかし、標準の ESP32C3 はネイティブなUSBデバイス(USB OTG)機能を持っていません。
そこで、ピン互換のある上位モデル XIAO ESP32S3 へマイコンごと差し替え、USB MIDI 化を行いました。
※XIAO ESP32S3は、国内なら秋月電子通商等で手軽に安く入手可能です。
- 作成したリポジトリ: usbmidi-esp32s3 (GitLab)
これを書き込むことで、PC に USB 接続するだけで一発で「USB MIDI デバイス」として認識し、爆速で SAM2695 を鳴らせるようになります!
3. 技術的なハマりポイント(超重要)
開発にあたり、かなり泥臭い対応が必要だったポイントが2つあります。特にPC-98エミュレータなどをターゲットにする方は参考にしてください。
i. エミュレータの初期化時、通信速度無視で大量データが降ってくる
PC 側のアプリケーションとして、PC-98エミュレータである Neko Project II などを繋いでテストしたのですが、このエミュレータは起動・初期化時に MIDI の通信速度を完全に無視して、大量のデータを一瞬で送り付けてきます。
通常の OS の MIDI ドライバであれば OS 側がよしなにバッファリングしてくれますが、自作の BLE MIDI や USB MIDI の場合、届いた先からそのまま生データがマイコンへ送り付けられるため、そのまま受けると破綻します。非常にアレな挙動です。過去の自分を殴りたいです。
ii. SAM2695 への転送速度がボトルネックになり、XIAO 側でバッファフルになる
上記のように大量の MIDI シーケンスが一気に流れてきた際、音源チップである SAM2695 へのシリアル転送が物理的に間に合わなくなります。
結果として、手前の XIAO(ESP32C3/S3)側で受信バッファがフルになってしまい、データが溢れて音が化けたりストップしたりします。
あまり長時間ロックすると BLE スタックがアサート(正常動作)するので、このあたり調整するのが今回の開発で一番面倒くさく、過去の自分から20年越しで非道い仕打ちを受けました。
まとめ
XIAO MIDI Synthesizerは、最初から3Dプリンタ製シェルとスピーカーが付いているおかげで、「ちょっと自作ファームを書くだけで、デスクトップ用の超お手軽かつ最強のコンパクトMIDI音源」に変貌してくれます。
