コンプレッサーは、その名前の通り「圧縮」という意味です。楽器によって、音量が1つ1つ大きくなったり小さくなったりする場合に、音量をほどよく揃えるために使われます。
考え方としては、鳴らそうとする音の音量を常に監視しておきます。そこでは音量の「しきい値」を決めておいて、その音量より大きくなるようなら、実際に鳴らす音は音量を小さくします。
その音を鳴らし終わったら、音量はもとに戻します。
「clip~」を使って全体の音量を小さくクリップすると、もともと小さな音も小さくなって聞こえにくくなります。
このコンプレッサーを使うと大きくなった時だけ小さくするので、クリップするよりも小さな音が聞こえやすくなります。
Pdのパッチでみた方がわかりやすいので、早速つくってみます。
サウンドファイルを読み込んで、[ tabplay~ ] で鳴らすパッチです。
左上の緑色のトグルで、音のオンオフができます。
うす緑色のスライダーで、音量を調整します。
右下には、出力された音の波形をモニターします。
エフェクトの強弱をつくるため、もとの音の音量を何倍かできるようにします。オーディオ用語で「ゲイン」と言います。
ここでは、スライダーで1〜10倍になるようにしています。
ゲインを通って、音量を監視します。
音量の計測には [ env~ ] を使います。
[ env~ ] は、音の信号の振幅をデシベルの尺度で置き換え、0〜100に変換します。振幅を計算するので、1回の信号だけでは計算できず、デフォルトでは1024回分の信号をもとに計算しています。
ここでひとつ問題が発生します。
このままだと [ env~ ] を通らない音の信号と、[ env~ ] を通る音とでは1024回分の遅れが出てしまいます。
その遅れを時間に置き換えると
1秒÷44100bps * 1024 = 0.0232..秒となり、
約23ミリ秒になります。
言い方を変えると、「音を監視する処理のために23ミリ秒かかる」となります。
そこで、[ delwrite~ ] [ delread~ ] を使って24ミリ秒の遅延をかけていますが、これは「計算に23ミリ秒かかるので、それ以上遅らせる。遅れすぎずに24ミリ秒に」という遅延です。
これで音量の監視とその出力のタイミングが合うようにしています。
本当は、その後の処理にも少なからず時間がかかっているはずですが、、厳密に知るにはちょっと難しい気がします。
コンプレッサーのパラメータには、
「しきい値」と、その値を超えた音を「減衰値(0.0〜1.0)」で、どのくらい小さくするかを決めます。
[ moses ] は、右インレットに「しきい値」をセットし、左インレットに入ってくる値が、「しきい値を超えたら右アウトレットから出力。超えなければ左アウトレットから出力」するオブジェクトです。
「モーゼ」と読み、モーゼの十戒のように、しきい値をもとに出力を左右に分けるオブジェクトです。
[ moses ]で得られた「しきい値を超えた値」を、[ expr ]オブジェクトで計算します。この計算で求めたいのは「下げるべき音量」です。
計算式は、
((しきい値を超えた値 - しきい値)× 減衰値 )-(しきい値を超えた値 - しきい値)
となっています。
(しきい値を超えた値 - しきい値)という計算を読み替えると、「超えた値」のみ抽出できるので、
計算式全体は、
(超えた値 × 減衰値)-(超えた値)
となります。
この計算の意味としては「超えた値のみ減衰させて、もともとの超えた値と置き換える」となり、この値は「音量」ですので「減衰した音量」が出力されます。
さらに[ env~ ]はデシベルの尺度なので、結果としてマイナスのついた「下げるべき音量(デシベル)」が出力されます。
さらに、[ + 100 ] して [ dbtorms ] オブジェクトへつながっていきます。
これは、音量として掛け算するために、「デシベルの尺度で0.0〜100.0に変化していた値を、音量の尺度で0.0〜1.0に変換する」という意味があります。
たとえば、 デシベルの尺度で100.0のときは、音量の尺度では1.0になります。
[ expr ] からは「下げるべき音量(デシベル)」のマイナスの値が出力されました。
これを「0.0〜1.0」にしたいのですが、
もとの音量をどのくらい下げるのか、と考えます。
(もとの音量 - 下げるべき音量)
もとの音量を1倍と考えると、デシベルの尺度では100です。
「もとの音量 = 100」 と考えることができますので、[ expr ] から出力される値に [ + 100 ] しています。
これを[ dbtorms ] オブジェクトで、音量として掛け算できる「0.0〜1.0」の値に変換しています。
※ 0.0〜100.0のデシベルの尺度を、0.0〜1.0にしたいだけで、「音量を100デシベルにする」という意味ではないです。
次に、2-1. 音を出す基本のパッチので紹介した、[ line~ ] オブジェクトを使う自動的な音量調整(2-1-4. クリックノイズを軽減する)を行います。
[ moses ] で、しきい値を超えない場合は、[ t b ] で「bang」を発生させ、[ pack 1 5 ] ・[ line~ ] オブジェクトによって、
「5ミリ秒かけて1.0になる値」を生成し、音量として掛け算します。
[ moses ] で、しきい値を超える値は、下げた音量「0.0~1.0」が計算され、[ pack 0 5 ] ・[ line~ ] オブジェクトによって、
「5ミリ秒かけて0.0になる値(0.0は初期値で、入力される”下げた音量”に更新される)」を生成し、音量として掛け算しています。