2012-10-27 6 views
6

Wenn ich erfolgreich einen Ton mit einem Web Audio Oszillator (mit noteOn) erstellen, dann rufen Sie seine noteOff Funktion, nachfolgende Aufrufe an noteOn nicht den Ton wiederzugeben. Ich muss einen neuen Oszillator erzeugen, um eine neue Note spielen zu können. Warum ist das?Warum spielt ein Web Audio Oszillator nur einmal eine Note?

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

Antwort

8

Einfach gesagt - die API ist so konzipiert und optimiert für diese Art der Verwendung. Man hat nicht viel Auswahl, außer einen neuen Oszillator pro Note zu erzeugen.

+0

Diese Antwort des FAQ hier bestätigt: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ – aaaidan

6

Verwenden Sie einen Oszillatorpool und einen Steuerhinweis an/aus mit einem Verstärkungsknoten. Wie analoge Synthesizer laufen die Oszillatoren die ganze Zeit im Pool.

Während es möglich ist, einen Oszillatorpool zu erstellen, wurde die Web Audio API so optimiert, dass es sich nicht lohnt. Ich dachte vorher, dass ein Oszillator-Pool eine gute Idee ist, aber das ist es nicht. Es ist ziemlich einfach, jedes Mal, wenn Sie eine neue Notiz benötigen, einen neuen Oszillator zu erstellen - viel einfacher als das Warten eines Pools - und es gibt keinen wesentlichen Leistungseinbruch, der durch diesen kontinuierlichen Erstellungs-/Speicherbereinigungsprozess verursacht wird.

Und wenn Sie darüber nachdenken, ist dies ein sehr sauberes Programmiermodell. Sie müssen keine Verweise auf Objekte pflegen und sie später wiederverwenden. Weniger zu haltender Zustand.

+1

Danke für die Lösung, Ich werde das wahrscheinlich tun. Interessieren Sie sich, warum die API so entworfen wurde (wo NoteOff den Oszillator effektiv zerstört)? – aaaidan

+1

noteOn/noteOff ist ein schrecklicher Name, wenn dies wirklich das beabsichtigte Verhalten ist :( – UpTheCreek

+0

yes noteOn und noteOff sind veraltet und werden durch start/stop ersetzt. – fisherwebdev

5

Wie wäre es, die Frequenz auf 0 zu ändern? Es scheint in dieser Dataflow + Web Audio API Sandbox zu funktionieren. (start und stop verwenden, um die Trenn/wieder Muster.)

+0

Hrm ... Keine schlechte Idee. Gute Lösung, danke! Wenn die Frage nicht mehr das "Warum" wäre, würde ich das akzeptieren! – aaaidan

+0

Wenn Sie mehr damit spielen, wenn Sie Noten von einem Sequenzer planen und genaues Timing mit der Web-Audio-Uhr wünschen, müssen Sie für jede Note einen neuen Oszillator erstellen. – forresto

+1

Wirklich? Ich dachte, die Frequenz könnte mit sample-genauem Timing eingestellt werden? – aaaidan

Verwandte Themen