js realisiert 3D-Soundeffekte durch audioContext

js realisiert 3D-Soundeffekte durch audioContext

In diesem Artikel wird der spezifische Code von js zur Erzielung von 3D-Soundeffekten über audioContext zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

Vorwort

AudioContexts setPosition implementiert 3D-Soundeffekte

Effektanzeige

Code-Schaufenster

<!DOCTYPE html>
<html lang="de">
<Kopf>
    <meta charset="UTF-8">
    <Titel>3D-Audio</Titel>
    <Stil>
        Körper, div{
            Rand: 0px;
            Polsterung: 0px;
            Textausrichtung: zentriert;
        }

        #kav{
            Rand: 1px tief schwarz;
            Rahmenradius: 4px;
            Rand: 10px automatisch;
        }
    </Stil>
</Kopf>
<Text>
<canvas id="cav" width="320" height="200"></canvas>
</body>
<Skript>
    lass Aud = Funktion (ctx, URL) {
        dies.ctx = ctx;
        diese.url = URL;

// Quellknoten this.src = ctx.createBufferSource();

//Mehrere Verarbeitungsknotengruppen this.pNode = [];
    };

    Aud.prototype = {
        Ausgabe(){
            für (lass i = 0; i < this.pNode.length; i++){
                lass tNode = this.src;
                für (lass j = 0; j < this.pNode[i].length; j++){
                    tNode.verbinden(dies.pNode[i][j]);
                    tNode = diese.pNode[i][j];
                }
                tNode.connect(dieses.ctx.ziel);
            }
        },

        abspielen(Schleife){
            this.src.loop = Schleife || falsch;
            diese.Ausgabe();
            dies.src.start(0);
        },

        stoppen() {
            dies.src.stop();
        },

        addNode(Knoten, Gruppen-Idx = 0){
            dies.pNode[Gruppen-Idx] = dies.pNode[Gruppen-Idx] || [];
            dies.pNode[groupIdx].push(Knoten);
        }
    };

    //Knotentyp festlegen Aud.NODETYPE = {
        GNODE: 0 // stellt den GainNode-Knoten dar}

    //Aud-Verwaltungsobjekt AudManager = {
        URLs: [],
        Artikel: [],
        ctx: null,
        init(){
            versuchen{
                this.ctx = neuer AudioContext();
            }fangen (e) {
                Konsole.log(`${e}`);
            }
        },
        laden(Rückruf){
            für (lass i = 0; i < this.urls.length; i++){
                dies.loadSingle(diese.urls[i], Rückruf);
            }
        },

        ladeSingle(URL, Rückruf){
            let req = neue XMLHttpRequest();
            req.open('GET', URL, wahr);
            req.responseType = "Array-Puffer";
            lass self = dies;
            req.onload = Funktion () {
                self.ctx.decodeAudioData(diese.Antwort)
                    .Dann(
                        buf => {
                            lass aud = neues Aud(self.ctx, url);
                            aud.src.buffer = Puffer;
                            selbst.items.push(aud);

                            wenn (self.items.length == self.urls.length){
                                Rückruf();
                            }
                        },
                        err => {
                            console.log(`Dekodierungsfehler: ${err}`);
                        }
                    )
            };

            anfordern.senden();
        },

        Knoten erstellen(Knotentyp, Parameter){
            lass Knoten = null;
            Schalter (Knotentyp) {
                Fall 1:
                    Knoten = this.ctx.createPanner();
                    brechen;
                Fall 2:
                    Knoten = this.ctx.createScriptProcessor(param[0], param[1], param[2]);
                    brechen;
                Standard:
                    Knoten = this.ctx.createGain();
            }
            Rücklaufknoten;
        }
    };

    Lassen Sie ctx = document.getElementById('cav').getContext('2d');
//Definiere die Koordinaten des bewegten Punktes, sei cX = 190,
        cY = 100,
        Grad = 0;

    fenster.onload = Funktion (){
        init();
    }

    Funktion renderCir(x, y, r, col){
        ctx.speichern();
        ctx.beginPath();
        ctx.arc(x, y, r, 0, Math.PI*2);
        ctx.closePath();

        ctx.fillStyle = col;
        ctx.fill();
        ctx.wiederherstellen();
    }

    Funktion renderCenter(){
        renderCir(160, 100, 8, "rot");
    }

    Funktion renderCat() {
        renderCir(cX, cY, 8, "blau");
    }

    Funktion init(){
        AudManager.urls = ["test.mp3"];
        AudManager.init();

        AudManager.load(()=>{
            let pNod1 = AudManager.createNode(1);
            let sound1 = AudManager.items[0];

            sound1.addNode(pNod1);
            sound1.abspielen(wahr);
            ZeitHandle();
        });
    }

    Funktion ZeitHandle() {
        Fenster.setInterval(()=>{
            ctx.clearRect(0,0,320,200);
            sei rad = Math.PI*Grad / 180;
            sei sx = 90*Math.cos(rad),
                sy = 90*Math.sin(rad);
            cX = 160 + sx;
            cY = 100 + sy;

            AudManager.items[0].pNode[0][0].setPosition(sx*0.1, -sy*0.1, 0);
            renderCenter();
            renderCat();
            Grad++;
        }, 30);
    }
</Skript>
</html>

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Realisierung des Alarm-Soundeffekts basierend auf JavaScript
  • So fügen Sie mit js Hintergrundmusik hinzu und wählen Soundeffekte zu Webseiten aus

<<:  Erläuterung der Linux-Kernel-Optimierungskonfiguration für hochparallele Nginx-Server

>>:  Beispielanalyse zur Optimierung von MySQL-Unterabfragen und verschachtelten Abfragen

Artikel empfehlen

So verwenden Sie Standardwerte für Variablen in SASS

Bei in SASS definierten Variablen überschreibt de...

Detaillierte Erläuterung des SQL_Mode-Modusbeispiels in MySQL

Dieser Artikel beschreibt den SQL_Mode-Modus in M...

Detaillierte Erklärung des EXPLAIN-Befehls und seiner Verwendung in MySQL

1. Szenariobeschreibung: Mein Kollege hat mir gez...

Lösen Sie das Problem der Verwendung von weniger in Vue

1. Installieren Sie weniger Abhängigkeiten: npm i...

Tutorial zur Installation von mysql5.7.17 über yum auf redhat7

Die Linux-Betriebssysteme der RHEL/CentOS-Reihe v...

Grafisches Tutorial zur Installation und Konfiguration von Mysql WorkBench

In diesem Artikel erfahren Sie mehr über die Inst...

Eine kurze Diskussion zum Problem des Docker-Run-Containers im erstellten Status

Bei einem aktuellen Problem gibt es folgendes Phä...

Chrome 4.0 unterstützt GreaseMonkey-Skripte

GreaseMokey (die Chinesen nennen es Grease Monkey...

Einige Schlussfolgerungen zur Entwicklung mobiler Websites

Die mobile Version der Website sollte zumindest ü...

js-Speicherleckszenarien, wie man sie im Detail überwacht und analysiert

Inhaltsverzeichnis Vorwort Welche Situationen kön...

Detaillierte Erklärung der MySQL DEFINER-Verwendung

Inhaltsverzeichnis Vorwort: 1. Kurze Einführung i...

Ein Artikel zum Umgang mit Mysql-Datums- und Zeitfunktionen

Inhaltsverzeichnis Vorwort 1. Aktuelle Uhrzeit er...