ゲーム一覧へスキップ
Hadukis

ブログ

効果音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 を遊ぶ(音はオンでどうぞ)。