コンテンツへスキップ
ものがたり
戻る

トラックフリーズの設計に関する覚書

DAWでトラックとプラグインの数が増えてくると、リアルタイム処理が間に合わなくなる可能性が十分にある。オーディオ処理が追いつかなくなるのは多数のプラグインをリアルタイムに連続的に処理しなければならないことが原因だ。編集作業で手を加えていないトラックの再生結果は変わらないはずなので、毎回オーディオグラフを辿って全てのノードを処理しなくてもいいはずだ。

この問題を解決というか回避するのがトラックのフリーズ機能だ。フリーズしたトラックの内容はエフェクトプラグインなしのオーディオトラックと同等なので、多数のトラックがあっても概ね問題ない。

フリーズ機能の基本要件

フリーズ機能の原理的な要件はシンプルだが、設計にはいくつか選択肢がある:

フリーズ機能実装の前提機能

フリーズ機能を実現するためには、いくつかの機能が前提として存在している必要がある:

楽曲のプロジェクトモデル、あるいはドキュメントモデルと呼ばれるものは、単純なプラグインホストやシーケンサーエンジン(それだけでも既に大変なのだが)を作っているだけでは必要が無いが、DAWでもundo/redoなどの編集機能を実装したり、ARAをサポートしたり、VST3のインターフェース関数IComponentHandler2::setDirty()をサポートするに至る開発を行っていると必要になってくる(この関数自体はプラグイン側が状態を管理する前提で作られたAPIで、ホスト側のsingle source of truthを否定する存在なので、あまり行儀が良いとは言えないが)。

実装

uapmdの実装においては、FrozenTrackManagerというクラスが実装の大部分を担っているが、トラックのフリーズはTailProcessManagerというクラスに実装されたaddTransportQuietListener()で登録するイベント(再生がtailも含めて無音になると発火するイベント)がトリガーになって実行される。再生処理のイベントでそのまま登録すると、tail処理が未だに行われていてもフリーズが始まってしまうので、完全に沈黙してから開始するという流れだ。


この記事を共有:

次の記事
the frozen moment (7月の開発記録/2026)