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