ヤマハのポータブルキーボード PSS-A50を今年1月に購入し、いろいろと改造をしながら使用している。お気に入りの一台だ。
現在までに
- MIDI OUTジャック増設
- モバイルバッテリーの内蔵化
- 電池ボックスの撤去
を施した。
今回はBLE MIDI機能を追加し、スマホやタブレットにワイヤレスで接続できるようにしてみる。
使うもの
ESP-32マイコンボード
安価かつ入手しやすいこと、Arduinoで気軽に開発できることからESP-32を採用。Wi-Fiは使用しないので、スペースや消費電力の制約があればnRF52を使ったかも。
AliExpressなら400円くらい。Amazon.co.jpでも800円くらいで買うことができる。
Arduinoで使うときはボードマネージャーでesp32を導入した上でDOIT ESP32 DEVKIT V1を選択する。
FortySevenEffects/arduino_midi_library
ArduinoでMIDIを扱う用のライブラリ。これ自体には古典的なUARTによるトランスポートしか実装されていないが、追加のライブラリで拡張が可能。
Arduino LeonardoやProMicroといった32U4系のボードならUSB MIDIも使える。
lathoub/Arduino-BLE-MIDI
arduino_midi_libraryでトランスポートにBLE MIDIを使えるようにするライブラリ。
リリース版をArduinoのボードマネージャーからインストールしたところ、動作が安定しなかったので、GitHubから最新のものをダウンロードして使用。
h2zero/NimBLE-Arduino
BLEを使うのに必要なライブラリ。
適当な線材と工具
工具箱にあったものを使用。
やっていく
ライブラリのコード例をコピペしつつ、それっぽく書いていく。
コード
#include <BLEMIDI_Transport.h> #include <hardware/BLEMIDI_ESP32_NimBLE.h> // トランスポートのインスタンス名は「BLE + BLEMIDIのインスタンス名」になるので注意(BLEmidiHost) BLEMIDI_CREATE_INSTANCE("PSSA50", midiHost) MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midiKey); bool isConnected = false; void setup() { Serial.begin(115200); Serial.println("pssa50_ble"); midiKey.begin(); midiHost.begin(); // (同じインターフェースのIN-OUTの)スルーを無効化 midiHost.turnThruOff(); midiKey.turnThruOff(); // 全チャンネルのメッセージを受信 midiHost.setInputChannel(MIDI_CHANNEL_OMNI); midiKey.setInputChannel(MIDI_CHANNEL_OMNI); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); BLEmidiHost.setHandleConnected(OnConnected); BLEmidiHost.setHandleDisconnected(OnDisconnected); Serial.println("ready"); } void loop() { if(midiKey.read()&&isConnected){ midiHost.send(midiKey.getType(), midiKey.getData1(), midiKey.getData2(), midiKey.getChannel()); //Serial.println("message from keyboard."); } if(midiHost.read()&&isConnected){ midiKey.send(midiHost.getType(), midiHost.getData1(), midiHost.getData2(), midiHost.getChannel()); //Serial.println("message from host."); } } void OnConnected() { isConnected = true; digitalWrite(LED_BUILTIN, HIGH); Serial.println("ble connected."); } void OnDisconnected() { isConnected = false; digitalWrite(LED_BUILTIN, LOW); Serial.println("ble disconnected."); }
個人的にはBLEMIDI_CREATE_INSTANCEマクロの取り扱いで少しハマってしまった。トランスポートのインスタンス名は「BLE+このマクロで付けた名前」になるようだ。
結線
例の空きランドとボードのTX2/RX2を結線する。電源は近くのヒューズから3.3Vを横取りした。
動作確認
iPhone
GarageBandで使ってみた。設定画面からすんなり接続できた。⚙ > 曲の設定 > 詳細 > Bluetooth MIDIデバイス から毎回接続する必要がある。
キーボードはTouch Instrument画面でのみ反応し、トラックビューやピアノロール編集では反応しない。
Android
FL Studio Mobileで使ってみた。起動するだけで勝手に接続された。
Windows
当然だが、Bluetooth LEに対応したハードウェア(Bluetooth 4.0以上)が必要。
Windowsの設定でペアリング後、MIDIberryというアプリでBLEMIDIと通常のMIDIをブリッジし、loopMIDIというドライバで接続することで、一般的なMIDI対応のアプリから使用できるようになる。
接続がいまいち安定せず、使い勝手もあまりよくない。
感想
百均の水回りコーナーにある両面が吸盤になっているシートでスマホを固定するといい感じ。
37鍵のキーボードを使うだけなら問題は無いが、まともなMIDIシーケンスを流そうとすると発音が数秒以上遅れ、テンポもゆっくりになってしまう。BLE MIDIという規格自体の限界か、調整不足かは不明だ。複数のつまみを同時にグリグリ動かすとかならWi-Fi経由でAppleMIDIを使ったほうが良さそうだ。
せっかくESP-32を付けるのだから、もっと機能を増やしてみたいところ。