使用web音频将convolverNode连接到oscillatorNode - 这是一种简单的方法

时间:2014-03-20 07:13:31

标签: javascript web-audio

我是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);

非常感谢你!

2 个答案:

答案 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文件。