2012-12-04 10 views
7

Sto giocando con l'API Webkit Audio e sto cercando di creare un effetto Echo, per realizzare che ho collegato un DelayNode con un GainNode in un loop (L'output di uno è l'input dell'altro, e viceversa).Creazione di un nodo eco personalizzato con web-audio

Echo Node

L'effetto funziona bene, ma ora voglio creare un oggetto EchoNode che io posso solo plug-in e connettersi con gli altri oggetti AudioNode.

Qualcosa di simile:

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

Penso che dovrei fare il mio ereditare EchoNode da AudioNode, in modo che la funzione di connessione di ogni altra AudioNode avrebbe funzionato, ma non so come fare in Javascript con l'API Web Audio.

Qualcuno può darmi un suggerimento, o se pensi che ci sia un modo migliore per farlo, lo apprezzerei molto.

Grazie

+0

C'è una libreria di effetti chiamata TUNA.js che potrebbe essere utile per dare uno sguardo al codice di base di. – William

+0

Sì, è menzionato alla fine dell'articolo di Oskar. Sembra davvero bello, lo controllerò. Inoltre mi darà la possibilità di migliorare il mio Javascript che so essere piuttosto debole. Grazie – dgiulian

risposta

7

La soluzione di Oskar dovrebbe fare il trucco, ma voglio sottolineare che richiederà il collegamento al tuo EchoNode in un modo non standard (usando EchoNode.input piuttosto che collegarsi semplicemente allo stesso EchoNode). Per effetti semplici come il ritardo di feedback, questo può essere evitato creando l'EchoNode tramite una funzione di fabbrica che restituisce un DelayNode nativo con alcune proprietà aggiuntive. Ecco un esempio da 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); 
}; 

Come si può vedere, il risultato è un DelayNode nativo che può essere collegato ad altri nodi in formato standard, ma ha un nodo guadagno collegato che fornisce l'effetto di feedback.

Problemi correlati