信頼できる発行元

百均とジャンクコーナーと時々中華通販

ヤマハ PSS-A50にBLE MIDIをつける

ヤマハのポータブルキーボード PSS-A50を今年1月に購入し、いろいろと改造をしながら使用している。お気に入りの一台だ。

f:id:darekasan_net:20210822134024j:plain

現在までに

を施した。

今回は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

ArduinoMIDIを扱う用のライブラリ。これ自体には古典的な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+このマクロで付けた名前」になるようだ。

結線

f:id:darekasan_net:20210822134005j:plain

例の空きランドとボードの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対応のアプリから使用できるようになる。

接続がいまいち安定せず、使い勝手もあまりよくない。

f:id:darekasan_net:20210823182350p:plain

感想

百均の水回りコーナーにある両面が吸盤になっているシートでスマホを固定するといい感じ。

f:id:darekasan_net:20210822134048j:plain

37鍵のキーボードを使うだけなら問題は無いが、まともなMIDIシーケンスを流そうとすると発音が数秒以上遅れ、テンポもゆっくりになってしまう。BLE MIDIという規格自体の限界か、調整不足かは不明だ。複数のつまみを同時にグリグリ動かすとかならWi-Fi経由でAppleMIDIを使ったほうが良さそうだ。

せっかくESP-32を付けるのだから、もっと機能を増やしてみたいところ。