ゲームのサウンドデザイン
楽器は plonk が用意します。このページはその使いこなし方の話です。20 分聴いても心地よいゲーム音楽にするには何が必要か、ミックスのバランスをどう取るか、効果音を音楽の一部のように感じさせるにはどうするか、を扱います。
パートごとに居場所を分ける
いくつものパートが同じ周波数を取り合うと、ミックスは濁ります。パートはそれぞれ自分の音域に置きましょう。
| パート | 音域 | plonk では |
|---|---|---|
| キック、ベース | 250 Hz 未満 | octave: -1 のベース、drop 付きのサイン波キック |
| 和音、パッド | 250 Hz〜1 kHz | 三角波か柔らかい矩形波、attack は 0.1 より上、reverb |
| リードメロディ | 500 Hz〜3 kHz | 矩形波か三角波、オクターブ 5 |
| ハイハット、きらめき | 4 kHz 超 | フィルターをかけた noise、短い decay |
メロディを担うパートは一度に 1 つだけにします。リードと和音が同時に忙しく動いているなら、どちらかをシンプルにしましょう。
耳でバランスを取り、数値で確かめる
まずは次の音量から始めて、調整していきます。
- リードとベースがいちばん大きく、ほぼ同じくらい。
- 和音とパッドはそれより少し下。
- ドラムははっきり聞こえるけれどメロディより下。
mix()のレポートで、ミックス全体より 10〜15 LU ほど下が目安です。 - 曲全体は -16 LUFS くらい。これより大きいと効果音の入る余地がなくなります。逆にずっと小さいと、プレイヤーが音量を上げてしまい、効果音で耳をつんざかれます。
plonk のマスターバスには穏やかなコンプレッサーとリミッターが入っているので、大きな瞬間でも音割れしません。ただ、悪いバランスまでは直せません。確かめてみましょう。
import { mix } from "plonkjs";
const report = await mix(theme, 20); // ブラウザ内で 20 秒をオフラインでレンダリング
report.song.lufs; // -16.2
report.tracks.hat.belowMix; // 12.4: ハイハットがミックスより何 LU 下にあるか
report.warnings; // [] or plain words: "hat: buried (32 LU under the mix); raise its volume"mix() は、音割れ、大きすぎる曲や小さすぎる曲、無音のトラックや埋もれたトラック、濁った低域や耳に痛い高域を警告します。あなた(あるいはコーディングエージェント)が、スピーカーなしで「ドラムが聞こえない」に気づくための道具です。ただし、メロディが耳に残るかどうかはわかりません。そこはやはり人の耳が必要です。
変化をつけて聴き疲れを防ぐ
プレイヤーはあなたのループを 20 分聴き続けるかもしれません。小さな変化が曲を生き生きと保ちます。
- ゴーストノートとアクセント:
x x_ x x_は息づき、強拍のC5!はメロディに形を与えます。 - 確率:
x?40は 40% の確率で鳴ります。ハイハットやパーカッションに少し確率を混ぜると、まったく同じ繰り返しになりません。確率にはシードがあるので、同じ曲は毎回同じように鳴り、テストも安定します。 - フィル: トラックにパターンのリストを渡すと、セクションが鳴るたびに 1 つずつ順番に使います。2 回に 1 回ドラムフィルを入れると、フレーズの区切りがはっきりします。
- セクション: 長いループ 1 本より、2〜3 個のセクション(
a a b a)のほうが勝ります。B セクションでは調の色合いを変えたり(長調の曲で短調に寄るなど)、ドラムを抜いたりできます。 - 長さ: 1 周 30〜60 秒あれば耳障りにならず、それでいてサイズはとても小さいままです。
音楽を反応させる
たくさんの曲を用意するより、1 曲をその場面に合わせて曲げるほうが効果的です。
- メニューやマップではドラムを抜き(
layer("kick", 0))、プレイ中に入れます。 - 残り時間が少なくなったら速くします(
tempo(1.12))。急に跳ばないようにしましょう。 - 大きな瞬間には音楽を薄くして、効果音が聞こえるようにします。
音楽をゲームに反応させるも見てください。
効果音を曲の調に合わせる
音楽を無視した効果音は、音楽とぶつかります。player.sfx() は、曲の調の音階の度数で楽器を鳴らします。
const POP = { wave: "sine", drop: 7, decay: 0.12, sustain: 0, volume: 0.3 };
const CLIMB = [1, 3, 5, 8, 10, 12];
// 連鎖のステップごとに、曲のアルペジオを 1 音ずつ上がってポップする。雑音ではなく小さなメロディになる。
player.sfx(POP, { degree: CLIMB[combo - 1], octave: 5 });そして、大きな瞬間は拍に合わせて鳴らします。
player.sfx(FANFARE, { degree: 1, quantize: "beat" }); // 次の拍まで待つ
for (const [k, d] of [1, 3, 5, 8].entries()) player.sfx(BELL, { degree: d, quantize: "beat", after: k * 2 });お祝い、レベルの終わり、スティンガーはクオンタイズしましょう。プレイヤー自身のタップやポップは決してクオンタイズしないでください。たとえ 0.1 秒でも待たされる反応は、もたついて感じられます。
ムード:テンポと調
| 雰囲気 | テンポ | 調 |
|---|---|---|
| 落ち着いた、パズル、メニュー | 80〜100 bpm | 長調、ペンタトニック |
| 弾むような、遊び心のある | 100〜130 bpm、少しの swing | 長調、ミクソリディアン |
| 不気味、謎めいた | 70〜110 bpm | 短調、ドリアン、フリジアン |
| 緊迫、切迫 | 130〜160 bpm | 短調、またはメインテーマを速くする |
pentatonic の調にはぶつかる音がないので、ランダムなメロディや自動生成したメロディにはいちばん安全です。
plonk にできないこと
plonk はシンセサイザーです。サンプリングはできないので、録音したドラムや声、生楽器は使えません。リバーブもシンプルな部屋鳴りです。数キロバイトで済むチップチューンやシンセポップのサウンドトラックにはよく合いますが、オーケストラのスコアには向きません。