2013-03-07 5 views
8

Ich versuche, einen Ton zu starten und zu stoppen. Und das funktioniert. Aber ich kann den Ton nicht mehr starten.Web Audio starten und stoppen Oszillator dann starten Sie es wieder

Muss ich wirklich noch einen anderen Oszillator machen? Dies scheint nur äußerst unintelligent zu sein. Es muss einen besseren Weg geben.

Das ist alles, was ich habe, das funktioniert: wieder

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

Aufruf NOTEON alles tun tut. Warum? Für mich nicht nachvollziehbar.

Ich habe auch versucht, die Lautstärke einzustellen, oder im Zusammenhang mit den Web Audio Menschen, "Gain", gleich Null. Aber aus irgendeinem Grund macht ein Gewinn von Null Ton. Welcher Wert der Verstärkung würde keinen Ton erzeugen?

Mann, ich kann nicht glauben, wie schwierig das ist:/

Antwort

3

Sie haben die .disconnect() -Methode verwendet werden (es sei denn, die Spezifikation vor kurzem geändert hat).

Ich schrieb dies hier oben:

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

EDIT

Diese Antwort alt ist, wenn ich nur versucht gearbeitet zu lernen, wie das Web Audio API. Sie müssen die Verbindung nicht trennen.

+0

Dies macht mehr Sinn, dass Oszillatoren zu zerstören! –

+0

Ich schrieb das vor 2 Jahren. Sie müssen sie nicht trennen, um zu starten und zu stoppen. – William

7

Eigentlich ja, Sie müssen einen neuen Oszillatorknoten erstellen. Die API wurde entwickelt und optimiert, um mit diesem Muster zu arbeiten.

Das Trennmuster im Taoist-Code ist im Grunde genommen eine gewundene Art, einen neuen Oszillator zu erzeugen (es wird jedes Mal ausgeführt, wenn oscOn ausgeführt wird). Es ruft noteOff niemals explizit auf dem alten Oszillator auf, der getrennt ist, so dass es möglicherweise immer noch im Hintergrund läuft (nicht sicher, wie Webaudio damit umgeht), obwohl es nicht hörbar ist, da es von der Audiokette getrennt ist. Es könnte also möglicherweise Oszillatoren im Hintergrund stapeln, die CPU laufen lassen und entladen.

Hier ist der gleiche Code, obwohl noteOff() richtig verwendet wird. http://codepen.io/Theodeus/pen/afgqk

Hier ist der gleiche Code, obwohl die Verstärkung Knoten angepasst unter Verwendung des Oszillators zu steuern und somit nur den gleichen Oszillator die ganze Zeit mit (obwohl dies nicht empfohlen wird, besser einen neuen Oszillator für jede Note zu erstellen, I denkt http://codepen.io/Theodeus/pen/aKFje) scheint

bearbeiten April 2015
Da die Code-Beispiele im Cyberspace space~~POS=HEADCOMP verloren ging, ist hier ein Tutorial ich auf Oszillatoren geschrieben, die Codebeispiele enthält, die die One-Shot-Natur von Oszillatoren zeigen. Es ist nicht genau der gleiche Code wie der oben erwähnte, aber es zeigt das gleiche Konzept. http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - das Wesentliche davon ist das:

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

Und nur um den Punkt zu beweisen, hier ist das Trennmuster angepasst, um nur einen Oszillator zu verwenden und Trennen/Wiederverbinden. http: // Codepen.io/Theodeus/pen/bwoKn –

+0

Und gerade als ich dachte ich wüsste was ich mache. Um hinzuzufügen, wurden noteOn() und noteOff() zugunsten von start() und stop() veraltet. – William

+0

Taoists ursprünglicher Code würde den Oszillator für eine Weile (und zwar!) Halten, aber sobald du einen anderen Oszillator erstellt hast (Beim nächsten Aufruf von oscOn()) wird der Verweis auf den vorherigen Oszillator freigegeben, und es wird Garbage Collection durchgeführt. – cwilso

Verwandte Themen