パート2へようこそ。この連載では、ループを使ったシンプルなエンジン音を、Wwiseで設定してデザインする方法を紹介します。パート1では、エンジンのデザインを制御するために必要なパラメータと、アセットの編集に関する一般的なガイドラインについて書きました。まだ読んでいなければ こちらでどうぞ!
このパートは、Bugbear Entertainmentが開発しTHQ Nordicが発売したバンガー/フォークレーシングビデオゲーム「Wreckfest 」の公式エンジンオーディオ改造バンドルに大きく基づいています。この改造バンドルは、チュートリアルとWwiseサンプルプロジェクトで構成されており、いずれもBugbear Communityフォーラムのこちらのスレッド からダウンロードすることができます。
Wwiseが初めてという人は、まずは改造チュートリアルを見て、関連するWwise GUIの基本について学ぶことをお勧めします。それ以外の方は、Wwise Authoringの使い方を知っていると思います。さっそく始めましょう!
サンプルプロジェクト
Wwise 2019.2でサンプルプロジェクトを開いたら、どのActor-MixerオブジェクトやRTPCゲームシンクが含まれているか、ざっと見てみましょう。ほぼ全てのオブジェクトに特定の機能や関連機能を説明するためのノートが含まれていることが分かります。
Projectに、パート1で確認した、以下の主要なエンジンパラメータがあります。
1. RTPC_Player_Example:プレイヤー車両のRPMのRTPC。範囲は実際のRPM。
2. RTPC_Player_Load:エンジン負荷のRTPC。範囲は0~1。
3. RTPC_Player_Throttle:プレイヤーが設定するスロットルの量のRTPC。範囲は0~1。
Wreckfestで使用されるLoad RTPCのパラメータ範囲では、ニュートラル(アイドル)時の負荷がちょうど範囲の中央、つまり0.5となります。またノンプレイヤーキャラクターの車両のRTPCもありますが、その場合は“Player_”が“AI_”に置き換わります。
Projectにはアセット例も含まれます。このプロジェクト用に、Pole Position Production が収録と編集を行い、快く寄贈してくれたもので、車両オーディオデザインの学習と、Wreckfest用のオーディオのmodの作成のみのために、提供されています。
プロジェクトに含まれるものはすべて、クリエイティブコモンズBY-NC-SA(Attribution-NonCommercial-ShareAlike)ライセンスのもと、私的使用のために提供されています。
なお、自分のデザインをWreckfestで試すには、ゲームをSteamで入手してください。
オブジェクトのセットアップの概要
Wwiseでループを使ったエンジンデザインを構築するには、Blend Containerオブジェクトを使い、このContainer内の任意のBlend Trackにサウンドオブジェクトを追加していきます。これらの設定で、RPMデータに基づいて再生される子サウンドオブジェクトの順番や長さが決まります。
エンジンデザインを完成させるために必要な作業をまとめると、以下の通りです。
1. アセットを作成してインポートし、サウンドオブジェクトを作成します。
2. サウンドオブジェクトに、ループとピッチトラッキングを設定します。
3. Blend Containerオブジェクトを設定し、Blend Trackやサウンドオブジェクトを入れます。
4. 再生範囲や、隣接するサウンドとのクロスフェードを設定します。
5. RTPCを使ったBlend Trackのオートメーションを定義します。
6. RPM範囲全体で、そしてBlend Track同士で、ピッチのチューニングが一貫しているかを確認し、必要に応じて調整します。
それでは、これらのタスクを1つずつ、手順を追いながら見ていきます。すべての画像のオブジェクトは、このサンプルプロジェクトの、Tutorial EngineというWork Unitにあるオブジェクトです。このWork Unitは、チュートリアルの実践部分で使われているものです。
サウンドオブジェクトの設定
まずImported Assetsフォルダを見ると、on-loadとoff-loadのループ用アセットが作成され、Wwise Authoringにインポートされた状態になっています。このフォルダにあるオブジェクトのループを有効にしてみましょう。この時、Multi Editorビューを使うと便利です。
サウンドオブジェクトのピッチが、インゲームのRPMシミュレーションに対応するように、まず双方間でオートメーションの関係を確立させる必要があります。エンジン音のループなど、一連のサウンドオブジェクトで共通のピッチトラッキングを自動設定するため、Wwiseには、指定したRTPCパラメータ範囲とサウンドオブジェクトのピッチ(natural RPM)に基づき、自動設定を行うツールがあります。
Demo_Idle_1170 オブジェクトを選択し、Property EditorのRTPCタブで、Y AxisにVoice Pitchを、X AxisにRTPC_Player_Exampleを追加します。オートメーションカーブ(グラフの線)上の任意の場所を右クリックし、コンテキストメニューで Build Smart Pitch Curve を選択します。このツールの設定ボックスに、サウンドオブジェクトの数値(1170)を入力し、 Ok をクリックしてください。結果は以下のようになるはずです。
カーブを正しく設定できたことを確認するには、 RTPC_Player_Example のフラグを、Y軸のゼロクロスに持ってきてください。サウンドオブジェクトの数値と一致するはずです。一致しない場合は、 Build Smart Pitch Curve ツールをもう一度実行し、入力ミスがないか確認してください。
終わったら、すべてのサウンドに対して同じ処理を繰り返します。この時、作成したX-Yマッピングをコピー&ペーストしてから、それぞれのサウンドオブジェクトの適切な値を使って Build Smart Pitch Curve ツールを実行し直せば、少しだけ手間を省くことができます。
ブレンドコンテナの設定
チュートリアルを短くするため、Tutorial Blend Containerというオブジェクトには、2つのBlend Trackが事前に定義されています。on-load用とoff-load用で、それぞれRTPCによるオートメーションがマッピングされています。Containerを新しく作成するのであれば、デザインで必要な数のBlend Trackを追加してから、必要なRTPCをマッピングし調整する必要があります。
初めに、Containerに子オブジェクトを入れます。Shift + クリック で、Imported Assets下のサウンドオブジェクトをすべて選択し、Containerまで Ctrlを押しながらクリックしてドラッグ します。サウンドオブジェクトのコピーが作成されます。次に、このContainerをContents Editorで見ます。追加したオブジェクトを、該当するBlend Trackにアサインします。
ファイルを、該当するBlend Trackプレイリスト(“On”、“Off”がオブジェクト名にある)にドラッグし、natural RPMに基づき昇順(アイドリング値から最高値まで)にソートします。このリストの順番でBlend Track Editor内のオブジェクトの順番が決まりますが、並べ替えるにはドラッグ&ドロップします。
新しいBlend Containerを作成する時に、そのPlay ModeをStepとするのか、Continuousとするのかが重要なので、注意してください。サウンドは無限にループするように設定されているので、エンジンのContainerをStepモードで実行すると、プロジェクトのバーチャルボイス数は瞬く間に膨らんでしまいます。多数の子オブジェクトがあるデザインで、ランタイムにContainerのコピーが複数インスタンス化される場合は、特にそうです。
ブレンドトラックの設定
続いてBlend Track Editorビューに移動すると、off-loadやon-loadのBlend Trackが、事前に定義したオートメーションや、各Blend Trackプレイリストに入れたオブジェクトを表すボックスと共に、表示されます。Crossfadeオプションが有効になっていて(今回は必須)、それは、RTPC_Player_Exampleをトラッキングするように設定されていることに注目してください。
Blend ContainerのPlay ModeがContinuousに設定されている場合は、シミュレーションのパラメータが境界線を越える時に、ボックスの境目が、Wwiseがそれぞれのサウンドオブジェクトの再生を開始したり停止したりするタイミングとなります。
オブジェクトのボックス間に隙間があれば、RTPC値がその隙間にある間は、サウンドが再生されません。これを応用して、例えば、サウンドオブジェクトをRPM範囲の中央部だけで再生させ、それより上や下では再生させない場合に利用できます。
一番上のRPMオブジェクトから始め、どちらのBlend Trackでも、ボックスを動かしたりサイズを変えたりして、それぞれのnatural RPM範囲がほぼ中央にくるようにし、隣接するオブジェクトを少し重ねます。次に、各ボックスの左右のエッジで、右クリックしてコンテキストメニューを出し、ボックスの左側では Sine (Constant Power Fade In) を、右側では Sine (Constant Power Fade Out) を、選択します。
このタイプのクロスフェードをエッジに適用すれば、クロスフェードの中間あたりで一定のボリュームレベルを維持するので、特に適しています。2つのSineの代わりに使える、別の似たクロスフェードが、 Base 3 と S-Curve のペアです。場合によっては、Sineよりも滑らかに聞こえることもあります。
オブジェクトを、それぞれのnatural RPM周辺に配置し、エッジのフェードを設定したので、今度は各クロスフェードの幅を微調整します。Blend Containerを再生し、RTPC_Player_Loadの値を1にしたら、on-load Blend Trackを最大RPMからアイドリングRPMまで下げていきながら、幅を好きなように調整します。
トランジションとピッチ変更が滑らかに聞こえる範囲で、クロスフェード幅をできる限り狭くします。どのサウンドオブジェクトもnatural RPMを超え過ぎないようにし、隣接するオブジェクト間でトーンが滑らかに変わるようにします。
終わったらRTPC_Player_Loadを0にし、もう一度、最大RPMから下げていきますが、今度はoff-load Blend Trackで行います。最後に、設定したBlend ContainerをEngine Example Plrのコンテナと比較します。同じループを使用しているので、子オブジェクトの配置場所を決めるのに、参考になります。
ここで最適化のヒントとして、on-loadのBlend Trackとoff-loadのBlend Trackの、それぞれのクロスフェードが同時に起こらないようにループアセットを設定できるか、ソースのレコーディングを確認してみてください。できるのであれば、特にオブジェクトのインスタンスが多数、スポーンされる場合などに、ランタイムのアクティブボイス数を節約できます。
あるRPM範囲で、複数のBlend Trackのクロスフェードが発生する時は、各Blend Trackで、1インスタンスにつき2つのアクティブボイスを実行することになります。今回のTutorial Containerの場合は、合計4つです。Blend Containerにプラグインを追加した場合も同じで、プラグインもランタイムに、子オブジェクトごとにインスタンス化されます。
RTPCを使ったBlend Trackのオートメーション
エンジン設定のこの部分は、求めるエンジン音によって最終的に決まります。エンジンデザインを新しく設定した場合は、シミュレーションの動作に合わせるための残る作業は、主にon-loadレイヤとoff-loadレイヤ間のトランジションを制御するために、Loadのオートメーションを設定することです。
Wreckfestの改造バンドルのチュートリアルドキュメントで、「How Engine Load Works」の章を確認し、そこに示されている動作と、Tutorial Blend Containerの3つのLoadステート間のRTPCオートメーションの事前設定を、比較してみてください。Wwise AuthoringをWreckfestのSteamのビルドに直接つなげることはできないので、この章は、事前定義されているオートメーションを理解するための参考になります。
Loadを使ったVoice Volumeオートメーションの全体的な形状は、対象となるシミュレーションに左右されますが、一般的には、off-loadとon-loadのBlend Trackが、neutral load値の範囲あたりでクロスフェードするように設定します。
on-loadとoff-loadの動作の全体的な形がだいたい決まってからも、ボリュームレベルやフィルタリングのオートメーションの具体的なキーポイントを、まだ微調整できます。今回のエンジン事例を使い、簡単に、オートメーションのデザインを微調整してみましょう。
シミュレーションのRTPC値を、neutral Loadとidle RPMに設定し、on-load Blend Trackの1000~2500 RPMの範囲の追加Voice Volumeのオートメーションを確認します(上図参考)。そのままだと、このように聞こえます。
Blend Trackの、RPMに基づくHigh-Passフィルタのオートメーションと組み合わせると、on-loadループのカタカタというバルブ風のテキスチャが少しだけ入り、off-loadはidle RPMであり、低域周波数は濁りません。次に、on-loadオートメーションのボリュームを、キーポイントの1000 RPM(アイドリング時)で上げてみます。するとミックスのカタカタ音が目立つようになり、アイドリング音が、老朽感のある、まるでディーゼルエンジンのようなサウンドになるかもしれません。こちらがそのオーディオ例です。
今度は、on-loadのHigh-Passフィルタのオートメーションを、off-load Blend Trackにコピーしてon-loadから取り除くか、逆にLow-Passフィルタを制御するオートメーションに切り替えてみて、どうなるか試します。 そしてon-loadとoff-loadのボリュームバランスを、1000 RPM、neutral Load(0.5)で調整します。アイドリング音は、on-loadの低域周波数を含め、全体的なボリュームを上げ、High-Passフィルタがかかったoff-loadをミックスすると、このように聞こえます。
ずいぶん空洞感のあるサウンドになり、車のアイドリング音には聞こえないとさえ思うかもしれません。管のような強いトーンが聞こえるのは、ミックスでon-loadループが優勢になったのに加え、ループのピッチを下げて再生しているので、このトーンがさらに強調されているためです。(シミュレーションのIdle RPM値が1000であるのに対し、ループのnatural RPMは1670です。)
管のようなトーンが生じたのは、おそらくレコーディングセッション時にマイクが排気管の近くにあり、さらにこのレイヤ(収録音)が、最終的なアセットに多くミキシングされたためです。インゲームのチェイスカメラの視点に合うように、ベイクしたミックスです。on-loadレイヤを、ミックスで目立つように設定したので、マイクの近くで収録した大げさな排気トーンや、ピッチを下げた再生で、かなり変わった不自然なアイドリング音を生み出しています。
こういった種類のサウンドデザインを、基本的なループだけで行えるのです。キーポイントを調整すると、車の外観や乗り心地に合わせて個性的な音になることもあれば、調整し過ぎて台無しになることもあります。ところでオートメーション設定の調整は、独特の車のサウンドを生み出すためだけではありません。先ほどのカタカタ音などは、車が受けたダメージに合わせて、ボリュームを上げることも可能です。そうすればトーンの変化によって、プレイヤーに意味のあるメッセージを伝えたり、没入感を高めたりすることができます。
大事なのは、車のアイドリング音を、少し調整しただけでかなり変えられたという点で、デザインに新しいアセットを加える必要もありませんでした。
メモ:RTPCオートメーションの対象を、Blend Trackの全オブジェクトではなく、1つの子オブジェクトとしたい場合は、オートメーションをオブジェクトに直接設定する必要があります。先ほど追加した、natural RPMに基づいたピッチトラッキングと似ています。
完璧なピッチを目指して
インポートしたアセットを観察したり設定したりしていると、Blend Trackの隣接するオブジェクト同士でわずかに調子がずれていることがあり、単純にルートのピッチトラッキングを設定するだけでは不十分な場合があります。
ピッチの問題は、通常、ピッチをフラットにしたり、HzをRPMに変換したりすると生じます。どちらも、パート1で取り上げた内容です。Blend Trackの再生中に、問題のあるクロスフェード部分が長時間続くような場合は、大幅な変調や、コムフィルタリングによるゆっくりとしたスイープトーンなどとして、この問題が耳に聞こえます。このような現象に対処するには、Blend ContainerのContents Editorで、Voice Pitchを調整します。
ピッチの微調整は、先ほど行ったクロスフェード幅の調整と似ていて、on-loadやoff-loadのレイヤを1つずつ試聴してスクラブして、最大RPMからアイドリングRPMへと下に進みます。エンジンサウンドは上の方ほどトーンが明確で修正しやすいため、いつも最大RPMから始めることをお勧めします。
グッドプラクティスとして、微調整の作業全体を通して、シミュレーションのRTPC値を最大off-loadとon-loadで時々入れ替え、2つのBlend Track間でピッチトラッキングが常に一貫していることを確認すると良いでしょう。レコーディングによっては、調波周波数のラウドネスバランスが特定のRPM範囲で変わってしまう場合があり、そのせいで誤った周波数に合わせて調整してしまうことがあります。
バランスの変化を確認するために、今回のエンジン事例を、最大RPMから3600くらいまで再生し、途中で最大on-loadとoff-loadを切り替えてみてください。最大RPMから下げていくと、3600あたりでは、off-load側のトーンがon-loadとだいぶ異なります。にもかかわらず、上2つのoff-loadアセット間のクロスフェードでピッチトラッキングは正常に行われており、最大RPMでは、2つのレイヤのトーンのバランスはとても似ています。
まとめ
以上で終わりです!宇宙船でも、車でも、サンプルベースの楽器でもいいので、このチュートリアルを読んだあとに、ピッチトラッキングに対応する調和のとれたBlend Containerデザインを、Wwiseで作ってみようと思ってくれることを願っています。
エンジンサウンドのデザインをやってみるチャンスを求めているなら、Wreckfest Discord公式サーバー のModdingチャンネルで探してみてください。車のmodを作っている人のデザインを助けるために、エンジンサウンドの作成を提案してみてはどうでしょう。Steam Community Workshop に多数あるWreckfest car mod(これを書いている時点で256個も!)の1つを、カスタマイズしてみるのもよいかもしれません。
このチュートリアルに関する質問やコメントがございましたら、下のコメント欄に記載いただくか、Wwise_Discordサーバ で声をかけてください。お待ちしています!
コメント