LFOを直接AudioParamインスタンスに接続するだけでは, エフェクターの実装において真価を発揮できません.
なぜなら, LFOの出力をAudioParamインスタンスに直接接続しただけでは,
その出力は, -1 ~ +1の範囲に限定されます. サンプルコード 01のビブラートなら, -1 ~ +1 Hzの範囲でしかfrequencyプロパティが変化しません.
この範囲の振れ幅だと, ビブラートがかかっている感じがほとんどありません.
LFOの出力値をコントロールするためには, LFOをAudioParamインスタンスに直接接続するのではなく,
GainNodeインスタンスに接続して, GainNodeインスタンスをAudioParamインスタンスに接続します.
そして, GainNodeインスタンスのgainプロパティを設定することで, LFOの出力値を任意の範囲にコントロールすることが可能になります.
サンプルコード 02
/*
* Add code to sample code 01
*/
// ....
// for legacy browsers
context.createGain = context.createGain || context.createGainNode;
// Create the instance of GainNode
var depth = context.createGain(); // for LFO
// OscillatorNode (LFO) -> GainNode (Depth) -> frequency (AudioParam)
lfo.connect(depth);
depth.connect(oscillator.frequency);
// Start sound
oscillator.start(0);
// Effector (Vibrato) ON
lfo.start(0);
// Set Depth
depth.gain.value = 10; // +- 10 Hz
gainプロパティのminValue / maxValueは, それぞれ0 / 1ですが,
これ以外の範囲の値に設定することも可能で, 例外は発生しません.
この動作は実装の不備ではなく, 仕様で定義されています.
サンプルコード 02では, GainNodeインスタンスのgainプロパティを10に設定しています.
したがって, OscillatorNodeインスタンスのfrequencyプロパティが, -10 ~ +10 Hzの範囲で変化することになります.
現実世界のエフェクターにおいては, LFOの出力先となるGainNodeインスタンスのgainプロパティは, Depthとしてコントロール可能になっているものが多いです.