ゲインステージング
ゲインステージングとは、信号がチェーンを通り抜けるあいだ、レベルを扱いやすい範囲に保つ作業のことです。マスタリングでは、コンプレッサー・エキサイター(倍音を加えて明るさを補う処理)・ステレオ系・リミッター・ラウドネスステージが、不自然なレベルに反応してしまうのを防ぐ意味があります。
良いゲインステージングは「とにかく全部小さくする」ことではありません。各処理の判断が意味を保てるだけの余裕を残すことが目的です。
- ピークと平均の幅
- 0 dBFS(クリップ)
- True Peak 上限
基準になるレベル
図で使っているレベルです。最初の行は図の例として置いたソースで、残りは各コントロールとその既定値です。
| チェーン上の位置 | レベル |
|---|---|
| 図のソース | ピークおよそ -6 dBFS、平均およそ -20 dBFS |
| インプットゲイン(デモのコントロール) | 既定は 0 dB、-12〜+12 dB で調整 |
| コンプレッサーのスレッショルド | 既定は -18 dB(レシオ 2:1、アタック 10 ms、リリース 100 ms) |
| True Peak のシーリング | 既定は -1 dBTP |
| 配信ラウドネス | シーリングとは別に loudness.targetLufs で決める |
ミキサーのストリップで同じ役割を持つのが入力トリムです。mixStereo の inputTrimDb で、フェーダーの前に効きます。ミキシングの基礎を参照してください。
なぜ重要か
ソースが大きすぎる(レベルが高すぎる)と、すべての処理が「強い制御が必要な信号」のように振る舞いはじめます。コンプレッサーは密になりすぎ、サチュレーションはきつくなり、リミッターも不必要に深く働きます。
逆にソースが小さすぎると、各処理がほとんど反応せず、その後のラウドネス処理やリミッティングで過剰に補正することになり、根本の問題が見えにくくなります。
マスタリングでの実用チェック
- 何かを処理する前に、ソースがすでにクリップしていないか確認する。
- 明らかに小さすぎる/大きすぎる場合を除き、まずインプットゲインは
0 dBのままで始める。 - ダイナミクスは固定のしきい値(数値)ではなく、ゲインリダクション量とパンチを耳で聴いて判断する。
- 最終的な配信ゲインはラウドネスオプティマイザーに任せる。
- True Peak シーリングとラウドネス目標は、別軸として切り分けて考える。
ありがちな判断ミス
入力が小さいからといって、最初に大きく持ち上げる必要はありません。後段のコンプレッサーやリミッターが本来より強く反応し、密度ばかり高くて疲れるマスターになりがちです。逆に、入力を小さいままにして最後だけラウドネスを大きく稼ぐと、どの処理が何に反応しているのかが見えなくなります。
インプットゲインは「最終的に聴こえる音量」を作る場所ではなく、チェーンに入るレベルを整える場所です。最終的な配信音量はラウドネスステージで、ピーク安全性は True Peak リミッターで判断します。
ゲインステージングとラウドネス目標
ゲインステージングはチェーン内部での処理の反応の話、ラウドネス目標は最終ファイルがどのレベルに着地するかという話です。片方の問題をもう片方で解決しないでください。
マスターが密になりすぎているときは、ラウドネス目標を下げて様子を見るのも有効ですが、スレッショルド・レシオ・アタック・リリース・入力レベルもセットで見直します。
libsonare で測る
ラウドネスステージを実行して、何が起きたかを読み取ります。appliedGainDb は、リミッターのゲインリダクションを含まない、ステージが加えた静的ゲインです。loudnessTargetLimited は、シーリングに止められて目標に届かなかったときに true になります。その場合の outputLufs は目標値ではなく、実際に到達したレベルです。
import { init, masteringChain } from '@libraz/libsonare';
await init();
const r = masteringChain(samples, sampleRate, {
loudness: { targetLufs: -14, ceilingDb: -1 },
});
console.log(r.inputLufs, r.appliedGainDb, r.outputLufs, r.loudnessTargetLimited);
// サイトの mix.wav の場合: -18.6, 4.6, -14.8, true(シーリングに止められて 0.8 LU 届かない)import libsonare as sonare
r = sonare.mastering_chain(
samples, sample_rate,
{"loudness": {"targetLufs": -14, "ceilingDb": -1}},
)
print(r.input_lufs, r.applied_gain_db, r.output_lufs, r.loudness_target_limited)sonare mastering track.wav --target-lufs -14 --ceiling-db -1 -o master.wav
# 入力 LUFS、出力 LUFS、適用ゲインを表示しますリクエストオブジェクト形式の masteringChain({ samples, sampleRate, config }) では、各ステージの設定を config の下に置きます。
実装メモ
デモではインプットゲインを狭い範囲のコントロールとして提供し、最終ゲインの担当をラウドネスステージに集約しています。これにより、コンプレッサーのスレッショルドの判断が、極端なインプットゲインの動きに引きずられにくくなっています。書き出されるレポートにはソースとレンダリング後のメトリクスが両方記録されるので、レンダリング後にゲイン操作の妥当性を後から検証できます。
実装上注意したいのは、インプットゲインを動かすと後段すべての検出器に入る信号レベルが変わるという点です。
同じ数値設定のままでも、次の段の挙動が変わります。
| 段 | インプットゲインを動かすと変わること |
|---|---|
| コンプレッサー | 同じスレッショルドでも、かかり方が強く/弱くなる |
| サチュレーション | 同じドライブ設定でも、歪み量が増減する |
| リミッター | ゲインリダクション量が増減する |
インプットゲインを大きく動かした場合は、ダイナミクスとリミッターの設定も再確認してください。プリセットを切り替えたときは、前の設定のオフセットを意図して引き継ぐ場合を除き、インプットゲインも既定値に戻します。