Web Audio Api: Wie füge ich einen funktionierenden Convolver hinzu?

Was ich versuche zu lernen / zu tun: Wie stelle ich einen einfachen Convolver (Reverb) mit einer Impulsantwort in meine Code-Sandbox? Ich dachte, es wäre ähnlich wie das Setzen eines Filters, aber die Dinge scheinen ganz anders.

Was ich versucht habe: Wie bei allen neuen Technologien ändern sich die Dinge sehr schnell und machen es schwierig zu wissen, welche Implementierung korrekt ist und welche nicht. Ich habe mir unzählige WebAudio Api Convolver-Tutorials angesehen, viele waren alt und andere arbeiteten, aber viel zu "aufgebläht", was es schwierig macht, zu verstehen, was los ist. Ich habe versucht, einige der Beispiele aus der Mozilla-Dokumentation zu implementieren:

Ich habe mir schon angesehen:https: //developer.mozilla.org/en-US/docs/Web/API/ConvolverNode/buffe

Meine Frage Wie binde ich einen Convolver richtig in den unten stehenden Kontext ein? Wie Sie sehen können, habe ich es versucht, kann es aber nicht herausfinden.

 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();
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage