Wwise 2017.1の新しい機能である3DバスやバスからのAuxセンドを使うと、サウンドエンジンをモジュール的に利用できるようになり、もともとのWwiseの目的とは異なることまで可能になりました。今回は、ビデオゲームのオーディオ制作に使うという本来の目的を超えて、Wwiseをプロシージャルオーディオデザインのプラットフォームとして活用する可能性を検証します。まずシグナルパスにフィードバックループ(feedback loop)を設定する機能を詳しくみて、その影響なども考えます。それでは、まずコンセプトをシンプルな事例を紹介しながら説明してから、リバーブエフェクト全体をWwiseバスだけで作成して実装する流れを説明します。内容が分かりやすいように私のWwiseプロジェクトをダウンロードしてから読むことをおすすめしますが、ダウンロードしなくても問題ありません。
ミキシング階層の中のフィードバック
あるバスから、同じ階層の下位のバスへAuxセンドを設定すると、Wwiseでフィードバックループが作成されます。Wwiseでは、下位のバス階層からミキシングし始めて、上のマスターオーディオバスまで上がります。サウンドエンジンがミキシングパスを実行する時に、対象のバスのアウトプットが下位のバスに接続している場合、実はこの下位バスは実行中のパスで既にミキシングされています。下位バスに送られたオーディオのチャンク(chunk)は、次のパスまで待機してから親バスにミキシングされるので、フィードバックパスで1フレーム分のレイテンシが発生しますが、48 KHzで、標準的な512サンプルのバッファであれば、これは10.6ミリ秒に相当します。
試してみるには、フィードバックを自分自身に送り返すようなバスを設定して、そこでサイン波のスイープを再生します。Advance ProfilerのVoices Graphにある赤い点線の上にマウスをおくと、発生したレイテンシがミリ秒単位で表示されます。
サイン波のスイープを聞いてみると、個別の「ビート」が聞こえてきます。これは、サイン波が、そのサイン波の前のバージョンに追加(ミキシング)される時に周波数が変わるために発生するもので、ポジティブ干渉とネガティブ干渉の部分が発生します。
気を付けて!
Wwiseでわざとフィードバックループを作成する際に、もともと計画された機能ではないので気を付ける大事な点がいくつかあります。まず最初に、システムが不安定になるのを防ぐようにしてください。フィードバックループが最終的に全体で正のゲインとなると、非常に大きな音になってしまい、スピーカーや耳にダメージを与えます!Auxセンドが自分自身にフィードする場合は、必ずネガティブゲインになるようにします。例えば‘Interference_Patterns’バスは、Auxセンドのゲインが-3 dB です。ゲインが正であれば、絶対に不快な結果となるでしょう。
私も試行錯誤するなか、何度もシステムを不安定にさせてしまいました。そうすると、非常に大きい雑音が発生してから無音になることがほとんどです。時には、コンサートのマイクのハウリングのように音が徐々に大きくなります。急激に大音量になることもありました。要は、サウンドエンジンが無限に大きい音のシグナルを再生しようと一生懸命になり、結局は何も聞こえなくなってしまうのです!
もう1つ発見したのは、フィードバックループが聞こえなくなっても、ループをクリーンアップするメカニズムがサウンドエンジンにないということです。フィードバックシステムが安定している場合でも、ボリュームが漸近線にそってゼロに向かってディケイして、理論上、ゼロになりません。サウンドエンジンは無音(またはバーチャルに無音)のバッファを自分自身に対してミキシングし続け、実際にバッファの中身を確認して聞こえていない内容だと認識するメカニズムが、ありません。
対策として、センドをはっきりと終了させる必要があり、センドを排除(クリックして削除)するか、単純にセンドのボリュームを -96 dBに設定します。
Wwiseで作成するフィードバックディレイネットワーク
自己干渉するサインスイープは面白いけれど、もっとクールなことも、できないものか?例えば、完璧に機能するリバーブエフェクトを、Wwiseでバス階層やAuxセンドを組み合わせて達成できないものか?Yes! 正確には、できないわけではない、です。これから説明しますが、私はちょっとだけズルをしました。これから、リバーブエフェクトを使わずにWwiseでリバーブエフェクトをつくる方法を教えるので、もしかしたら読者にとっても何か新しい知識となるかもしれません。
フィードバックディレイネットワーク(FDN)はリバーブの一種で、複数のディレイラインで構成されます。各ディレイラインのアウトプットに特定のゲインを適用してから、それぞれのインプットにフィードバックします。図式化すると、このようになります:
この例では 、3つのディレイライン(上図 z-Mi)と、‘qxy’ というマトリックスがあり、このマトリックスの値で、ディレイラインXのアウトプットを、どれだけディレイラインYのインプットにフィードバックするかを示すゲインが決まります。
ディレイラインの長さ(Mi)に対する設定値や、ゲインのマトリックスの設定値は、様々な点に考慮して決めますが、詳しく知りたい場合はdsprelated.com に情報が掲載されています。ここで私がWwiseプロジェクトとして仕上げたFDNはかなり初歩的なものですが、それでも基本的なコンセプトを学ぶには充分です。
FDNのバス構成
WwiseでFDN用のInputバスとOutputバスを作成して、Outputバスの下に、5つのディレイライン用の5つのAuxバスを作成しました。ディレイラインバス(例: DL0、DL1など)にそれぞれ4つのAuxセンドがあり、相互のディレイラインにセンドし合うことで、FDNのフィードバックループが形成されます。バスに設定できるUser-Defined Auxiliary Sendsは4つまでですが、バスは自分自身にセンドできないので、全部で5本のディレイラインを設定することにしました。インプットバス(FDN_Input)からは4本のセンドがあり、それぞれDL0~DL3のバスにフィードしますが、これも、同時にセンドできる対象バスが4つまでです。5本目のディレイであるDL4は、ほかのディレイラインからのフィードだけが入り、もとのインプットシグナルは入りません。その結果、上図に示した典型的なFDNを、Wwiseのバス構成で大まかに再現できます。
ディレイライン
ディレイタイムを、ディレイラインによって変えたかったので、サウンドエンジン既定の10.6 msに従わずに、ちょっとだけズルをしてディレイエフェクト(フィードバックなし)を、ディレイライン用に設定したバスにそれぞれ追加しました。FDNリバーブが自然に聞こえるように、ディレイラインの長さが「互いに素数」となるような、共通の約数が1しかない数字を選択するのが望ましいです。私はGoogleで素数表を引っぱってきて、素数を5つ選んで、前述の「組み込みディレイ」である512サンプルを引いた数を求めて、さらにサンプル数を秒数に変換しました。最後に、この数値をWwiseのエフェクト設定画面で、Delay長さのパラメータとして入力しました。さて、上手くいったか?詳しくは、このあとで。
「不幸にも誰もマトリックスを...」
次に、ゲインのマトリックスを作成して、1つのディレイラインのアウトプットをどれだけ、ほかのディレイラインにインプットとしてフィードバックするのかを設定する必要があります。私は、FDNのフィードバックマトリックスを、Auxアウトプットバスのゲイン(それぞれ -9 dBに設定)と、このパラメータに対して適用するRTPC(これはアウトプットによって違う)を組み合わせて定義しました。理想的には、このマトリックスでコンポジットシグナルの相関関係をできるだけ軽減して、リンギングアーティファクトを最小限に抑えたスムーズなアウトプットを生成したいところです。残念ながら、一般的に使用される非相関マトリックス(Householderマトリックスなど)はネガティブゲインを伴い、Wwiseのスライダで位相反転を引き起こすこともできません!結局、“Feedback_Vol”という名前のRTPCを定義して、ディレイラインバスの4つのAuxセンドアウトプットボリュームに対して適用して、ゲインが微妙に異なるように設定しました。下図のスクリーンショットが、私が設定したカーブです。なお、“Feedback_Vol”で0を -200 dBにマッピングしたのは、センドの接続を完全に切ってフィードバックループを終了させるためです。(間違って何度かポジティブフィードバックを引き起こした時には、これが役に立ちました!)
RTPCタブでディレイラインバス毎に唯一変えたのは、カーブの順序をランダマイズしたことです。“Feedback_Vol” パラメータが小さくなると、エコーの間隔が開き、ディケイが早まります。パラメータを大きくすると、リバーブの密度が高まりディケイがかなりゆっくりになります。
ダンパー設定
最後に、高周波が低周波よりも(実際の部屋の物理的な性質に合わせて)早くディケイするように、各バスのエフェクトチェインに、ローパスフィルタを追加しました。“Lowpass_Freq” RTPCを、cutoff値につなげました。Wwiseの今後のリリースで、ローパスフィルタをミキシングバスに直接組み込みますが、それまでは、WwiseのパラメトリックEQで、バンドを1つだけ有効にした方法で、充分です。
それでは、音を再生して作業の成果を確認します。Advanced Profilerでキャプチャすると、このようなボイスグラフになります。ややこしいです!
そして、結果は?
バーチャルなスペアパーツの寄せ集め作品のわりには、リバーブエフェクトとして悪くないと思います。確かにロボット的で金属音が強い感じもありましたが、これもデジタルLo-Fiの魅力のうち。素数を使った私の賢い工夫のおかげでアウトプットがスムーズになると期待したものの、実は浮動小数点のディレイタイムが正しく素数のサンプル数に変換できているかを確認中に、Wwiseのディレイエフェクトのディレイ長さが、自動的に4の倍数に四捨五入されることに気づいたのです!確かにSIMD命令を使った素晴らしく効率的な処理方法ですが、互いに素数のディレイ長さを実現しようとした私の夢は、これで台無し。正確な非相関マトリックスがないことも、音質向上の努力にとって打撃的だという気がします。
読者の多くがこの記事をスマホで読んでいて、Wwiseプロジェクトをダウンロードできないと思うので、いくつかのオーディオサンプルを聞けるように用意しました。どれも、‘Feedback_Vol’と‘Lowpass_Freq’の2つのゲームパラメータを調整しています。
Hello
Hey
パーカッションループ
サインスイープ
叫び声
あなたも、是非試してみてください。ディレイ長さやフィードバックゲインなどを変えてみてください。でも要注意、不安定な状態を導くのは容易です!あせった時は、“Feedback_Vol”パラメータをスライダで0まで戻してください。フィードバックを全てカットして、センドの接続を切ることができます。
振り返ってみて
Wwiseでフィードバックループを作成する機能を残しておくことは、まるで失敗しろとユーザーに言っているようなもの。ここまで説明してきた通り、様々な問題が起こりうる上に、現実的にはループをつくって活用する場面があまりないと主張する人もいるでしょう。ただ、Wwiseのバスをパッチできるモジュールとして扱うと、魅力的な使い方が次々に思い浮かび、オーディオオタクとしては、そんな機会を見逃すわけにはいきません。またフィードバックループを許可することで、Wwiseをオープンにして無意味な制限を省くという私達の目標にも合っています。やり方を限定するのではなく、ユーザーのクリエイティビティとイノベーションに、扉を開放しておきたいと思います。この記事がお役に立つことを期待すると同時に、Wwiseコミュニティの皆さんがこれで何をつくってくれるのかを、楽しみにしています。
コメント