コンプレッサーとは?

コンプレッサーは振幅の大きな音を (相対的に) 小さく, 振幅の小さな音を (相対的に) 大きくすることによって, クリッピング (振幅値のオーバーフロー) による意図しない歪みを防止しつつ, 迫力のあるサウンドに変化させるエフェクトです.

音楽ジャンルにもよりますが, ロックやポップスのレコーディングには必ず利用されるエフェクターです.

コンプレッサー

Web Audio APIでコンプレッサーを実装することは, エフェクターの実装において, おそらくもっとも簡単です. なぜなら, コンプレッサーのためのDynamicsCompressorNodeクラスが定義されており, そのインスタンスを生成して接続するだけでコンプレッサーとして利用できるからです.

また, コンプレッサーは原音の振幅を相対的に増減させる必要があるので, インサート型エフェクトです. つまり, 入力ノードをDynamicsCompressorNodeに接続し, DynamicsCompressorNodeをAudioDestinationNodeに接続します. LFOやフィードバックの接続などが不要なので, ノード接続も非常にシンプルです.

コンプレッサーのノード接続

図2 - 10 - a. コンプレッサーのノード接続

コンプレッサーはエフェクト音のみの出力であるインサート型のエフェクトです.

そして, DynamicsCompressorNodeインスタンスを生成するためには, AudioContextインスタンスのcreateDynamicsCompressorメソッドを利用します.

サンプルコード 01


window.AudioContext = window.AudioContext || window.webkitAudioContext;

// Create the instance of AudioContext
var context = new AudioContext();

// Create the instance of DynamicsCompressorNode
var compressor = context.createDynamicsCompressor();

// Create the instance of OscillatorNode
var oscillator = context.createOscillator();  // for Input

// for legacy browsers
oscillator.start = oscillator.start || oscillator.noteOn;
oscillator.stop  = oscillator.stop  || oscillator.noteOff;

// Connect nodes for effect (Compressor) sound
// OscillatorNode (Input) -> DynamicsCompressorNode (Compressor) -> AudioDestinationNode (Output)
oscillator.connect(compressor);
compressor.connect(context.destination);

// Start sound
oscillator.start(0);

以上でコンプレッサーが完成しました.

パラメータの設定はしなくていいのか?と思われるかもしれませんが, デフォルトの値 (表2 - 10 - b) でも十分にコンプレッサーとして機能します. もちろん, パラメータを変更することも可能なので, その詳細は次のセクションで解説することにします.

まずは, デモ 29・デモ 30でコンプレッサーの効果を試してみてください. ちなみに, デモ 29・デモ 30では, DynamicsCompressorNodeインスタンスのreductionプロパティ (表2 - 10 - a) を描画することにより, 現在のパラメータ設定におけるコンプレッサーの特性をリアルタイムに視覚化しています.

デモ 29 (サウンド)

デモ 30 (オーディオ)

コンプレッサーのパラメータ

このセクションでは, DynamicsCompressorNodeで定義されているプロパティ (パラメータ) とコンプレッサーの原理について解説します. とりあえず, コンプレッサーが実装できればOKという場合はスルーしてください.

DynamicsCompressorNodeインスタンスには, 6つのプロパティが定義されています (表2 - 10 - a). そして, thresholdkneeratioattackreleaseが設定可能なプロパティです. これらの設定可能なプロパティはすべてAudioParamインスタンスです.

表2 - 10 - a. DynamicsCompressorNodeインスタンスのプロパティ
PropertyDescriptionUnit
thresholdコンプレッサーをかけるゲインのしきい値dB
kneeしきい値を超えた振幅の変化のカーブする範囲dB
ratioしきい値を超えた振幅を圧縮する比率None
attackゲインを10dB減衰させるために必要な時間sec
releaseゲインを10dB増幅させるために必要な時間sec
reductionコンプレッサーの動作による, 現在のゲインの減衰量. 読み取り専用dB
表2 - 10 - b. DynamicsCompressorNodeインスタンスのプロパティの値
PropertyDefaultMinMax
threshold-24 dB-100 dB0 dB
knee30 dB0 dB40 dB
ratio12120
attack0.003 sec0 sec1 sec
release0.250 sec0 sec1 sec

