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