SoundFont のツリー表示

↑これの続き。

SoundFont は Generator(音の生成源の情報), Modulator(その音に変調をかける情報)の部品、あと音色の PCM Sample を1つに繋げた大きな配列データ*1があって、preset や instrument から利用する Generator, Modulator, Sample にリンクする構成になっています。

そのリンクを辿るツールを作成してみました。

出来てる分は openpear に commit してあります。

実行結果

~/svn/IO_SoundFont% php sample/soundfonttree.php emuaps_8mb.sf2
Bank: id:0
  Preset: id:43 name:'Contra Bass' bag:0=>1
    presetBag: id:0
      Mod: id:0
<略>
      Mod: id:11
    presetBag: id:1
      Gen: id:0
        genOper:41(instrument) Amount:0
          name:'Contrabass' bagNdx: 0=>5
            InstBag: id:0
              Gen: id:0
                genOper:5 Amount:10
              Gen: id:1
                genOper:22 Amount:65336
              Gen: id:2
                genOper:48 Amount:127
            InstBag: id:1
              Gen: id:3
                genOper:43 Lo:0 Hi:40
              Gen: id:4

何がやりたいかというと、必要な preset 番号を渡すと、それ以外を削ってシェイプアップした SoundFont を構築し直したいのです。
きっと、辿れるリンクを全部辿って、辿らなかった部分を削れば良いはず。

ただ、数10MByte近くのファイルを処理する予定なので SWFEditor みたいに全てメモリ上にオブジェクトを作って組み合わせる力づくの方式だとダメで、フィルタを作ってストリームで処理する予定です。

PHP でなく C言語で作った方がいいね。ついでに SoundFont の音色を元に WebAudio で鳴らすツールも作ってみます。

課題

  • Generator の enumeration ほんの一部しか対応してないので後でやる。
  • Modulator がまだ詳細表示出来てないので後でやる。

*1:sf2.1仕様では16bit PCM, sf2.4 では24bitにも対応