Ответ 1
Это довольно открытый вопрос; что вы пробовали, что не сработало, или это то, что вам не хватает, что "импульсная реакция" должна быть? Если последний, найдите "файлы импульсного ответа", и вы найдете множество бесплатных файлов, которые вы можете использовать. Вы также можете генерировать шум на логарифмической кривой затухания в буфер, и вы получите базовый эффект реверберации. Основной метод создания буфера ImpulseResponse:
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;
}
В вашем коде есть как BufferSourceNode, так и convolver, указывающие на тот же буфер, что почти наверняка неверно; вы обычно не воспроизводите файл импульсного ответа с использованием буферизатора, и обычно вы не используете обычный звуковой файл в качестве импульсного ответа. (Смотрите свертку в Википедии, если роль импульсного ответа не ясна.) Вам нужно сделать что-то вроде:
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 );
}