SoundFont の parse に挑戦
SoundFont2 の処理しか実装していませんが、1 も需要があれば対応します。
今のところ Chunk の分解が出来てて、pdta の詳細を分解してるところです。
とりあえず出来てる分だけ openpear に commit しました。
資料は wiki にまとめ中
一応、後で build 処理を作るのを念頭にいれて作ってます。
あとで C 言語で実装し直すつもりですが。
SoundFont2 の chunk構造
* RIFF 全体 +------+-------+------+---------+---------+---------+ | RIFF | sizeF | sfbk | LIST ...| LIST ...| LIST ...| +------+-------+------+---------+---------+---------+ <- 4B -><- 4B-><- 4B-> <--- sizeF --------------------------> - INFO-list (サウンドフォント自体のメタ情報) +------+-------+------+---------+---------+---------+ | LIST | sizeL | INFO | <chunk> | <chunk> | ... | +------+-------+------+---------+---------+---------+ <--- sizeL --------------------------> - sdta-list (全サンプリングデータを1つに連結したもの) +------+-------+------+-------------------------+ | LIST | sizeL | sdta | <chunk> | +------+-------+------+-------------------------+ <--- sizeL ----------------------> - pdta-list (音色のメタデータやサンプリングデータへのポインタ) +------+-------+------+---------+---------+---------+ | LIST | sizeL | pdta | <chunk> | <chunk> | ... | +------+-------+------+---------+---------+---------+ <--- sizeL -------------------------->
soundfontdump
yoya@sakura:~/svn/IO_SoundFont$ php sample/soundfontdump.php emuaps_8mb.sf2 RIFF=>sfbk LIST=>INFO ifil: (size:4) sfVersion: 2.01 INAM: (size:22) sfName: 8MBGM E-Mu APS Rev B^@^@ isng: (size:10) sfEngine: E-mu 10K1^@ IENG: (size:2) sfEngineers: ^@^@ ISFT: (size:66) sfTools: E-mu Systems SoundFont Designer, Beta 2.02a, 2/28/96:SFEDT v1.28:^@ ICMT: (size:2) Comments: ^@^@ ICOP: (size:2) Copyright: ^@^@ LIST=>sdta smpl: (size:7387924) Samples/2: 3693962 (16bit Samples) [Samples] LIST=>pdta phdr: (size:5206) [0] PresetName: Contra Bass Preset: 43 Bank: 0 PresetBagNdx: 0 Library: 0 Genre: 3292327936 MorphologyGenre: 1049056 [1] PresetName: Piano 1 Preset: 0 Bank: 0 PresetBagNdx: 2 Library: 0 Genre: 0 MorphologyGenre: 0