2012-10-27 8 views
6

Po pomyślnym utworzeniu dźwięku z oscylatorem Web Audio (z noteOn), a następnie wywołaj jego funkcję noteOff, kolejne wywołania do noteOn nie odtworzą dźwięku ponownie. Wydaje mi się, że muszę stworzyć nowy oscylator, aby zagrać nową nutę. Dlaczego to?dlaczego webowy oscylator audio odtwarza tylko notatkę raz?

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)) 

Odpowiedz

8

Po prostu - interfejs API jest zaprojektowany w ten sposób i zoptymalizowany pod kątem tego rodzaju użytkowania. Nie ma wielkiego wyboru, z wyjątkiem tworzenia nowego oscylatora na nutę.

+0

Ta odpowiedź jest potwierdzona przez faq tutaj: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ – aaaidan

6

Użyj puli oscylatora i kontrolki włącz/wyłącz za pomocą węzła wzmocnienia. Podobnie jak syntezatory analogowe, oscylatory działają cały czas w puli.

Podczas gdy można utworzyć pulę oscylatorów, interfejs Web Audio API został tak zoptymalizowany, że nie warto tego robić. Wcześniej uważałem pulę oscylatorów za dobry pomysł, ale tak nie jest. Utworzenie nowego oscylatora za każdym razem, gdy potrzebujesz nowej notatki, jest dość proste - o wiele prostsze niż utrzymywanie puli - i nie ma istotnego wpływu na wydajność spowodowaną ciągłym procesem tworzenia/usuwania śmieci.

A jeśli się nad tym zastanowić, jest to bardzo czysty model programowania. Nie trzeba utrzymywać referencji do obiektów, a następnie używać ich później. Mniejszy stan do utrzymania.

+1

Dzięki za rozwiązanie, Prawdopodobnie to zrobię. Chcesz się skomentować, dlaczego API zostało zaprojektowane w ten sposób (gdzie noteOff skutecznie niszczy oscylator)? – aaaidan

+1

noteOn/noteOff to straszna nazwa, jeśli jest to naprawdę zamierzone zachowanie :( – UpTheCreek

+0

yes noteOn i noteOff zostały uznane za przestarzałe i zostaną zastąpione startem/stopem – fisherwebdev

5

Co powiesz na zmianę częstotliwości na 0? Wydaje się działać w tym piaskownicy Dataflow + Web Audio API. (start i stop użyć odłączyć/podłączyć wzór.)

+0

Hrm ... Niezły pomysł. Dobre rozwiązanie, dzięki! Jeśli pytanie nie dotyczyło "dlaczego", zaakceptowałbym to! – aaaidan

+0

Grając z nim więcej, jeśli planujesz notatki z sekwencera i chcesz mieć dokładną synchronizację z zegarem audio, musisz stworzyć nowy oscylator dla każdej nuty. – forresto

+1

Naprawdę? Myślałem, że częstotliwość można ustawić za pomocą dokładnego pomiaru czasu? – aaaidan