chakokuのブログ(rev4)

日々のごった煮ブログです

BLEを理解してMIDIコントローラを作りたい

MicroPythonでBLEのローレベルの実装がなされている。MIDI over BLEを理解して、できることなら、ボリュームやスイッチが一杯付いたMIDIコントローラ(BLE接続)を自作したい(MicroPython+ESP32で)。

手始めに、BLE接続可能なMIDI楽器(KorgのMicroKey AIR)を見つけられるか?やってみた。
ESP32+MicroPythonの組み合わせでBLE.gap_scan()を実行した
結果:
スマフォだとMicroKeyAirを見つけられるが、MicroPythonのBLEライブラリでは見つけられず。あるいは、Connectしてもらず。なぜだろうか。。BLE.gap_scan()では複数のBLEサーバを見つけられるのだが、どれがMicroKeyAirの電波かもわからない。MicroKeyAirはどんなパケットをAdvertiseしているのか不明。他のBLE機器が邪魔なので、ESP32とMicroKeyAirを銀紙で巻いて電波暗室にして、BLEの電波が一つになるよう絞って調査するか。。

ちゃんとしたSnifferでないとmicroKEY AirからどんなAdvertising Packetが出ているのか把握できないので、手段もないのでローレベルでの調査はやめて、、、ひとまず、先行事例のOpen MIDI Drum等をESP32 + Arduinoで動かしてみる。

今後の取り組み:
BLE用Snifferを買って実際に飛んでいるパケットを見てみる。推測だけど、、認証オプションが有効なようで、認証(鍵交換?)の所で何か問題になっているのではなかろうか。。

■以下資料と参考記事URL
service と characteristic のUUID定義

• MIDI Service (UUID: 03B80E5A-EDE8-4B33-A751-6CE34EC4C700)
• MIDI Data I/O Characteristic (UUID: 7772E5DB-3868-4112-A1A9-F2669D106BF3)
• write (encryption recommended, write without response is required)
• read (encryption recommended, respond with no payload)
• notify (encryption recommended) 

関連資料

ROHM社のBLE解説記事
基礎知識 | ROHM TECH WEB

BLE Docs



ESP32を使ったBLEの実験と解説。この記事をちゃんと読めばEPS32上でBLEを動かす方法が分かるはず
ESP32・BLE通信

GATTの仕様書一覧
ガット仕様 |ブルートゥース®テクノロジーウェブサイト
ガットサービス |ブルートゥース®テクノロジーウェブサイト

UUID
UUID詳細


MIDI over BLE の仕様解説、仕様書
MIDI over BLE - v2.13 - Bluetooth API Documentation Silicon Labs
Bluetooth LE MIDI Specification

micropython/examples/bluetooth at master · micropython/micropython · GitHub

Bluefruit LE Snifferを使用したBLEプロトコル解析 | TomoSoft

DSAS開発者の部屋:技適マークつき BLE パケットスニファを入手する

MIDI over BLEによる楽器例:MIDI Drum 等
ESP32でBLE MIDIを使う - Open E-drums
ble-midi/BLE-MIDI_BUTTON5.ino at master · kuwatay/ble-midi · GitHub

MicroPythonのBLEライブラリによる温度センサー実装例
micropython/ble_temperature.py at master · micropython/micropython · GitHub

ESP32版Arduiono BLEのサンプルコード
ESP32_BLE_Arduino/examples at master · nkolban/ESP32_BLE_Arduino · GitHub

micropython/examples/bluetooth at master · micropython/micropython · GitHub

■ご参考URL
詳しくは分からないけど、BLE MIDIの楽器類はEncryptionオプションが有効になっていて、このオプションがMicroPython版 BLEライブラリで正しく処理されないためにDiscover/Connectでうまくいかないのではなかろうか。。
ble support and encrypted characteristics · Issue #5174 · micropython/micropython · GitHub


MIDIberry (MIDI over BLEに対応)

CircuitPython — Adafruit CircuitPython 0.0.0 documentation
_bleio — Bluetooth Low Energy (BLE) communication — Adafruit CircuitPython 0.0.0 documentation
Adafruit_Learning_System_Guides/powerglove_ble_midi.py at master · adafruit/Adafruit_Learning_System_Guides · GitHub

GitHub - skratchdot/ble-midi: A Bluetooth Low Energy MIDI library written in javascript
ble-midi/Apple-Bluetooth-Low-Energy-MIDI-Specification.pdf at master · skratchdot/ble-midi · GitHub
ble-midi/rp52public.pdf at master · skratchdot/ble-midi · GitHub

CircuitPythonではEncryptedオプションに対応しているようである。。
https://learn.adafruit.com/bluetooth-le-hid-volume-knob-with-circuitpython?view=all