Web音频过滤节点弹出



当滤波器频率触底时,用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)

我认为你得到pop(将不得不分析波形,看看究竟为什么),因为你的LFO调制频率从-490到510。(freq.value = 10, + LFO ([-1,1]) * 500.)我想是负频率引起了问题。

如果你想让它从0到1kHz调制,你可以设置频率。值为500,并获得增益。值为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;

我不知道如何使整形器为我工作,因为我不想在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);
  }
}

这是不完美的,因为它似乎如果你正在调整过滤器的频率很多,你仍然可以得到弹出有时。我认为这是因为过滤器值在写入缓冲区时可能会过时。如果你没有实时编辑过滤器频率,它似乎工作得很好。

最新更新