備忘録も兼ねてメモしておく。
Arduboy のサンプルに Tunes というのがあった。
そのサンプルにある一番最初の score[]
が楽譜を意味するバイナリデータなんだけど、今回はこれを読みたい。
MIDIファイルから変換してくれるツールもあるので読めるようになる必要はないんだけど、バイナリデータがあったら読みたくなるのが世の常なのでしかたないね。
使われているライブラリ
ArduboyPlayTune
これがそれ。
どうやらベースは Arduino の Playtune ライブラリらしい。
楽譜のフォーマット
Playtune の楽譜バイトストリームはシンプルな「音符のON/OFF」コマンドと「停止」コマンドの3つで構成されている。
バイトの最上位ビットが1だった場合は以下のコマンドを意味する。
-
9t nn: 音源 t の音符 nn を再生する。
音源の番号(t)は 0からスタートして、いくつ設定できるかはハードによって違う。
音符の番号(nn)は 半音階(クロマティックスケール)のMIDI番号。
60(10進数)で真ん中の C を表し、69で真ん中の A (440.0Hz)を表す。
一番高い音は 127 で 12,543.9Hz の G - 8t:音源 t の音符を止める
- F0:楽譜終了(演奏の終了)
- E0:楽譜終了(最初からもう一度)
バイトの最上位ビットが0だった場合は停止コマンドを意味する。
最上位ビットを除いた7ビットとそれに続く8ビットでビッグエンディアンの 15ビット整数として扱い、その値が次のコマンドを実行するまでの停止ミリ秒を表す。
例えば 07 D0
だった場合は、 0x07D0
= 2000
なので 2000ミリ秒停止する。
停止コマンドが実行され停止している間は前に再生された音符が再生され続ける。
とてもシンプル
なんか特にメモする必要ないくらいシンプルだった。
楽譜データはプログラムと一緒に Flashメモリ("PROGMEM")に格納して使う。
上で書いた音源の指定は Arduboy の場合は 0, 1, 2
の3つまでっぽい。
ちなみにMIDIファイルから変換してくれるツールはこれ
https://github.com/LenShustek/miditones