2010/06/08

コンプの原理

JAVAでエフェクト・コンプレッサー自作の記録 7
オーソドックスなコンプのパラメーター
Threshold
日本語で閾値。ここで決めた音量以上なら音を圧縮する。単位は普通dBだが、リニア表示を採用しているコンプも見かける。ピークを削る場合はリニア表示の方が見やすかったりする。ここではオーソドックスにdBを採用。

Ratio
圧縮の比率の設定。Ratioは「入力信号 : 出力信号」の比率となる。1:1なら変化なしで、2:1なら入力音量の1/2となる。Ratioは、入力信号の値が変化させて設定するため分かりにくいと思う。実際あれこれ見ていると混乱している印象を受ける。コンプによっては違う考え方を採用しているものもある。その方がよいかもしれない。でも、ここではオーソドックスにしたいので従来からのパラメーターに従いたい。

Attack
閾値を超えてから何ミリ秒後に圧縮を開始するかを設定。VSTプラグインのコンプを見ていると0.5msecからの設定が多いのだが、今回作るのは0msecを実現しようと思う。リアルタイムコンプでないので可能。信号を先読みして評価してから加工している。ここが大きな特徴となる。

Release
閾値以下になったとき、何ミリ秒後に圧縮をやめるかを設定。Releaseの設定は音色に大きく影響を及ぼす。

Gain
出力する際の音量を調整する。実は個人的には使わないパラメーター。普通あるので仕方なく採用。

他にもKneeといって、波形を滑らかにするようなパラメータもよく見かける。今回はオーソドックスなパラメーターだけで、理屈通りな効果を実現したいのでKneeは考えない。そもそもKneeは必要性を感じない。

コンプを作るに当たって以下のサイトで勉強した。基本となる考え方が書いてあるので、これを元にアルゴリズムを考えた。
http://en.wikipedia.org/wiki/Dynamic_range_compression

作ってみたら何かダメ
理屈どおりに作ったら、音が歪んでしまった。アルゴリズムの修正を行うことにする。現状のコンプはCliping処理になっているので、これはやめたほうがいいと思えた。ClippingはHardとSoftがある。ハードはぶった切る処理で、ソフトは頭を任意に圧縮したかんじ。ソフトがやりたくて、Compressorを作ったのだが、どうも音質劣化が気に入らない。下図のようになる。上段がソフトで、下段がハード。理屈どおりに作ると、ほとんどの設定で歪を感じることになる。
そこで波形の全体のレベル調整をするコンプでも作ろうかと思う。これは、波形を崩さず、波形全体を圧縮する。つまり単なるボリュームなのだが、半周期ごとに処理するというもの。突然のピークノイズだけを圧縮するという考え。

実際にはピークが数箇所程度であり、それだけを圧縮したいということがよくある。ひじょうに狭いアタックを削るので、アタックタイムが0msecにできない通常のコンプでは無理なのだ。

アルゴリズム
波形を細かくチェックして処理をするかどうかを判定していく。ひとつの周期は、0を通過した時点でカウント。プラスとマイナスを別に扱うことで、対称でない波形にも対応。頭の中でイメージすると膨大な計算量になるのだが、実際やってみると、あっけなく処理が終わる。すごいなコンピュータ。


コンプ製作の記録
1 Java 具体的に作ってみる
2 WAVについて
3 dBについて
4 コンプに必要な情報
5 Eclipseの導入
6 Nimbus
7 コンプの原理
8 コンプレッサーベータ版完成
9 NAMAGI Compressor