DAW で Gain 調整をインサートしまくる話

 Ableton の細かい話は以下にまとめてます。

***

 「insert に物を挿せば挿すほど音悪くなる」は DAW でもそうなのか?

 アナログ回路では、「理論上、信号に何も変化を与えてない(つもり)」でも、部品の数や信号経路の長さが増していくにつれ、外来ノイズや誤差が積もって理想の信号からは離れていく。

 ではデジタルではどうか。意図しないノイズの混入、あるいは意図しない計算のミスなどはあるか。あったらどのくらいの規模か。

 Ableton の Utility の Gain に限ってかるく実験する。Utility というのは Ableton で最もシンプルなエフェクトで、音量を変えたりパンを振ったりできる。近年機能が増えたが……

スクリーンショット 2021-10-22 22.07.42

 おれの事前予想としては、
 「ロービット、あるいは int型だけの時代ならさておき、現代の DAW で32bit float の内部演算で単純な音量増減をいくら繰り返しても信号のクオリティはまず変わんねーだろ。100均の電卓でも高級文具メーカーの電卓でも、1+1 を叩いた答えは2になる。単純な計算に性能は要求されない。変わるって言うやつはアナログのマナーが染み付いてるだけじゃね?」
 であるが、果たして……


実験0

Q. 同じ内容のトラックを、同じだけ Gain 下げた場合、出音に思わぬ差があったりする?

スクリーンショット 2021-10-11 16.39.46
  1. とあるオーディオファイル (normalized) をトラックに貼り、複製する。

  2. それぞれトラック A, B として、Aは -12 dB する。

  3. B は上図のように、L/R それぞれの正負を逆相にしたうえで、同様に -12 dB する。

  4. Master の Peak Level を見る。(SPAN を使う。Session View Mixer の Peak 表示は -120 dBFS より小さい音は見えない……)

結果: - Inf dBFS から不動。

 そうであってくれなきゃ困るね。

 今回やっているのは、「一致している2つの音は、片方を正負逆相にしてから足し合わせると、消える」前提をもとにした簡易的なテストだ。
 本来は、ちゃんと書き出してバイナリ一致を確認したりする方が厳密だ。
でもめんどくさい。なのでこの実験0を行い、この簡易手法も有効っぽいことを確認した。


実験1 二段階に分けてみる

Q. -12 dB したい時に、-12 dB するデバイス1つ使うのと、-6 dB するデバイス2つを直列に使うと結果は異なるか?

 算数で言えば「100-12と、100-6-6の答えは一緒か?」あるいは「100÷2^2と、100÷2÷2の答えは一緒か?」みたいな話なので、理屈上は変わらないはずだが……

スクリーンショット 2021-10-11 16.41.26

 さっきの状態から、トラックB のほうだけ、-6 dB の Utility 2個にしてみる。

結果: - 150.5 dBFS 振れた。

 この -150 dBFS ってどんなもんかというと、モノスゴく小さいと思ってほしい。音量は -6 dB するごとに半分になるので、-150 dBFS は元sample の3000万分の1未満となる。
Ableton内 peak 値表示ですら -120 dBFS 以下は表示不可、世の DAC製品のS/N比もまあ高品質なもので -120 dB 台、平凡な機種で -90 dB 台? 音楽CDのデータ (16bit int) は -98 dB 未満は無音として扱われる。
 それよりさらに何百分の1程度の、ちいせえ〜誤差が出たって話。


実験2 もっと多段階に分けてみる

Q. 実験1では、Utility を2個に増やしたら誤差が発生した。では、Utility をもっと増やしたらどうだろう?

スクリーンショット 2021-10-11 19.32.58

 またBの方だけを変更。-12 dB 減らすために、-1.0 x 12回にわけてみる。
 また、-0.1 x 120回の場合、-0.01 x 1200回の場合も確認する。

結果:誤差は増えた。ここまでをまとめると、

1段階: -inf dBFS
2段階:-150.5 dBFS
12段階:-138.5 dBFS
120段階:-127.6 dBFS
1200段階:-103.7dBFS

 段階数を増やすほど、誤差は大きくなる。


実験3 その他の検証

