3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MIDIをmicro:bitを使って鳴らす

3
Posted at

憧れのMIDI

先日M5Stack Matrixを使ってMIDIを鳴らすことに成功しました。

続いてみんな大好きmicro:bitを使ってMIDIを鳴らしたいと思います。

使うのは同じくM5 Stackのオプションとして発売されているMIDI音源モジュール「M5Stack用MIDIシンセサイザユニット(SAM2695)」です。

サンプルプログラム

ABボタンで楽器番号を0から127まで切り替えるプログラムです。
(Gemini君で一発でした)

これを活用すればmicro:bitで簡単に楽器を作れます!!!
好きな音楽を鳴らしてもよいですしねー。

microbit-画面コピー (3).png

プログラム解説 by Gemini

コードの1行ずつの意味はこちら。

  1. let buf2 = pins.createBuffer(3)
    意味: 3つの箱(3バイト分)が入るメモリ領域(バッファ)を確保します。
    理由: MIDIで「音を鳴らす」命令(ノートオン)は、必ず3バイトセットで送る決まりになっているからです。

  2. buf2.setNumber(NumberFormat.UInt8LE, 0, 0x90)
    意味: 0番目の箱に 0x90 という値を入れます。
    詳細: 0x90 は「ノートオン(音を鳴らせ)」という命令の種類を表します。
    9 = ノートオン(音を鳴らす)
    0 = チャンネル1(MIDIには16チャンネルありますが、その1番目)

  3. buf2.setNumber(NumberFormat.UInt8LE, 1, pitch)
    意味: 1番目の箱に pitch(音の高さ)の数値を入れます。
    詳細: MIDIでは音の高さを 0〜127 の数字で表します。
    例: 60 = 真ん中の「ド」 (C4)

  4. buf2.setNumber(NumberFormat.UInt8LE, 2, velocity)
    意味: 2番目の箱に velocity(音の強さ)の数値を入れます。
    詳細: 鍵盤を叩く速さ(強さ)を 0〜127 で指定します。
    127 = 最大音量
    0 = 無音(実質的に音を止める命令と同じ)

  5. 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 にして送信します。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?