2012-12-04 6 views
7

Ich spiele mit der Webkit-Audio-API und ich versuche, einen Echo-Effekt zu erzeugen, um zu erreichen, dass ich einen DelayNode mit einem GainNode in einer Schleife verbunden habe (Die Ausgabe der eine ist der Input des anderen, und umgekehrt.Erstellen eines benutzerdefinierten Echoknoten mit Web-Audio

Echo Node

Der Effekt funktioniert gut, aber jetzt will ich ein EchoNode Objekt erstellen, die ich gerade Plug-in und mit den anderen AudioNode Objekten verbinden.

Etwas wie:

myEchoNode = new EchoNode(); 
myConvolverNode = context.createConvolver(); 
myConvolverNode.connect(myEchoNode); 

Ich denke, dass ich aus AudioNode meine EchoNode erben machen sollte, so dass die Verbindungsfunktion von jedem anderen AudioNode funktionieren würde, aber ich weiß nicht, wie das in Javascript zu tun mit der Web-Audio-API.

Kann jemand mir einen Hinweis geben, oder wenn Sie denken, dass es einen besseren Weg gibt, um das zu erreichen, würde ich es sehr schätzen.

Dank

+0

Es gibt eine Effektbibliothek mit dem Namen TUNA.js, mit der Sie vielleicht die Codebasis von. – William

+0

Ja, es wird am Ende von Oskars Artikel erwähnt. Es sieht wirklich cool aus, ich werde es überprüfen. Außerdem wird es mir eine Chance geben, mein Javascript zu verbessern, von dem ich weiß, dass es ein bisschen schwach ist. Danke – dgiulian

Antwort

7

Oskar's Lösung sollte den Trick machen, aber ich möchte darauf hinweisen, dass Sie eine Verbindung zu Ihrem EchoNode auf nichtstandardisierte Weise benötigen (unter Verwendung von EchoNode.input anstatt einfach mit dem EchoNode selbst zu verbinden). Bei einfachen Effekten wie der Rückkopplungsverzögerung kann dies vermieden werden, indem der EchoNode über eine Factory-Funktion erstellt wird, die einen nativen DelayNode mit einigen zusätzlichen Eigenschaften zurückgibt. Hier ist ein Beispiel von SynthJS:

function FeedbackDelayNode(context, delay, feedback){ 
    this.delayTime.value = delay; 
    this.gainNode = context.createGainNode(); 
    this.gainNode.gain.value = feedback; 
    this.connect(this.gainNode); 
    this.gainNode.connect(this); 
} 

function FeedbackDelayFactory(context, delayTime, feedback){ 
    var delay = context.createDelayNode(delayTime + 1); 
    FeedbackDelayNode.call(delay, context, delayTime, feedback); 
    return delay; 
} 

AudioContext.prototype.createFeedbackDelay = function(delay, feedback){ 
    return FeedbackDelayFactory(this, delay, feedback); 
}; 

Wie Sie sehen können, ist das Ergebnis eine native DelayNode ist, die zu anderen Knoten in der üblichen Weise verbunden werden können, aber es hat einen angebrachten Verstärkungsknoten, der die Rückkopplungseffekt zur Verfügung stellt.