Ce que j'essaie d'apprendre / faire: comment configurer un simple convolver de travail (reverb) dans mon sandbox de code ci-dessous en utilisant une réponse impulsionnelle. Je pensais que c'était semblable à la définition d'un filtre, mais les choses semblaient tout à fait différentes.
Ce que j'ai essayé: comme pour toutes les nouvelles technologies, les choses changent à un rythme rapide, ce qui rend difficile de savoir quelle implémentation est correcte et ce qui ne l'est pas. J'ai regardé d'innombrables didacticiels WebAudio Api Convolver, beaucoup d'anciens et d'autres travaillaient, mais trop "gonflés", ce qui rend difficile de comprendre ce qui se passe. J'ai essayé de mettre en pratique certains exemples de la documentation mozilla:
J'ai déjà regardé: https://developer.mozilla.org/en-US/docs/Web/API/ConvolverNode/buffer
Ma question: Comment puis-je intégrer un convolver correctement dans le contexte ci-dessous? Comme vous pouvez le voir, j'ai essayé mais je ne peux pas comprendre cela.
window.addEventListener('load', init, false); function init() { setupWebAudio(); } function setupWebAudio() { var audio = document.getElementById('music'); var context = new AudioContext(); var source = context.createMediaElementSource(audio); var filter = context.createBiquadFilter(); var convolver = context.createConvolver(); var inpulseRes = "hall.mp3"; var hallBuffer = inpulseRes; soundSource = context.createBufferSource(); soundSource.buffer = hallBuffer; convolver.buffer = hallBuffer; filter.type = 'lowpass'; filter.frequency.value = 400; var theParent = document.getElementById("test"); theParent.addEventListener("mousedown", doSomething, false); function doSomething(e) { if (e.target !== e.currentTarget) { if(e.target == theParent.children[0]){ filter.frequency.value += 200; } else if(e.target == theParent.children[1]){ filter.frequency.value -= 200; } else if(e.target == theParent.children[2]){ filter.type = 'highpass'; } } e.stopPropagation(); } source.connect(filter); source.connect(convolver); filter.connect(context.destination); audio.play(); }
C'est une question assez ouverte; Qu'avez-vous essayé qui n'a pas fonctionné, ou est-ce que vous manquez ce que la "réponse impulsionnelle" est supposée être? Si ce dernier, recherchez des "fichiers de réponse impulsionnelle" et vous trouverez des tonnes de fichiers gratuits que vous pouvez utiliser. Vous pouvez également générer du bruit sur une courbe de désintégration logarithmique dans un tampon, et vous obtiendrez un effet de réverbération basique. Méthode de base pour créer un buffer 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; }
Votre code a à la fois BufferSourceNode et le convolver indiquant le même tampon, ce qui est presque certainement erroné; Vous ne lisez généralement pas un fichier de réponse impulsionnelle à l'aide d'une source bufférante, et vous n'utilisez généralement pas un fichier son normal comme réponse impulsionnelle. (Recherchez la convolution sur Wikipedia si le rôle d'une réponse impulsionnelle n'est pas clair.) Vous devez faire quelque chose comme:
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 ); }
Connectez la sortie du convolver à quelque chose. Ce que vous avez maintenant, c'est la source connectée au convolver, mais le convolver n'est pas connecté à quoi que ce soit. En première coupe, convolver.connect(context.destination)
.