2013-03-07 11 views
8

Sto provando ad avviare e interrompere un suono. E quello funziona. Ma non posso riattivare il suono.Web Audio avvia e interrompe l'oscillatore quindi lo riavvia

Devo davvero fare di nuovo un altro oscillatore? Questo sembra estremamente non intuitivo. Ci deve essere un modo migliore.

Questo è tutto quello che ho che funziona:

oscillator1.noteOn(0); 
oscillator1.noteOff(0); 

Calling noteon nuovo doesnt fare nulla. Perché? È oltre me

Ho anche provato a impostare il volume, o nel contesto del popolo Web Audio, "guadagno", uguale a zero. Ma per qualche ragione, un guadagno pari a zero rende il suono. Quale valore di guadagno non produrrebbe alcun suono?

uomo, non riesco a credere quanto sia difficile questo è:/

risposta

3

Devi utilizzare il metodo .disconnect() (a meno che la specifica è cambiato di recente).

ho scritto questo qui:

http://en.wikiaudio.org/Web_Audio_API:Toggle_oscillator_on_and_off

EDIT

Questa risposta è vecchio quando stavo solo cercando di imparare l'API Audio Web ha funzionato. Non è necessario utilizzare la disconnessione.

+0

Questo ha più senso che distrugge gli oscillatori! –

+0

L'ho scritto 2 anni fa. Non è necessario disconnetterli per avviare e interrompere. – William

7

In realtà, sì, è necessario creare un nuovo nodo oscillatore. L'API è progettata e ottimizzata per funzionare con quel modello.

Il modello di disconnessione nel codice di Taoist è fondamentalmente un modo complesso di creare un nuovo oscillatore (viene eseguito ogni volta che oscOn viene eseguito). Non chiama mai esplicitamente noteOff sul vecchio oscillatore che è disconnesso, quindi potrebbe essere ancora in esecuzione in background (non sono sicuro di come l'audio del web lo gestisce) anche se non è udibile dal momento che è disconnesso dalla catena audio. Quindi potrebbe potenzialmente impilare gli oscillatori in background che stanno eseguendo e scaricando la CPU.

Ecco lo stesso codice, anche se si utilizza correttamente noteOff(). http://codepen.io/Theodeus/pen/afgqk

Ecco lo stesso codice, sebbene adattata utilizzando il nodo guadagno per controllare l'oscillatore e quindi solo utilizzando lo stesso oscillatore tutto il tempo (se questo non è consigliabile, meglio creare una nuova unità per ogni nota, I pensare) http://codepen.io/Theodeus/pen/aKFje

Modifica aprile 2015
Poiché gli esempi di codice sembra essere perso nel cyberspazio, ecco un tutorial che ho scritto su oscillatori che contiene esempi di codice che mostra la natura one-shot di oscillatori. Non è esattamente lo stesso codice di quello sopra citato, ma mostra lo stesso concetto. http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - il nocciolo di esso è questo:

//This won't work. Can't call play twice. 
var context = new AudioContext(), 
    oscillator = context.createOscillator(); 

oscillator.connect(context.destination); 
oscillator.start(context.currentTime); 
oscillator.stop(context.currentTime + 0.5); 
oscillator.start(context.currentTime + 1); 
oscillator.stop(context.currentTime + 1.5); 


//this will work! 
var context = new AudioContext(), 
    oscillator; 

function playOscillator(startTime, endTime) { 
    oscillator = context.createOscillator(); 
    oscillator.connect(context.destination); 
    oscillator.start(startTime); 
    oscillator.stop(endTime); 
} 

playOscillator(context.currentTime, context.currentTime + 0.5); 
playOscillator(context.currentTime + 1, context.currentTime + 1.5); 
+0

E, solo per dimostrare il punto, ecco il modello di disconnessione adattato per utilizzare solo un oscillatore e scollegare/ricollegare. http: // codepen.io/Theodeus/pen/bwoKn –

+0

E proprio quando pensavo di sapere cosa stavo facendo. Per aggiungere, noteOn() e noteOff() sono stati deprecati a favore di start() e stop() – William

+0

Il codice originale di Taoist manterrebbe l'oscillatore in giro per un po '(e in esecuzione!), Ma una volta creato un altro oscillatore (La prossima volta che hai chiamato oscOn()), viene rilasciato il riferimento all'oscillatore precedente, che verrà raccolto automaticamente. – cwilso

Problemi correlati