- #
title.モジュレーション as オーディオ
path.blog/envelope.md
size.6546
date.2024-12-12

あるプラグインが生成したモジュレーションをほかのプラグインで使うことを考える。 例えば

  • phase plantのエンベロープを他のプラグインで使いたいとき
  • ベースの周波数でlfoかけたいとき(ポルタメントを考えるとmidiを受け取るだけでは不十分で実際にシンセ側でkeytrackしたlfoの出力が欲しい)
  • 高級なトランジェント検出を実装したとしてそのトランジェントをほかのプラグインで使いたいとき

など。

いちばん簡単なのはサイドチェインにモジュレーション信号をオーディオとして渡すという方法だと思う。 モジュレーション信号を出力するプラグインはパラアウトにモジュレーションの強度を示す信号列を出力することにし、モジュレーションされる側のプラグインはサイドチェインのサンプル列でパラメーターを操作できるようにする。 khs ring modやkhs phase modなどのサイドチェインからモジュレーションかけるやつはこの仕組みのモジュレーションされる側の一例といえる。モジュレーション信号を出力するようなプラグインは見たことがない。

このようにモジュレーション信号を受け取れるプラグインが開発されたとして、 ほぼすべてのdawはプラグインのサイドチェインインプットを一つだけにしているため(vstの実装自体はインプットはいくらあってもいいとしているはずなのでホスト(daw)側の問題)、最大でも左右のチャンネル一本ずつで二本しかモジュレーション信号を与えられないという問題がある(実際は二本もあればわりといろいろできるけども)。

この問題はほとんどのエンベロープやlfoは音声並みの解像度が必要とされていないことに注目すると

  • サンプリング定理から少ないサンプル数からモジュレーションを復元する。例えばエンベロープがオーディオのナイキスト周波数の1/4の解像度(サンプリングレートが48000のときは6000hz)で十分だとすると、一本のチャンネルに4本エンベロープを入れることができる。すると左右で8本使える。
  • モジュレーション信号間を補完する適当なスムージングを実装する。そもそもdawから与えられる普通のモジュレーションはサンプルブロックあたりひとつの解像度で処理されている。このときたいていスムージングが実行されているので、これに倣って実装すれば一本のチャンネルにサンプルバッファサイズ分モジュレーション信号を入れれる。

という方法で解決できる。

インパルスが聞こえるくらいアタックのクソ強いエンベロープや、検出したトランジェントの情報などはオーディオと同じくらいの解像度が欲しいかもしれないからこの方法は使えない可能性がある。

この仕組みが一般化されて作られた製品群があったら、bitwigやabletonやreaperの大きな価値である「dawに備え付けられたモジュレーションシステム」に頼らなくてよくなるのが嬉しい。

また、dawから与えられるモジュレーションはサンプルブロックあたりひとつの解像度しかないためオーディオレートのモジュレーションには解像度が不十分である。 たとえばbitwigではkHz単位のlfoが使えるのだけれども結局(ナイキスト周波数/サンプルブロックの大きさ)の周波数までの情報しか使えてないはず、間違ってたらすみません。 そのためオーディオレートモジュレーションはプラグイン内で完結する必要があった。 しかしサイドチェインに入るモジュレーション信号はオーディオそのものなのでオーディオレートのモジュレーションもできるというのも大きなメリット。


現時点で上のような仕組みを実装したものを見たことはないが、実はphase plantのエンベロープをほかのプラグインで使うことはできて、

  1. エンベロープを作る
  2. 作成したエンベロープからdcを作成
  3. これをabletonやbitwigのエンベロープフォロワー(attack 0 release 0)に突っ込む
  4. これをパラメーターにマッピング

という上のやり方より計算量も解像度も汎用性も劣るし、そもそもfl studioやstudio oneではできない、めんどくさい方法があったりする。


追記

clap自体はオーディオレートのパラメーターチェンジに対応しているらしい。パラメーターチェンジはイベントとしてサンプルバッファとともにプラグインに渡されるんだけど、サンプルバッファ分のイベントを渡せばよいということ。

だとしたら、普通のプラグインをモジュレーション信号を出すためのプラグインとして扱うみたいなことができる気がするな。 そしたらDAWのモジュレーション関係の機能が一気に一般化されて素晴らしいと思う。解像度が高くなくていいならサンプルレートを落として生成されるイベントの数を減らせばいいだけだもんね。

bitwigは64sampleごとに一回イベントをおくる実装になっていて、オーディオレートでイベントを渡すようなDAWはなさそう。