3.1 この誤差って、どういう音なの?

 このちいせえ誤差の音量を上げて耳で聴いてみると、「元音に似ているが、きつく潰したような、低域成分の少ないサウンド」になっていた。

 これが「原音に、音量調整以外の処理が加えられている」ものか、「原音の音量をシンプルに下げまくった時にビット方向の解像度の限界でクランチーになった」ものかは判断しづらい。


3.2 別のサンプルで検証すると、印象は変わる?

 あまり変わらない。もう一種類試した (同じくnormalized) ら、同じだけ差分 peak値が出た。つまり、Utility が2つであれば、-150.5 dBFS。誤差の出方は sample の内容にかかわらない可能性がある。

A/B両方を、Utility より手前で -6 dB すれば、差分値は -156.5 dBFS になった。変化量が一致している。


3.3 レンダリングするとどう?

 ここまでは、arrangement view で鳴らした audio clip に対して、master に挿した SPAN の peak meter をリアルタイムプレイバックでみていた。

 ではレンダリングするとどうか? master 出力を 32bit float でレンダリング  ‥‥すなわちオフラインバウンスする。と、生成された波形ファイルでも同様の差分が確認できた。

 プレイバックでも、オフラインバウンスでも、結果は一緒そうだ。


3.4 SPAN 以外のメータでは?

 -150 dB のピークをちゃんと測定できるメータをろくにもってないことに気づいた。

 実験2で、1200個の Utility を並べた際の差分は -103.7 dB だった。これは SPAN だけでなく、session view の備え付けのピークメータ数値でも確認できた。

 3.1で示したように、差分はゲインアップすれば耳に聴こえる。3.3で書き出したファイルもノーマライズすれば波形として目に見える。なので SPAN の測定ミスではなく、実際に誤差が生じていることは間違いないだろう (数値への確証は無いが……)。


実験4 Utilityの個数だけが問題になるのか?

Q. まったく Gain 操作を行わないとしたらどうだろう?

スクリーンショット 2021-10-23 2.30.57

 Aには何も挿さず、Bは逆相にした後で、Gain +0 dB つまり無操作の Utility を複数置いてみる。

結果:いくつ置いても差分はなし。master peak level は -inf dBFS のまま。

 とりあえず1200個置いてみてもセーフ。


実験5 ゲインプラス操作を含むとどうか

 実験1, 2ではマイナスの計算だけをいくつも連続させた。では、プラス操作とマイナス操作の両方を行ったら結果は変わるだろうか?

スクリーンショット 2021-10-23 3.35.20

  Aには何も挿さず、Bは逆相にした後で、「-n dB し、+n dB する」。

結果:差が出た。

n = 0.000001 〜 0.000006 : -228.8 dBFS
n = 0.000007 : -168.6 dBFS
n = 0.000008 〜 16.999999 : -144.5 dBFS
n = 17 〜 18 : -135.0 dBFS
n = 18.000001 〜 18.009999 : -144.5 dBFS
n = 18.01 : -138.5 dBFS
n = 18.02 〜 18.06 :  -144.5 dBFS
n = 18.065 : -128.9 dBFS
n = 18.07 〜 30 : -138.5 dBFS

 ご覧のように、もはや単調増加ですらない。波打っていて、"〜"で省略した中にも様々な外れ値がひそんでいるだろう。

 18.065 を試した時に一番大きな値が出たのはビックリした。もしやと思って、半分の 9.0325 を試したら -132.5 dBFS という見慣れない数値も出てきた。

 nが1だろうが16だろうが差分量が固定というのもおもしろい。周期性があるのか? なかなか想像がつかない。いまこれを書きながら n = 4を試したら -135 dBFS だった。何もわからない。

 AとBの間で誤差を確認したあとで、両者のトラックボリュームを同じだけ下げてみた。両者を -1 dB ずつしたら、誤差が 1 dB 減るかと思いきや変わらなかった。やはりそんな単純な計算ではない。

 Live 11 時点の Utility の Gain ノブは、センターがゼロで、+側が max 35 dB、-側が min -69.7……の次に -inf dB という並びになっている。もし、この左右不均衡に対して、数値分解能がそのまま角度単位で割り当てられていて、数値入力した時は分解能上の近い値に吸着しているとしたら…… -nと+nで数値が異なるから誤差が出たり、ヘンなn値で外れ値が出てくることの説明にもなりうるか? ん〜


