AndroidのBluetoothLE、なにかと不安定であるといわれますが、私のコードはそこそこ安定するようになってまいりました。
BLE-Midi 1.0 での実装例としてご参考にどうぞ。
ロジックは他の方のOSSを拝借して、より、低階層のハードウェアよりの実装を頑張りました。
https://github.com/syntaro/midione-android
I almost made it.Bluetooth LE, Android 10 to 16, MIDI1.0.Very stable and good response.
Thank you. Apache2.0 License. Feel free to use it.
Have a nice day.with BLE Computing.
@kshoji さんのものに2年ちかくのテストを重ね改善を加えたものです。https://github.com/kshoji/BLE-MIDI-for-Android
改善内容
- MIDI1.0を理解してるプログラマー前提で、カプセル化はすこし遠慮しています。
- バッファは16を超えて転送すると、古いMIDI機器はエラーになるので、16バイトで区切りました。
- BLEの操作は専用のThreadから行っています。そのため、レスポンスの待機がしやすくなっていて、安定しました。
- javax sound midiパッケージのクローンをせず、独自のフレームワークにしました。MIDIOneです。一番目と被りますが。
- MIDIOneはいろいろつくっていますが、比較的安定しているのは、BLEのみで、それだけ公開しています。
- 16バイトで区切っても、MTUを64未満もだめなようでした。これは憶測です。でも、アンドロイド端末によりエラーが出てました。
- エラー数をカウントしているので、連続1000回失敗したら、切断しちゃってもいいのかもしれないですが、それは現状行っていません。コードのカスタマイズで試してみてください。

