効果音33種類、音声ファイルはゼロ
· 約4分で読めます
Strandbreak Online はかなりにぎやかなゲームです。メイン武器が8種類あってそれぞれ発射音が違い、12種類ほどあるサブ武器は、挙動のいちばん近い武器の音を借りています。ほかにも命中とクリティカル、撃破とエリート撃破、アイテム取得、レベルアップ、爆発、それにボス専用の音が5つ。効果音は全部で33種類ありますが、ゲームのダウンロードには音声ファイルがひとつも入っていません。
仕組み
それぞれの音は、データとして書いた短いレシピです。どのオシレーターを使うか、音量エンベロープの形、フィルター、少しのノイズ。ゲームが起動すると、レシピを生のサンプルバッファ(音声ファイルならデコード後にできるのと同じもの)に書き出し、そこから再生します。
コストはブラウザで計測して37ミリ秒でした。これは、ブラウザが音を許可した瞬間に用意しておきたい11個の音を、毎秒48,000サンプルで生成する時間です。残りは初めて鳴るときに生成します。ダウンロード量は0バイトです。
意外な利点:テストできる
ダウンロードが小さくなるのはありがたいことです。それより役に立つのは、レシピをサンプルに変換するコードが「純粋」だという点です。ブラウザの音声システムにもページにも触れません。つまりスピーカーのないマシンでも普通のテストとして動かせて、ゲーム内のすべての音について次のことを確かめられます。
- 聞こえる。 ラウドネスが下限を上回っている。打ち間違いで無音になるレシピがあれば、ビルドが失敗します。
- クリップしない。 最大値を超えるサンプルがない。
- 壊れた値がない。 不正な数値が含まれていない。
- DCオフセットがない。 片側への一定の偏りのことで、スピーカーが「ボン」と鳴る原因になります。
- 無音で始まり無音で終わる。 だからプチッというノイズが出ない。
- 決定的である。 同じレシピからは毎回同じサンプルができる。
- ほかのどの音とも違う。 2つの効果音がうっかり同じレシピを使っていたら、テストが失敗します。
- メイン武器ごとに専用の発射音がある。 サブ武器も含め、ゲーム内のすべての武器が実在する音を指している。
どれも耳で聞いて確かめられることではありません。いちばん困る不具合(「イベントは発生しているのに何も鳴らない」)はスクリーンショットには写らず、テストプレイでも見落としがちです。プレイヤーは操作で手一杯だからです。音声ファイルだったら、誰かがヘッドホンをつけて音を一つずつ聞いて回ることになり、それも一度やったきりになるでしょう。
大群ゲームのミキサーに必要な3つのこと
画面に数百の敵が出るゲームでは、人が聞き分けられる速さを超えて音の再生要求が来ます。ルールがなければ、ミックスはぐちゃぐちゃになるか、ただの騒音になります。
音ごとに最小間隔と同時発音数の上限を決めています。 1フレームに命中イベントが50個入ることもあります。50個の音を重ねて鳴らしても、うるさいだけです。ブラウザで試したところ、命中音の同時リクエスト50件が、いまでは2ボイスになります。耳では違いがわからず、ほかの音もちゃんと聞こえます。
レシピごとにピークを正規化しています。 音同士の音量バランスは、各レイヤーの音量ではなくレシピの表で決めます。だから音の作りを調整しても、知らないうちに音量が変わることはありません。
マスター出力にリミッターを入れています。 ピーク0.3の音が40ボイス重なれば、合計は最大値を大きく超えます。最大値を超えたときにブラウザが出すのは、耳でわかる歪みです。軽めのリミッターで合計を範囲内に収めています。
ミュートとダッキングは別物
もうひとつ、以前のゲームで痛い目を見て覚えたルールがあります。ページの都合でゲームを静かにさせたいとき(たとえば広告のあいだ)、ゲームは「ダッキング」します。音をフェードアウトさせ、終わったらフェードインで戻します。プレイヤーがミュートを押したときは、ゲームはミュートになります。この2つは別々のスイッチです。1つにまとめてしまうと、広告が終わった瞬間に、静かにしたかったプレイヤーのミュートが解除されてしまいます。これもブラウザでテストしていて、ダッキング中に設定したミュートは、ダッキングが終わってもそのまま残ります。
ほかのゲームにも言えること
コードでアセットを生成する話は、たいていサイズの観点で語られます。もっと強い理由は、純粋関数で生成したものはほかのコードと同じようにテストできることです。そして音は、たいていのゲームでいちばんテストされていない部分のひとつです。機械で確認できない音は、いつか誰にも気づかれないまま壊れます。
Strandbreak Online を遊ぶ(音はオンでどうぞ)。