考察

 えー、実験0〜5を経て、とくに5の結果が難解すぎて、明確な解答予想をすることはできなかった。それでもなんとか、言えそうなことをまとめると、

  • 理屈上は同一結果になるゲイン処理も、回数を増やしたり段階を分けたりすると、計算誤差が生じる

  • この誤差は「Utility には微小なノイズ (= sample とは関係ない外来の音) があり、挿すほど積み重なる」ということではないだろう (実験4参照。まあ Gain +/- 0 dB の時だけノイズ源を bypass している可能性とか言い出すとキリないが)。

  • そうではなく、Gain 増減の数学的精度の誤差の話ではなかろうか。


  • 基本的に処理回数が増えるほど、誤差は大きくなる連関が見て取れる。

  • これはおそらく、ユーザ入力した数値と処理実行される時の値にわずかな差があるんじゃなかろうか。表示上は小数点以下含め3桁しか見えないが、もっと細かい入力も受け付けてはいるので、どこかしらで切り捨ては発生している

  • たとえばそれが「10進数の小数点第何位」ではないルールで動いているとしたら、-12 ≠ -6 -6 というシチュエーションに一応説明はつきうるし、処理回数が増えるほど誤差が堆積するのもわかる。

(追記:離散化誤差じゃねえか?というコメントをもらった。おれが↑で言ったのは Gain に入力した値の精度に関するものだったが、そうじゃなくて、その Gain 操作が波形に適用される時の計算精度のほうの問題、と。ありうるよなー float の精度が真に活きるのは -inf 近辺 (および 0 dBFS オーバー) で、ふつうの振幅レンジでは所詮 2^24 ちょいの分解能なわけだしー)

  • 経過中の処理の振れ幅と誤差の連関は不明。

  • 無処理の Utility を増やすだけならばなにも起きない。誤差を生じさせているのは、Utility を通すことそのものではなく、そこで処理を行うことに拠る。

  • ただしいずれの誤差も異常に小さいレベルの話である。人の耳が良いとかいう話で判断できるレベルを大きく逸脱しているし、CD の規格なんかからいったら記録すら不可能。通常行わないほど過度な処理 (1000個以上の Utility を挿すなど) ですら -100 dB に乗ってこないなど。

  • よく DAW の内部演算が float である理由について「1度の編集処理にそんな精度は不要だとしても、制作中は1つの波形を何十回、100回と加工することがありえるから」と話されるが、千回以上いじることはあまりないだろうから、「この誤差が積み重なることで人の耳に判別可能なエラーが表出する」可能性もまずないと思っていいんじゃなかろうか。

  • そしてこの誤差って「同じ結果を得るために、簡易な処理 (あるいは無処理) と、過度に複雑な処理したものを比較した時」の差のことを言っている。通常、とくに制作において、Utility を100個挿すことがたとえあったとしても、それを Utility 1個の場合と比較する場面はまずないのだ。「理屈上の正解」しか存在しない時に「実践上の誤り」は存在すらしないのでは?


 いくら「めっちゃ小さいから」「意識される場面がないから」と言われても、理屈にあわない状況があるかないかで言ったら、ある。それを気持ち悪く思ったり、ネガティブに捉える人もいるだろう。気持ちはわかるし否定もしないが、そういう人は、ページビューを稼ぎたい過激な見出しのネット記事や、法人のやっている煽り Twitter アカウントなどに振り回されないように人一倍気をつけてください (余計なお世話)。

 有無自体も大事だが、そのスケールを定量的に認識し、それが自分の作業、ひいては自分の価値観にどう影響するかを腰を据えて評価することのほうがずっと大事だとおれは思う。DAW は制作ツールであり、測定器ではないのだから。

 「じゃあなんでこんな記事書いてんだ。お前は音楽家じゃなかったのか」と言われると、いや、なんでこんなんやってんスかね、ハハ……


 煮え切らない着地ですが終わり

投げ銭いただけたら、執筆頻度が上がるかもしれません