単位に, dB (デシベル) が利用されていますが, dBに関してはサウンドの視覚化のページで簡単に解説しています. 振幅を別の視点でとらえた単位なので, とりあえずは振幅のことと理解していただいてもOKです.

コンプレッサーの特性を大きく決定づけるのは, threshold (しきい値) とratio (レシオ値)です. そこで, この2つのパラメータの観点からコンプレッサーの原理を解説したいと思います.

しきい値 (Threshold)

しきい値とは, 振幅の圧縮をするかどうかを判断する基準値のことです. しきい値を超えた振幅は圧縮されます (逆に, しきい値以下の振幅はそのままになります).

コンプレッサーのしきい値

図2 - 10 - b. コンプレッサーのしきい値

赤い領域に重なる振幅が圧縮の対象となります.

したがって, しきい値を小さくすれば比較的落ち着いたサウンドになり, 大きくすれば比較的迫力のあるサウンドになります.

レシオ値 (Ratio)

レシオ値とは, (しきい値を超えた) 振幅を圧縮する比率のことです. 例えば, レシオ値が2の場合には, しきい値を超えた振幅を1 / 2に圧縮します. すなわち, しきい値としきい値を超えた振幅の1 / 2の総和がコンプレッサーをかけた結果の振幅となります.

コンプレッサーのレシオ値 (レシオ値が2の場合)

図2 - 10 - c. コンプレッサーのレシオ値 (レシオ値が2の場合)

しきい値としきい値を超えた振幅をレシオ値で除算した値の総和が圧縮後の振幅となります.

同様に, レシオ値が4の場合には, しきい値を超えた振幅を1 / 4に圧縮します. したがって, しきい値としきい値を超えた振幅の1 / 4の総和がコンプレッサーをかけた結果の振幅となります.

コンプレッサーのレシオ値 (レシオ値が4の場合)

図2 - 10 - d. コンプレッサーのレシオ値 (レシオ値が4の場合)

レシオ値が2のときよりも, 大きく圧縮されて, 振幅がより小さくなっていることに着目してください.

つまり, レシオ値が大きいほどしきい値を超えた振幅がより圧縮されることになり, 相対的に音が小さくなります.

ちなみに, レシオ値が1の場合には, まったく圧縮をしないのでコンプレッサーをかけないのと同じです.

コンプレッサーのレシオ値 (レシオ値が1の場合)

図2 - 10 - e. コンプレッサーのレシオ値 (レシオ値が1の場合)

レシオ値が1の場合には, しきい値を超えた振幅は維持されるのでコンプレッサーをかけないのと等価です.

ちなみに, しきい値を超えた振幅を一律にしきい値に設定するエフェクトは, リミッターと呼ばれます. 音信号処理の視点では, リミッターはレシオ値が ∞ (無限大) となっているコンプレッサーのことです.

リミッター (レシオ値が ∞ の場合)

図2 - 10 - f. リミッター (レシオ値が ∞ の場合)

レシオ値が ∞ (無限大) の場合には, しきい値を超えた振幅は一律にしきい値となります.

振幅を圧縮することによって, 相対的に振幅を増幅する余地が発生します. このことを利用して, コンプレッサーは振幅の小さな音を相対的に大きくする機能ももちます. ただし, Web Audio APIにおけるコンプレッサー, つまり, DynamicsCompressorNodeでは, この処理を決定づけるためのプロパティはなく, 設定可能な5つのプロパティから自動で算出される実装になっているようです.

コンプレッサー まとめ

このページでは, コンプレッサーの実装と原理を解説しました. そのエッセンスは, DynamicsCompressorNodeクラスに集約されているので, DynamicsCompressorNodeの仕様を簡単にまとめておきます.

インスタンス生成
createDynamicsCompressorメソッド
ノード接続
インサート型
プロパティ
表2 - 10 - c. DynamicsCompressorNodeインスタンスのプロパティ
PropertyDescriptionUnit
thresholdコンプレッサーをかけるゲインのしきい値dB
kneeしきい値を超えた振幅の変化のカーブする範囲dB
ratioしきい値を超えた振幅を圧縮する比率None
attackゲインを10dB減衰させるために必要な時間sec
releaseゲインを10dB増幅させるために必要な時間sec
reductionコンプレッサーの動作による, 現在のゲインの減衰量. 読み取り専用dB

また, コンプレッサーの原理上, 重要なプロパティとなるのがthresholdratioです.