2016-11-12 6 views
0

を開始する前に、私はちょうど発振器接続や発振器がまだ開始されていないときがない場合の方法setValueAtTime()またはsetValueCurveAtTime()gainNodegain.valueを変更することはできないようだということに気づきました。発振器は、この場合、例えば ウェブオーディオ:変更ゲイン値発振器は

を開始した後、期待どおり

setValueAtTimeは、setValueAtTimeは動作します:

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(); 

gain.gain.setValueAtTime(0, context.currentTime + 1); 

発振器が開始され、利得が1秒間1です。その後gain.gain.value0に移動します。

setValueAtTime発振器は、我々はsetValueAtTimeでゲインを設定した場合、発振器は

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(context.currentTime + 1); 

gain.gain.setValueAtTime(0, context.currentTime); 

を開始する前にgain.gain.valuesetValueAtTime

せずに設定 gain.gain.value

1に留まりますが

を開始する前に、

これは奇妙なことです私たちが直接

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(context.currentTime + 1); 

gain.gain.value = 0; 

ゲイン値は常に0

+0

私はAPIを使って遊んだとき、オシレーターを 'gain.gain'(' osc.connect(gain.gain) ')に接続する必要があることを思い出しました。これはおそらく問題とは関係がありません。完全にはわかりませんが、あなたはそれを試すことができます。 – schroffl

答えて

1

Chromeをお使いの場合は、おそらくbug in Chromeです。 Chromeは実際にゲッターで計算された値を返しますが、ノードに入力がなくても宛先に接続されている場合、AudioParamのオートメーションは実行されません。値は.valueゲッターで調べることができます。

+0

あなたは正しいと思います! – hhh

0

AudioParam.valueに滞在するゲインを設定した場合haviourは計算値ではありません見ていない - すなわち、それはあなたの現在を教えてくれませんゲインが実際にISの値、AudioParam.valueが最後に設定された値。 (https://webaudio.github.io/web-audio-api/#widl-AudioParam-value参照)。 AudioParamの現在の値が本当に何であるか知りたいのであれば、AudioParamをオーディオノードにルーティングし、(スクリプトプロセッサなどを介して)データを収集する必要があります。あなたの最初の例では、私はgain.gain.valueが0になるとは思わない。

任意の時点でのAudioParamの実際の値は、スケジューラと.valueだけでなく、ノードによって、AudioParamにconnect()されます。これらの値を絶えず計算してAudioParamに戻すことはコストがかかるでしょう。

+0

あなたの答えをありがとう!興味深いことに、私は '.value'が実際に現在の値に対応していると考えました。しかし、接続前またはオシレータが起動する前に、ゲインノードの値を変更するにはどうすればよいですか? – hhh

+0

一方、https://github.com/WebAudio/web-audio-api/issues/318#issuecomment-248006232を参照してください。基本的に計算値が返されるはずです。仕様では '.value'セッターは' setValueAtTime'と同じであると言われているので、計算された値でなければ、これまでの値を調べることはできません。 –

+0

さて、あなたは私に言います - あなたは今編集者です。:)しかし、この属性を設定すると、現在のAudioContextのcurrentTimeと要求された値を使ってsetValueAtTime()を呼び出すことと同じ結果になり、その後にこの属性のゲッターにアクセスすると同じ値が返されます。これは、.valueのセットがsetValueAtTimeと同じ効果を持たなければならないことを意味し、valueを設定した場合は、その値を返します(後続のsetValueAtTime、またはランプの結果ではありません)。 「これは計算された値です」とは決して言わず、その問題はv2にパントされました。 :( – cwilso

関連する問題