我是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);
非常感谢你!
答案 0 :(得分:6)
我想你问你是否可以将振荡器连接到ConvolverNode,但这很容易做到:
var osc = context.createOscillator();
osc.connect(convolver);
osc.start(0);
所以也许正如凯文所猜测的那样,你试图产生(而不是下载)一个脉冲响应。你真的不想使用振荡器 - 脉冲响应的长度必须是有限的。你可以在一个缓冲区中生成一个有限持续时间的正弦波,但这会做一些不同于混响的事情。
假设你试图通过算法生成一个基本的混响脉冲响应来避免下载,它实际上相对容易做到 - 你可以在对数衰减时使用噪声。这是我刚才写的一个函数:
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设置为。这将是一个不错的开始。根据需要玩持续时间和衰变参数。这可能不像记录的脉冲响应那样平滑或有趣,但它可以用于大多数基本目的。
答案 1 :(得分:0)
现在,有很多关于如何在加载声音时执行此操作的示例 使用XMLHttpRequest,但我对它没有兴趣 加载声音。
卷积器需要一个包含脉冲响应的AudioBuffer
。如果没有尝试以编程方式创建一个(这可能会非常困难),那么您将需要通过XHR加载一个。
如果你有一点谷歌,你可以找到很多免费的脉冲响应作为WAV或MP3文件。