2013-03-07 16 views
8

サウンドの開始と停止を試みています。そして、それは動作します。しかし、私は再び音を出すことはできません。Web Audioは、オシレーターの起動と停止を行い、再度起動します。

もう1つのオシレーターをもう一度作成する必要がありますか?これは非常に直感的ではないようです。より良い方法が必要です。

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

呼び出しnoteOnを再び何かをdoesntの:

この

は動作する私が持っているすべてです。どうして?私を超えています。

また、ボリュームを設定したり、Web Audioの人物のコンテキストで「ゲイン」を0に設定しようとしました。しかし、何らかの理由でゼロのゲインが得られます。どんな音が響くのではないでしょうか?

男が、私はこれがいかに難しいかを信じることができません:/

答えて

3

あなたは(スペックが最近変更された場合を除き).disconnect()メソッドを使用する必要があります。

私はここにこれを書いた:私はちょうどウェブオーディオAPIが働いていた方法を学習しようとしていたとき

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

EDIT

は、この応答が古いです。切断を使用する必要はありません。

+0

これはオシレータを破壊するのがより理にかなっています! –

+0

2年前に書きました。開始および停止するためにそれらを切断する必要はありません。 – William

7

実際、新しいオシレータノードを作成する必要があります。 APIは、そのパターンで動作するように設計され、最適化されています。

Taoistのコードの切断パターンは、基本的に、新しいオシレータを作成する複雑な方法です(oscOnが実行されるたびに実行されます)。それは明示的に古いオシレーターのnoteOffを明示的に呼び出さないので、オーディオチェーンから切り離されているため、音声は聞こえませんが、バックグラウンドで実行されている可能性があります。だから、潜在的にバックグラウンドで発振器を積み重ねて、CPUを稼動し排水している可能性があります。

noteOff()を正しく使用していますが、ここでは同じコードです。 http://codepen.io/Theodeus/pen/afgqk

ここで私は、しかし、発振器を制御するためのゲインノードを使用して適応し、これが推奨されていないがためにのみ、各ノートのための新たな発振器を作成するには、(同じ発振器をより良いのすべての時間を使用して、同じコードです)http://codepen.io/Theodeus/pen/aKFje

編集2015年4月
は、コードサンプル以来だと思うサイバースペースで失われているように見える、ここで私は、発振器のワンショットの性質を示したコード例が含まれている発振器に書いたチュートリアルです。上で参照したのとまったく同じコードではありませんが、同じ概念を示しています。 http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - その要点は次のとおりです。

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

そして、ちょうどそのポイントを証明するために、1つのオシレータと切断/再接続のみを使用するようになっている切断パターンをここに示します。 http:// codepen。io/Theodeus/pen/bwoKn –

+0

ちょうど私が何をしているのか分かっていると思ったとき。 addOn()とnoteOff()は、start()とstop()の方が非難されました – William

+0

道教徒のオリジナルコードは、しばらくの間、次回oscOn()を呼び出すと、以前のオシレータへの参照が解放され、ガベージコレクションされます。 – cwilso

関連する問題