PlayLoud!!

Since1997

dsoundexを使ったBGM演奏でのループ管理 2

dsoundexを使用して、ループ演奏管理をするわけだが、じゃあそのループポイントをどうやって探すかである。
試しに、試行錯誤で数値を設定してみたのだが、これはあまりにアホらしい。とても最適なポイントを見つけられるような方法ではない。


『ds_load』命令で、バッファに読み込まれたwavファイルのサイズは、システム変数statに返ってくるわけだが、これを見るとバッファのサイズは、(wavファイルのサイズ) - 44byteとなっていた。なるほど、wavファイルからヘッダ部分の情報を除いた値になっているわけだ。当たり前だが。
参考:wavファイルフォーマット
そして、当然ながらdsoundexで使用されている再生ポイントの値は、このwavファイルのbyte数を指している。


と言うことは、DAWなどで曲データを作ったときのテンポから(再生開始からの時間で)、再生ポイントがバイト数で導き出せるということになる。


ゲームで使用するwavファイルは、『44100Hz,16bit,2ch(stereo)』というフォーマットなので、これをもとに、t秒の曲のファイルサイズを計算すると、
(サンプリング周波数)×(量子化ビット数)×(チャンネル数)×(時間)÷8
という式になるので(8で割っているのは、ビット→バイト変換)、
44100 × 16 × 2 × t ÷ 8
すなわち、

176400 × t (バイト) ……①

となるわけだ。


今度は、曲の1小節の時間を求めてみる。(別に音符単位でも計算できるけど、実用性は低いので)
4/4拍子の場合、(60 / tempo) × 4が、1小節を演奏するのに要する時間になる。
もちろん、6/8とか12/8とか、その他の変拍子の場合はそれに応じて『× 4』辺りを変えてやればいいのは言うまでもない。


で、この(60 / tempo) × 4と、①の式を合わせると、
176400 × (60 / tempo) × 4が、1小節分の演奏時間に必要なwavファイルのデータ量ってことだ。

42336000 / tempo (バイト)

でいいってことか。


てなことを、今ぼんやり考えていたのでメモしてみた。
後でDAWでデータを作って検証してみる。


あぁ、念のため。wavデータは1バイト目から曲が始まるように作らなければならないってことだ。CDからリッピングした曲などは頭に空白が入ってしまうけど、DAWで作ると無音部分はないので問題ないよな。