M5StackでBLE-MIDIコントローラ

やりたいこと

M5StackでBLE-MIDIコントローラを作る。
開発環境はPlatformIO (Arduinoベース)。

MIDIの基礎知識

音階

中央ハ(C4)のノートナンバーは60。A4は 60+9 = 69。
C5は 60+12 = 72、C3は 60-12 = 48。

音色

GM規格では1~128のプログラムナンバーに対して音色(楽器の名称)が規定されている。
例えば、1はアコースティックグランドピアノ。
また、チャンネル10はリズムトラックとして使われ、ノートナンバーごとに音色が割り当てられている。

platformio.ini

使用するライブラリを追記する。
Arduinoで使えるBLE-MIDIのライブラリはいくつかあるが、今回はいちばん簡単そうな lathoub/Arduino-BLE-MIDI および h2zero/NimBLE-Arduino を利用することにする。

lib_deps =
    m5stack/M5Stack@^0.4.3
    h2zero/NimBLE-Arduino @ ^1.2.0
    lathoub/BLE-MIDI@^2.1.0 

ヘッダのインクルード

#include <BLEMIDI_Transport.h>
#include <hardware/BLEMIDI_ESP32_NimBLE.h>

定義

BLEMIDI_CREATE_INSTANCE("デバイス名", MIDI);

void OnConnected()
{
  // 接続時のハンドラ
}
void OnDisconnected()
{
  // 切断時のハンドラ
}
void OnNoteOn(byte channel, byte note, byte velocity)
{
  // ノートオン時のハンドラ。今回はコントローラ側なので不要。
}
void OnNoteOff(byte channel, byte note, byte velocity)
{
  // ノートオフ時のハンドラ。今回はコントローラ側なので不要。
}

setup() に書く処理

    MIDI.begin();
    BLEMIDI.setHandleConnected(OnConnected);
    BLEMIDI.setHandleDisconnected(OnDisconnected);
    MIDI.setHandleNoteOn(OnNoteOn); // 今回はコントローラ側なので不要。
    MIDI.setHandleNoteOff(OnNoteOff); // 今回はコントローラ側なので不要。

loop() に書く処理

    MIDI.read(); // 今回はコントローラ側なので不要。

ノートオン / ノートオフ

    // noteNumber : ノートナンバー (0~127) つまり音の高さ
    // velocity : ベロシティー (0~127) つまり音の強さ
    // channel : チャンネル番号 (1~16)
    MIDI.sendNoteOn(noteNumber, velocity, channel);
    MIDI.sendNoteOff(noteNumber, velocity, channel);

音色の設定

    // programNumber : プログラムナンバー (0~127) つまり音色
    // channel : チャンネル番号 (1~16)
    MIDI.sendProgramChange(programNumber, channel);

引数のプログラムナンバーが0はじまりであることに注意。上述のGM規格の1~128のプログラムナンバーは1引いた値を渡す。

Androidで利用できるBLE-MIDI対応音源

AndroidよりiOSのほうがこの分野は強いらしいが。

以下のものはキーボードが付いていて単独でも演奏できるシンセサイザーアプリ



以下のものは単独で演奏出来ない純然たる音源アプリ

以下のものはDAWアプリ (今回の用途にはあまりマッチしない)

参考