我是JS的新手,所以我想知道是否有人可以帮助我解决这个(对于某些)非常简单的问题。我试图使振荡器节点连接到convolverNode,以实现霍尔混响。尽管它可能很简单,但我仍然没有使它起作用。现在,有很多关于使用XMLHttpRequest加载声音时如何执行此操作的示例,但是我对使用加载的声音执行此操作不感兴趣。我想我只是想一个很好的例子,说明如何做到这一点以及如何使该振荡器与振荡器节点一起工作。这是如何制作convolverNode的基础知识,现在如何制作其余的东西呢?

// Make a source node for the sample.
var source = context.createBufferSource();
source.buffer = this.buffer;

// Make a convolver node for the impulse response.
var convolver = context.createConvolver();
convolver.buffer = this.impulseResponseBuffer;

// Connect the graph.
source.connect(convolver);
convolver.connect(context.destination);

非常感谢!

最佳答案

我想您是在问是否可以将振荡器连接到ConvolverNode,但这很容易做到:

var osc = context.createOscillator();
osc.connect(convolver);
osc.start(0);

因此,正如凯文(Kevin)猜测的那样,也许您是在尝试生成(而不是下载)脉冲响应。您实际上并不想使用振荡器-脉冲响应的长度必须是有限的。您可以在缓冲区中生成一个持续时间有限的正弦波,但这将产生与混响不同的效果。

假设您尝试通过算法生成基本的混响脉冲响应以避免下载,那么实际上相对容易实现-您可以对数衰减使用噪声。这是我前一段时间写的一个函数:
function impulseResponse( duration, decay, reverse ) {
    var sampleRate = audioContext.sampleRate;
    var length = sampleRate * duration;
    var impulse = audioContext.createBuffer(2, length, sampleRate);
    var impulseL = impulse.getChannelData(0);
    var impulseR = impulse.getChannelData(1);

    if (!decay)
        decay = 2.0;
    for (var i = 0; i < length; i++){
      var n = reverse ? length - i : i;
      impulseL[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, decay);
      impulseR[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, decay);
    }
    return impulse;
}

尝试从开始
var impulseBuffer = impulseResponse(4,4,false);

并将您的convolverNode.buffer设置为该值。那将是一个不错的开始。随心所欲玩持续时间和衰减参数。这可能不像记录的脉冲响应那么顺畅或有趣,但是它会用于大多数基本目的。

09-26 16:26