1

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

2 回答 2

2

我认为你得到了爆音(必须分析波形才能确切了解原因),因为你的 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;
于 2013-06-02T21:46:51.367 回答
0

我不知道如何让波形整形器为我工作,因为我不想将 lfo 信号降到 0,而是让它这样调制不会将滤波器频率推到 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);
  }
}

这并不完美,因为如果您经常调整过滤器频率,您有时仍然会出现爆音。我认为这是因为在写入缓冲区时过滤器值可能会过时。如果您不实时编辑过滤器频率,它似乎工作正常。

于 2013-06-06T08:37:21.547 回答