Skip to content

ゲインステージング ​

ゲインステージングとは、信号がチェーンを通り抜けるあいだ、レベルを扱いやすい範囲に保つ作業のことです。マスタリングでは、コンプレッサー・エキサイター(倍音を加えて明るさを補う処理)・ステレオ系・リミッター・ラウドネスステージが、不自然なレベルに反応してしまうのを防ぐ意味があります。

良いゲインステージングは「とにかく全部小さくする」ことではありません。各処理の判断が意味を保てるだけの余裕を残すことが目的です。

1 本の目盛りに、すべての段を並べる
0-6-12-18-24-30ソースインプットゲインスレッショルドコンプレッサーサチュレーションリミッターピーク平均0 dBFS(クリップ)True Peak 上限 -1 dBTP ヘッドルームレベル(dBFS)基本は 0 dB のまま
  • ピークと平均の幅
  • 0 dBFS(クリップ)
  • True Peak 上限
各バーは、その段の平均レベルからピークレベルまでを表します。こう並べると 3 つの判断が重ならなくなります。ピークの上に空いている領域がヘッドルーム、スレッショルドは入ってくる信号と比較されるレベル、そして上限はピーク安全のための限界です。ラウドネス目標はもっと後で決まり、単位も LUFS で別物です。

基準になるレベル ​

図で使っているレベルです。最初の行は図の例として置いたソースで、残りは各コントロールとその既定値です。

チェーン上の位置レベル
図のソースピークおよそ -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 で、フェーダーの前に効きます。ミキシングの基礎を参照してください。

なぜ重要か ​

ソースが大きすぎる(レベルが高すぎる)と、すべての処理が「強い制御が必要な信号」のように振る舞いはじめます。コンプレッサーは密になりすぎ、サチュレーションはきつくなり、リミッターも不必要に深く働きます。

逆にソースが小さすぎると、各処理がほとんど反応せず、その後のラウドネス処理やリミッティングで過剰に補正することになり、根本の問題が見えにくくなります。

マスタリングでの実用チェック ​

  1. 何かを処理する前に、ソースがすでにクリップしていないか確認する。
  2. 明らかに小さすぎる/大きすぎる場合を除き、まずインプットゲインは 0 dB のままで始める。
  3. ダイナミクスは固定のしきい値(数値)ではなく、ゲインリダクション量とパンチを耳で聴いて判断する。
  4. 最終的な配信ゲインはラウドネスオプティマイザーに任せる。
  5. True Peak シーリングとラウドネス目標は、別軸として切り分けて考える。

ありがちな判断ミス ​

入力が小さいからといって、最初に大きく持ち上げる必要はありません。後段のコンプレッサーやリミッターが本来より強く反応し、密度ばかり高くて疲れるマスターになりがちです。逆に、入力を小さいままにして最後だけラウドネスを大きく稼ぐと、どの処理が何に反応しているのかが見えなくなります。

インプットゲインは「最終的に聴こえる音量」を作る場所ではなく、チェーンに入るレベルを整える場所です。最終的な配信音量はラウドネスステージで、ピーク安全性は True Peak リミッターで判断します。

ゲインステージングとラウドネス目標 ​

ゲインステージングはチェーン内部での処理の反応の話、ラウドネス目標は最終ファイルがどのレベルに着地するかという話です。片方の問題をもう片方で解決しないでください。

マスターが密になりすぎているときは、ラウドネス目標を下げて様子を見るのも有効ですが、スレッショルド・レシオ・アタック・リリース・入力レベルもセットで見直します。

libsonare で測る ​

ラウドネスステージを実行して、何が起きたかを読み取ります。appliedGainDb は、リミッターのゲインリダクションを含まない、ステージが加えた静的ゲインです。loudnessTargetLimited は、シーリングに止められて目標に届かなかったときに true になります。その場合の outputLufs は目標値ではなく、実際に到達したレベルです。

typescript
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 届かない)
python
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)
bash
sonare mastering track.wav --target-lufs -14 --ceiling-db -1 -o master.wav
# 入力 LUFS、出力 LUFS、適用ゲインを表示します

リクエストオブジェクト形式の masteringChain({ samples, sampleRate, config }) では、各ステージの設定を config の下に置きます。

実装メモ

デモではインプットゲインを狭い範囲のコントロールとして提供し、最終ゲインの担当をラウドネスステージに集約しています。これにより、コンプレッサーのスレッショルドの判断が、極端なインプットゲインの動きに引きずられにくくなっています。書き出されるレポートにはソースとレンダリング後のメトリクスが両方記録されるので、レンダリング後にゲイン操作の妥当性を後から検証できます。

実装上注意したいのは、インプットゲインを動かすと後段すべての検出器に入る信号レベルが変わるという点です。

同じ数値設定のままでも、次の段の挙動が変わります。

段インプットゲインを動かすと変わること
コンプレッサー同じスレッショルドでも、かかり方が強く/弱くなる
サチュレーション同じドライブ設定でも、歪み量が増減する
リミッターゲインリダクション量が増減する

インプットゲインを大きく動かした場合は、ダイナミクスとリミッターの設定も再確認してください。プリセットを切り替えたときは、前の設定のオフセットを意図して引き継ぐ場合を除き、インプットゲインも既定値に戻します。

関連: リペアと入力コントロール、ダイナミクスコントロール、配信ターゲット