以前、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の出番はかなり減るかもしれないですね。