2012-10-27 6 views
6

Quando si crea un tono con un oscillatore Web Audio (con noteOn), chiamare la sua funzione noteOff, le chiamate successive a noteOn non riprodurranno ancora il tono. Mi sembra di dover creare un nuovo oscillatore per suonare una nuova nota. Perchè è questo?perché un oscillatore web audio suona una nota solo una volta?

var ctx = new webkitAudioContext(); 
var osc = ctx.createOscillator(); 
osc.connect(ctx.destination); 
osc.start(0); // tone is heard (previously noteOn(0)) 

// ... some time later 
osc.stop(0); // tone falls silent (previously noteOff(0)) 

// ... some time later 
osc.start(0); // no effect! (previously noteOn(0)) 

risposta

8

In poche parole, l'API è progettata in questo modo e ottimizzata per questo tipo di utilizzo. Non c'è molta scelta se non creare un nuovo oscillatore per nota.

+0

Questa risposta è confermato dal faq qui: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ – aaaidan

6

Utilizzare un pool di oscillatori e la nota di controllo on/off con un nodo di guadagno. Come i synth analogici, gli oscillatori sono sempre in funzione nel pool.

Mentre può funzionare per creare un pool di oscillatori, l'API Web Audio è stata ottimizzata in modo tale da non meritare di essere eseguita. In precedenza pensavo che un pool di oscillatori fosse una buona idea, ma non lo è. È abbastanza semplice creare un nuovo oscillatore ogni volta che è necessaria una nuova nota, molto più semplice del mantenimento di un pool, e non c'è alcun impatto significativo sulle prestazioni causato da questo processo continuo di creazione/eliminazione dei rifiuti.

E se ci pensate, questo è un modello di programmazione molto pulito. Non è necessario mantenere i riferimenti agli oggetti e riutilizzarli in seguito. Meno stato da mantenere.

+1

Grazie per la soluzione, Probabilmente lo farò. Si prega di commentare perché l'API è stata progettata in questo modo (dove NoteOff distrugge efficacemente l'oscillatore)? – aaaidan

+1

noteOn/noteOff è un nome terribile se questo è veramente il comportamento previsto :( – UpTheCreek

+0

sì noteOn e noteOff sono stati deprecati e saranno sostituiti con start/stop – fisherwebdev

5

Che ne dici di cambiare la frequenza a 0? Sembra funzionare in questa sandbox Dataflow + Web Audio API. (start e stop usa la disconnessione/riconnessione modello.)

+0

Hrm ... Non è una cattiva idea. Buona soluzione, grazie! Se la domanda non fosse più sul "perché", lo accetterei! – aaaidan

+0

Giocando di più, se si pianificano le note da un sequencer e si desidera una sincronizzazione accurata con l'orologio audio del web, è necessario creare un nuovo oscillatore per ogni nota. – forresto

+1

Davvero? Pensavo che la frequenza potesse essere impostata con un tempismo preciso del campione? – aaaidan

Problemi correlati