以前、Qiitaにて「Bluetooth MIDI によるモバイルとデバイスの相互通信 」という記事を書きまして、そのときはArduinoと専用のBluetooth MIDI 基板を組み合わせた方法で実現しましたが、その後の調査で、ESP32とライブラリを使えばもっと簡単に実現できるようで、、試してみました。
ESP32側(ペリフェラル)
環境の構築
以前に入手していた評価ボードESP32-DevKitC-V4
を使用しました。
PCに繋ぎ、Arduinoの開発環境にて、以下の設定を行います。
(詳細は、別の詳しく書かれているブログを参照してください)
ボード:ESP32 Dev Module
を選択
ライブラリ:BLE-MIDI を追加
プログラム
ESP32側は、以下のプログラムを書き込みます。
#include <BLEMIDI_Transport.h> #include <hardware/BLEMIDI_ESP32.h> // BLEデバイス名のセット BLEMIDI_CREATE_INSTANCE("BLEMIDI test", MIDI) void setup() { // シリアルモニタ用 Serial.begin(115200); // BLE MIDIの接続/切断時のコールバック BLEMIDI.setHandleConnected(OnConnected); BLEMIDI.setHandleDisconnected(OnDisconnected); // MIDIインスタンスの初期化 MIDI.begin(); } void loop() { uint8_t channel; uint8_t data1; uint8_t data2; // MIDIメッセージの取得(チャンネル1) if (MIDI.read()) { switch (MIDI.getType()) { case midi::NoteOn: Serial.print("NoteOn "); break; case midi::NoteOff: Serial.print("NoteOff "); break; case midi::ControlChange: Serial.print("ControlChange "); break; case midi::ProgramChange: Serial.print("ProgramChange "); break; } channel = MIDI.getChannel(); data1 = MIDI.getData1(); //note number (for note off/on) data2 = MIDI.getData2(); //velocity (for note off/on) Serial.print(channel); Serial.print(" "); Serial.print(data1); Serial.print(" "); Serial.print(data2); Serial.println(); } } // BLE MIDIの接続時のコールバック void OnConnected() { Serial.println("OnConnected"); } // BLE MIDIの切断時のコールバック void OnDisconnected() { Serial.println("OnDisconnected"); }
iOSアプリ側(セントラル)
Qiitaの記事で紹介したiOSのサンプルアプリを使用します。
「Central」ボタンをタップして、以下のようにESP32のデバイスが見つかれば、選択して接続します。
確認
iOSアプリのSend欄のボタンをタップすると、Note on/off が送信されます。
Arduinoのシリアルモニタにて、Note on/off が検出できていれば、MIDIメッセージの受信が成功しています。
このように、ESP32ではBLE MIDI経由でのMIDIメッセージの受信が非常にシンプルに実現できました。
Arduinoの出番はかなり減るかもしれないですね。