ベタに書くと地味ながらボトルネックになりそうな発音させるサンプルの検索やIGEN/PGEN検索をハッシュリストを使うなどして自分のできる範囲内で配慮はしているものの、やはりメインとなる音声処理全般の最適化が当面の課題になりそう。
2008年02月21日
サウンドフォントファイル(sf2)4
ADSRは無視しているものの、ある程度再生できるところまで進んで大体の概要が掴めてきたので、Delphi 6 Professional から Visual C++ 2005 Express Edition へ環境を移行(2008ではない理由は開発環境であるWindows2000がサポートOSから外されているため)。
ベタに書くと地味ながらボトルネックになりそうな発音させるサンプルの検索やIGEN/PGEN検索をハッシュリストを使うなどして自分のできる範囲内で配慮はしているものの、やはりメインとなる音声処理全般の最適化が当面の課題になりそう。
ベタに書くと地味ながらボトルネックになりそうな発音させるサンプルの検索やIGEN/PGEN検索をハッシュリストを使うなどして自分のできる範囲内で配慮はしているものの、やはりメインとなる音声処理全般の最適化が当面の課題になりそう。
この記事へのトラックバック
Delphi 6 Professionalじゃハッシュリストがボトルネックだよね
IGEN/PGENもpmod/imod チャンクだし
レンベンロディがイーストして困るよね
Delphi6 に標準で存在するハッシュリストの実装は(多分)IniFiles.pas に存在する THashedStringList だけで、自作するにしても言語自体にテンプレートの機能が備わっていない関係上 STLport にある hash_map のような柔軟性を持ったクラスを作ること自体が難しいです。
http://sourceforge.net/projects/dclx
例えば The Delphi Container Library という STL に似せた機能を持つクラス群では IInterface や TObject といった基礎的なインターフェイス/クラス用に作ることである程度便利になるようになってはいるようですが、TObject の派生クラスを使った場合は結局アップキャストとダウンキャストの両方が必要になるため暗黙のキャストを完全に期待することはできず、テンプレートと同じレベルの利便性にはやはり至っていないと思います(このクラス群はこれはこれで便利ですが)。
ただ今回の場合は最終的な消費メモリサイズの増加が気になったので、STL での capacity に相当する機能を持たず、常にリストのサイズをひとつずつ増やすような実装の簡易的なハッシュリストを自作しました(そのためにリストを構築するために掛かる時間は少し増えていると思います。まあリストを構築し終わった後に size=capacity の状態にしてしまうのもひとつの手ではありますが……)。
ここで作成したハッシュリストは PGEN/IGEN から収集したデータの検索に使用されていますがレスポンスは今のところそこそこ良好です。
また、ノートの高さとベロシティに対応したレイヤやサンプルを検索する場合は検索対象になるキーはひとつではなく0〜32など範囲を持つため、このクラスは自作せざるを得ませんでした。
この検索はノートオンの時にしか使われないため全体の項目数が少ない場合はリニアサーチでもそれなりにまともに動いてくれるのではないかとは思いますが、そこそこのメモリ消費でパフォーマンスを稼げるなら出し惜しみしないでおこうということで、128個のリストにレイヤやサンプルへのポインタを入れていき、ノートの高さに対応する項目の検索はそのリストを使い、ヒットした項目に対してベロシティの範囲に収まっているかどうかをリニアサーチする構造になっています。
pgen や igen はジェネレータチャンク、pmod や imod はモジュレータチャンクです。ジェネレータとモジュレータは pbag や ibag で束ねられていて、対応したジェネレータのパラメータをモジュレータで定義された動作によって書き換えられる形で実装されるものだとは思いますがその周辺についてはまだ読み進めていません。
ただ少なくとも、サウンドフォントプレイヤを作るにあたり仕様書52ページから記載されている Default Modulators を実装しなければ正しくベロシティに対応した音量やピッチベンドに対応したピッチの発音などの実現は互換性の面から見て難しいのではないかと思います。そのためこの辺もちゃんと読み進める必要があると思います。
最後の1行は料理しようがないので放置します。
他の記事から pmod/imod を拾ってきたことだけは評価してます。
いつ届くのでしょうか?