GitHubにサンプルがあるのでカンタンに作れそう。そう思ってたけど、けっこう大変だった。使っているのはAdafruit Feather 32u4 Bluefruit LE。BLEまわりはシリーズ共通っぽい。ライブラリが同じだ。
まず、毎回ペアリングが必要になる。いったん作ったデバイスの電源を切ると、再度接続してくれない。WindowsのBluetoothの設定でデバイスを削除してから、再度ペアリング。そんな手順が必要になる。
そんなデバイスもあったよなあ。と思ったのだけど、このデバイスは自分でプログラミングできる余地がある。いろいろ試したところ、 ble.factoryReset() を削除すると、自動的に再接続することを発見。これで数時間を費やした。
もうひとつの問題は未解決。3バイトのMIDIメッセージしか受け付けない。ノートオン/オフ、コントロールチェンジはOK。しかし、プログラムチェンジはだめだ。2バイトのメッセージがだめ。1バイトもだめだ。
ノートオンは、 midi.send(0x90, 60, 127) でOK
じゃあ、プログラムチェンジは midi.send(0xC0, 10) でいけると思うじゃないですか。なぜか10と0の値のプログラムチェンジが2つ送られる。
ライブラリのソースを見るとそもそも3バイトメッセージ決め打ちで作られてるっぽい。それじゃあと、2バイトでいけるメソッドをクラスに追加してみるのだけど、それは無視。何もメッセージが送られてないっぽい。その先のATコマンドを受ける側に問題があるっぽい(よくわかってないけど、そんなイメージ)。
Midi Program Change or 1 byte messages not sent or read #52
MIDI Transmit does not handle 2 byte messages #29
その先を探ろうにも、自分の知識では無理なのだった。考え方を変えて、sendのパラメーターをいろいろ変えてみたところ、midi.send(0xC0, 10, 10) みたいな感じでやればいいと気づいた。これだと、プログラムチェンジの10が2回送られる。無駄にメッセージを送ってることになるけど、とりあえず音色を変えるという目的は達成できる。なんともしょぼい対応策だけど、ライブラリのソースに手を加える必要もない。
ちなみに、受信側も3バイトメッセージしか受け付けてないっぽい。GitHubのISSUEにもだいぶ前から上がってるのだけど、長いことなんの対応もされてないっぽい(ユーザーからの提案も出てない)。もう少し探してみたり、試したりはしてみるけど。どうなるかなあ。2年以上積んでおいたデバイスだけど、せっかくなのでこの機会にいろいろ試してみる。とりとめなく終わる。
コメント