憧れのMIDI
先日M5Stack Matrixを使ってMIDIを鳴らすことに成功しました。
続いてみんな大好きmicro:bitを使ってMIDIを鳴らしたいと思います。
使うのは同じくM5 Stackのオプションとして発売されているMIDI音源モジュール「M5Stack用MIDIシンセサイザユニット(SAM2695)」です。
サンプルプログラム
ABボタンで楽器番号を0から127まで切り替えるプログラムです。
(Gemini君で一発でした)
これを活用すればmicro:bitで簡単に楽器を作れます!!!
好きな音楽を鳴らしてもよいですしねー。
プログラム解説 by Gemini
コードの1行ずつの意味はこちら。
-
let buf2 = pins.createBuffer(3)
意味: 3つの箱(3バイト分)が入るメモリ領域(バッファ)を確保します。
理由: MIDIで「音を鳴らす」命令(ノートオン)は、必ず3バイトセットで送る決まりになっているからです。 -
buf2.setNumber(NumberFormat.UInt8LE, 0, 0x90)
意味: 0番目の箱に 0x90 という値を入れます。
詳細: 0x90 は「ノートオン(音を鳴らせ)」という命令の種類を表します。
9 = ノートオン(音を鳴らす)
0 = チャンネル1(MIDIには16チャンネルありますが、その1番目) -
buf2.setNumber(NumberFormat.UInt8LE, 1, pitch)
意味: 1番目の箱に pitch(音の高さ)の数値を入れます。
詳細: MIDIでは音の高さを 0〜127 の数字で表します。
例: 60 = 真ん中の「ド」 (C4) -
buf2.setNumber(NumberFormat.UInt8LE, 2, velocity)
意味: 2番目の箱に velocity(音の強さ)の数値を入れます。
詳細: 鍵盤を叩く速さ(強さ)を 0〜127 で指定します。
127 = 最大音量
0 = 無音(実質的に音を止める命令と同じ) -
serial.writeBuffer(buf2)
意味: 作成した3バイトのデータセットを、シリアル通信(Unit-Synth)へ一気に送信します。
MIDIメッセージの構造
| バイト番号 | 役割 | 専門用語 | 具体的な値(例) |
|---|---|---|---|
| 0番目 | 命令の種類 | ステータスバイト | 0x90 (Ch1で音を鳴らす) |
| 1番目 | 音の高さ | データバイト1 | 60 (ドの音) |
| 2番目 | 音の強さ | データバイト2 | 100 (やや強め) |
なぜ setNumber や UInt8LE を使うのか?
UInt8: 「符号なし8ビット整数」という意味です。0〜255までの数字を扱う、MIDI通信に最適な型です。
LE (Little Endian): データの並び順の規格です。1バイトずつ数値を入れる今回のケースでは結果に影響しませんが、MakeCodeの標準的な書き方として含まれています。
ちなみに、音を止める(ノートオフ)ときは、1バイト目を 0x80 に変えるか、3バイト目の音の強さを 0 にして送信します。
