这是一个非常开放式的问题;你尝试过哪些方法没有成功,或者你错过了“脉冲响应”应该是什么?如果是后者,搜索“脉冲响应文件”,您会发现大量可以使用的免费文件。您还可以在对数衰减曲线上生成噪声到缓冲区中,并且您将获得基本的混响效果。创建脉冲响应缓冲区的基本方法:
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;
}
您的代码有 BufferSourceNodeand卷积器指向同一个缓冲区,这几乎肯定是错误的;您通常不会使用缓冲源播放脉冲响应文件,并且通常不会使用普通声音文件作为脉冲响应。 (如果脉冲响应的作用不清楚,请在维基百科上查找卷积。)您需要执行以下操作:
function setupWebAudio() {
var audio = document.getElementById('music');
var context = new AudioContext();
var source = context.createMediaElementSource(audio);
var convolver = context.createConvolver();
var irRRequest = new XMLHttpRequest();
irRRequest.open("GET", "hall.mp3", true);
irRRequest.responseType = "arraybuffer";
irRRequest.onload = function() {
context.decodeAudioData( irRRequest.response,
function(buffer) { convolver.buffer = buffer; } );
}
irRRequest.send();
// note the above is async; when the buffer is loaded, it will take effect, but in the meantime, the sound will be unaffected.
source.connect( convolver );
convolver.connect( context.destination );
}