BGMデータおよびループ情報

現在部室の世紀末非想天則はBGMをSWRSToysのBGMChangerで変えているのですが、ちょっとth123b.datをのぞいてみました。
th123b.datにはBGMデータとして.oggファイルおよびループ情報データとおぼしき.sflファイルが入っています。このSFLファイル、思いっきりRIFFなんですが、どうやらSound Forgeという波形*1編集ソフトが吐くマーカー・リージョンデータのようです。ええもん使ってますなあ(SE部門とかしらね あ、オレがVisual Studio使ってるようなもんか 結論:普通)。ググってもまともに出てきたのは公式ページのFAQのみ。結局このSound Forgeに色々吐かせてバイナリエディタで見ればよくわかるでしょってことなんですよねこれが。持ってないなら仕方ない。
まずRIFFの書式に従ってファイルの階層構造を読み下し、テキストファイルにメモします。そして他の.sflファイルと見比べ、チャンクの中身で異なる部分が2か所(後述のXとY)であることを特定しました。SWRSToysのソースより、必要な情報はループの左右端であり、イントロ部分(最初に1回だけ)の長さとその後ろのループ部分(何度も)の長さであることが見当がつきましたので、この2つの部分に絞り込めました。.oggのプロパティからサンプリングレート44100Hzを得た後、この2つの4バイトの数字をそれぞれ44100で割ります(calc.exeで)。得られた秒数をプレイヤーで調べ、正しいループポイントであることが確認できました。多分作曲ソフトの吐いたwavをSound Forgeで読ませて効率的にループポイントの調整をしてそれの吐いた.sflをそのまま入れてプログラムで必要な部分を取り出しているのでしょう。wavはoggにしてdatに入れると。


いつものように悪用注意
それと1行目にsflファイルフォーマットって書いてあるけど色々と違うので……

sflファイルフォーマット

id:RIFF size:? fcc:SFPL
	id:cue size:28
		DWORD [7]{0x1, 0x1, X, "data", 0x0, 0x0, X}
	id:LIST size:32 fcc:adtl
		id:ltxt size:20
			DWORD [5]{0x1, Y, "rgn ", 0x0, 0x0}
	id:SFPI size:?
		char name[?]

X = イントロ部の長さ
Y = ループ部の長さ
(単位: サンプリング数 = 時間[s] * サンプリングレート[Hz])

0..Xのイントロを再生
X..(X+Y)のループを再生
X..(X+Y)のループを再生
...

*1:wavファイルデータだと思えばいいよ!!