コンプレッサーは振幅の大きな音を (相対的に) 小さく, 振幅の小さな音を (相対的に) 大きくすることによって, クリッピング (振幅値のオーバーフロー) による意図しない歪みを防止しつつ, 迫力のあるサウンドに変化させるエフェクトです.
音楽ジャンルにもよりますが, ロックやポップスのレコーディングには必ず利用されるエフェクターです.
コンプレッサーは振幅の大きな音を (相対的に) 小さく, 振幅の小さな音を (相対的に) 大きくすることによって, クリッピング (振幅値のオーバーフロー) による意図しない歪みを防止しつつ, 迫力のあるサウンドに変化させるエフェクトです.
音楽ジャンルにもよりますが, ロックやポップスのレコーディングには必ず利用されるエフェクターです.
Web Audio APIでコンプレッサーを実装することは, エフェクターの実装において, おそらくもっとも簡単です. なぜなら, コンプレッサーのためのDynamicsCompressorNodeクラスが定義されており, そのインスタンスを生成して接続するだけでコンプレッサーとして利用できるからです.
また, コンプレッサーは原音の振幅を相対的に増減させる必要があるので, インサート型エフェクトです. つまり, 入力ノードをDynamicsCompressorNodeに接続し, DynamicsCompressorNodeをAudioDestinationNodeに接続します. LFOやフィードバックの接続などが不要なので, ノード接続も非常にシンプルです.
そして, 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) を描画することにより, 現在のパラメータ設定におけるコンプレッサーの特性をリアルタイムに視覚化しています.
このセクションでは, DynamicsCompressorNodeで定義されているプロパティ (パラメータ) とコンプレッサーの原理について解説します. とりあえず, コンプレッサーが実装できればOKという場合はスルーしてください.
DynamicsCompressorNodeインスタンスには, 6つのプロパティが定義されています (表2 - 10 - a). そして, threshold・knee・ratio・attack・releaseが設定可能なプロパティです. これらの設定可能なプロパティはすべてAudioParamインスタンスです.
Property | Description | Unit |
---|---|---|
threshold | コンプレッサーをかけるゲインのしきい値 | dB |
knee | しきい値を超えた振幅の変化のカーブする範囲 | dB |
ratio | しきい値を超えた振幅を圧縮する比率 | None |
attack | ゲインを10dB減衰させるために必要な時間 | sec |
release | ゲインを10dB増幅させるために必要な時間 | sec |
reduction | コンプレッサーの動作による, 現在のゲインの減衰量. 読み取り専用 | dB |
Property | Default | Min | Max |
---|---|---|---|
threshold | -24 dB | -100 dB | 0 dB |
knee | 30 dB | 0 dB | 40 dB |
ratio | 12 | 1 | 20 |
attack | 0.003 sec | 0 sec | 1 sec |
release | 0.250 sec | 0 sec | 1 sec |
単位に, dB (デシベル) が利用されていますが, dBに関してはサウンドの視覚化のページで簡単に解説しています. 振幅を別の視点でとらえた単位なので, とりあえずは振幅のことと理解していただいてもOKです.
コンプレッサーの特性を大きく決定づけるのは, threshold (しきい値) とratio (レシオ値)です. そこで, この2つのパラメータの観点からコンプレッサーの原理を解説したいと思います.
しきい値とは, 振幅の圧縮をするかどうかを判断する基準値のことです. しきい値を超えた振幅は圧縮されます (逆に, しきい値以下の振幅はそのままになります).
したがって, しきい値を小さくすれば比較的落ち着いたサウンドになり, 大きくすれば比較的迫力のあるサウンドになります.
レシオ値とは, (しきい値を超えた) 振幅を圧縮する比率のことです. 例えば, レシオ値が2の場合には, しきい値を超えた振幅を1 / 2に圧縮します. すなわち, しきい値としきい値を超えた振幅の1 / 2の総和がコンプレッサーをかけた結果の振幅となります.
同様に, レシオ値が4の場合には, しきい値を超えた振幅を1 / 4に圧縮します. したがって, しきい値としきい値を超えた振幅の1 / 4の総和がコンプレッサーをかけた結果の振幅となります.
つまり, レシオ値が大きいほどしきい値を超えた振幅がより圧縮されることになり, 相対的に音が小さくなります.
ちなみに, レシオ値が1の場合には, まったく圧縮をしないのでコンプレッサーをかけないのと同じです.
ちなみに, しきい値を超えた振幅を一律にしきい値に設定するエフェクトは, リミッターと呼ばれます. 音信号処理の視点では, リミッターはレシオ値が ∞ (無限大) となっているコンプレッサーのことです.
振幅を圧縮することによって, 相対的に振幅を増幅する余地が発生します. このことを利用して, コンプレッサーは振幅の小さな音を相対的に大きくする機能ももちます. ただし, Web Audio APIにおけるコンプレッサー, つまり, DynamicsCompressorNodeでは, この処理を決定づけるためのプロパティはなく, 設定可能な5つのプロパティから自動で算出される実装になっているようです.
このページでは, コンプレッサーの実装と原理を解説しました. そのエッセンスは, DynamicsCompressorNodeクラスに集約されているので, DynamicsCompressorNodeの仕様を簡単にまとめておきます.
Property | Description | Unit |
---|---|---|
threshold | コンプレッサーをかけるゲインのしきい値 | dB |
knee | しきい値を超えた振幅の変化のカーブする範囲 | dB |
ratio | しきい値を超えた振幅を圧縮する比率 | None |
attack | ゲインを10dB減衰させるために必要な時間 | sec |
release | ゲインを10dB増幅させるために必要な時間 | sec |
reduction | コンプレッサーの動作による, 現在のゲインの減衰量. 読み取り専用 | dB |
また, コンプレッサーの原理上, 重要なプロパティとなるのがthresholdとratioです.