gpt4 book ai didi

javascript - 将 convolverNode 连接到带有网络音频的振荡器节点——简单的方法

转载 作者:搜寻专家 更新时间:2023-11-01 05:23:15 25 4
gpt4 key购买 nike

我是 js 的新手,所以我想知道是否有人可以帮助解决我正在处理的这个(对于某些)非常简单的问题。我正在尝试将一个振荡器节点连接到一个卷积节点,以实现大厅混响。即使它可能非常简单,我仍然没有让它工作。现在,有很多示例说明如何使用 XMLHttpRequest 加载声音,但我对加载声音感兴趣。我想我只是渴望一个好的和超短的例子/ fiddle 来说明如何完成以及如何使缓冲区与 oscillatorNodes 一起工作。这是如何制作卷积节点的基础知识,现在如何制作其余部分?

// 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);

非常感谢!

最佳答案

认为您是在问是否可以将振荡器连接到卷积节点,但这很容易做到:

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 设置为那个。这将是一个不错的开始。随心所欲地使用持续时间和衰减参数。这可能不像记录的脉冲响应那样流畅或有趣,但它可以满足大多数基本目的。

关于javascript - 将 convolverNode 连接到带有网络音频的振荡器节点——简单的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22525934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com