
LOD(レベル・オブ・ディティール)を意識して音を作ろう
GameSynthでプロシージャルサウンドパッチを設計するにあたって、「音の要素ごとに分けて考える(=Level of detail)」ことは大事です。
例えば、ザアア…ポタポタという「雨音」を作るとしましょう。雨粒がたくさん滴るので、下図のような「Bubbleジェネレーター(水音モジュール)をたくさん繋げて個別に調整する」 というアイデアもおそらく可能ですが・・・

緑色のBubbleジェネレーターをたくさん用意し、ミキサーで重ね合わせてはいるが・・・
しかしこの設計では、
・膨大なパラメーターを設定する必要が出てしまう。
・わかりにくく、編集しづらい
・CPU負荷がかかりすぎる
といった問題も出てきます。
一方GameSynth標準プリセットでは、下図のような3本のラインで構成されたシンプルな設計で表現しています。

上図のパッチは、3本のライン(左から順にグラニュラーノイズ・ノイズ・そして水音)で構成され、それらが最終的にミキサーで音量調整されています。それぞれのラインについて見ていきましょう。
① 中央のノイズモジュール

まず「ザー」という遠く離れた場所で鳴っている雨音を出すために、低負荷なnoiseジェネレーター(=バンドパスフィルターに従った、ホワイトノイズを生成する仕組み)を使います。
さらにこの緑のnoiseジェネレーターは、すぐ上のLFOモジュール(青色)によって、カットオフ周波数の上限値がゆっくりと変化するようになっています。
つまり、「ただ単調なノイズの鳴りっぱなし」に聴こえさせないために、時間ごとに少しずつノイズの音色が変わるように調整しているという事です。以下のサンプルの通り少しずつ音が変化していくのが分かります。
② 左のグラニュラーノイズモジュール

第二に、グラニュラーノイズモジュールを使います。これは、「粒っぽいノイズ」を出すモジュールで、前述のノイズモジュール同様に低CPU負荷というメリットがあります。
グラニュラーノイズモジュールのすぐ下に接続したバイカッドフィルターで低音のみを通すよう調整してあり、これによって、「天井や傘にあたるパラパラという雨粒」を表現できます。
③ 右のバブルモジュール

第三のバブルモジュールによって「近い距離でポチャポチャ滴っている水音」を表現します。
バブルモジュールの上部にあるディストリビューション(分配)モジュールによって、ランダムに次々と水音がトリガーされます。
雨音の完成
以上に紹介した3つのラインをミキサーで音量調整し、リバーブをかけて、雨音が完成します。
使用しているリバーブは低CPU負荷の単純なアルゴリズムで、今回のケースでは十分といえます。もし、サウンドパッチをゲームサウンドミドルウェアに統合して用いる場合は、そちらのリバーブ機能を使うのがベターでしょう。
この雨音サウンドパッチには、「クオリティも十分」「わかりやすく個々の調整がしやすい」「低CPU負荷」で、一般的な雨の効果音を再生する手法と比べると以下の利点があります。
- プロシージャルで常に音が生成されていくため、単なる繰り返し再生ではない。
- ゲームの変数に沿った、音要素のリアルタイムな制御が可能。 (たとえば水音のポチャポチャ滴る頻度、ザーという雨音のトーン、それぞれのミックス具合を、ゲーム内の状況によってコントロールできる)
- 380バイトという、圧倒的なメモリの軽さ。
最後に
今回紹介した「音の成分ごとに分けてラインを設計していく」テクニックは、いろいろ応用がききます。例えば、GameSynth標準プリセットの「キャンプファイア」も、同じ手法で設計されています。
