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対応音源
以下のものはキーボードが付いていて単独でも演奏できるシンセサイザーアプリ
以下のものは単独で演奏出来ない純然たる音源アプリ
以下のものはDAWアプリ (今回の用途にはあまりマッチしない)
参考
ピュアに音源(単独だと演奏出来ない系)だと「FluidSynth MIDI Synthesizer」とか「OPL3 MIDI Synthesizer」、シセサイザー系だと「Rockrelay Synth FM」他いくつか(アナログシンセ系は結構色々ある)。DAW系は「Roland Zenbeats」あたりかな。
— Sebastian Poe (@S7nP) 2022年7月22日