CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

VGMデータ再生(2)

大域変数cntはいつどこで参照しても起動時からの経過時間(0.72ms単位)を保持していることになります。32ビットがオーバーフローするのには3.2×10^6秒=約36日もかかるので十分な長さです。

さてVGMフォーマットのパーサ処理ですが「Arduino で YAMAHA YM2151 を VGM ファイルで演奏させる」という記事があったので参考にさせてもらいました。

 

まず音符や休符の長さ、テンポを生成するための待ち時間処理pause()は計時開始時刻の退避と実際に待つカウント数を算出します。この処理自身でのタイムラグがなるべく少なくなるようにタイムベースへの換算はシフト処理にしていますがこれが44.1kHzの32分の1にした理由です。

f:id:O3I:20210114161254j:plain

Arduinoではmicros()というμs分解能のタイマ値を返す組込み関数が使えるようですが、このV50ボードでは時間軸のレゾリューションが生データの32分の1になってしまうのでギグシャクした演奏になるかもしれません。少なくともPCM音声の再生はまるでダメでしょう。

次はVGMのパーサルーチン本体vgmplay()です。この処理は常時ループさせておきイベントドリブン的にpauseにより設定された時刻になるとVGMデータからシーケンシャルにコマンドを取り出し、その内容により音源ICにデータを書いたり次のイベント時刻を設定したりします。なにもVGMが規定するすべてのコマンドに対応する必要はなく、YM2151設定0x54、待ち時間系0x61,x062,0x63,0x7X、終了コマンド0x66だけあれば十分です。

 

f:id:O3I:20210114161309j:plain