当滤波器频率达到最低点时,用LFO调制滤波器节点频率时,我会弹出。
我怀疑这是由于幅度不在截止时。是否有必要调整增益?我本来希望不必这样做,但我不确定我会怎么做。
修改:忘记了示例代码http://jsfiddle.net/hyf5N/
的链接var context = new webkitAudioContext();
var lfo = context.createOscillator();
lfo.frequency.value = 10;
var saw = context.createOscillator();
saw.type = 'sawtooth';
var filter = context.createBiquadFilter();
filter.type = 'lowpass';
var gain = context.createGainNode();
gain.gain.value = 500;
saw.connect(filter);
lfo.connect(gain);
gain.connect(filter.frequency);
filter.connect(context.destination);
lfo.start(0);
saw.start(0)
答案 0 :(得分:2)
我认为你得到了流行音乐(必须分析波形以确切了解原因),因为你的LFO正在将频率从-490调制到510.(freq.value = 10,+ LFO([-1,1] )* 500.)我预计负频率会导致问题。
如果你想让它从0调制到1kHz,你可以将frequency.value设置为500,并将gain.value设置为500.(这里的关键是振荡器将从-1变为1,而不是0到1。)
整流器代码:
var waveshaper = audioContext.createWaveShaper();
var curve = new Float32Array(65536);
for (var i=0; i<32768; i++)
curve[i] = 0.0;
for (var i=32768; i<65536; i++)
curve[i] = (i/32768) - 1;
waveshaper.curve = curve;
答案 1 :(得分:0)
我无法弄清楚如何让wavehaper为我工作,因为我不想在0处将lfo信号置于最低点,而是使调制不会将滤波器频率推到0以下。我结束了像这样使用scriptProcessorNode
modulationProcessor = this.context.createScriptProcessor(4096);
modulationProcessor.onaudioprocess = function(e) {
// bottom out frequency modulation at filter.frequency == 0 to avoid popping
var input = e.inputBuffer.getChannelData(0);
var output = e.outputBuffer.getChannelData(0);
var frequency = filter.frequency.value;
for (var i = 0; i < input.length; i++) {
output[i] = (input[i] + frequency) > 0 ? input[i] : input[i] - (input[i] + frequency);
}
}
它并不完美,因为看起来如果你正在调整滤波器频率很多,你有时候仍然会弹出。我认为这是因为在写入缓冲区时,过滤器值可能会过时。如果您没有实时编辑过滤器频率,它似乎工作正常。