2017-10-25 3 views
0

以下のコード(also live here)は、setTargetAtTimeからの不整合なパフォーマンスを示しているようです... 2秒で最大に膨らまし、7秒で消音してから、12秒で発振器を終了してください"the ugly click"WebAudio:setTargetAtTimeの不規則な動作ですか?

代わりに、2秒で最大に膨らみ、12秒後にまだ終了していないフェードを開始します。その時点で醜いクリックが聞こえます。

これはなぜ起こっているのですか?短い値(コメント付きの//0.3)は、クリックを避けるのに十分速くドロップすることに注意してください。私はさまざまな状況でこれを試してきました。そして、値が上がるにつれて、適切な停止時間を超えて比例して3番目のパラメータが比例して伸びるように見えます(とにかく0にフェードすると)。 setTargetAtTime

<button id = "button" > 
Start then stop oscillators 
</button> 

<script> 
var audioContext = new AudioContext(); 
var fadeIn = 2; 
var fadeOut = 5; //0.3 
var gainNode = audioContext.createGain(); 
var osc = audioContext.createOscillator(); 
osc.type = "sine"; 
osc.frequency.value = 300; 
osc.connect(gainNode); 
gainNode.gain.value = 0; 
gainNode.connect(audioContext.destination); 

function startAndStop() { 
    osc.start(audioContext.currentTime); 
    gainNode.gain.setTargetAtTime(1, audioContext.currentTime, fadeIn);  
    gainNode.gain.setTargetAtTime(0, audioContext.currentTime + fadeIn, fadeOut); 
    osc.stop(audioContext.currentTime + fadeIn + fadeOut + 5); 
}; 

var button = document.getElementById("button"); 
button.addEventListener("click", startAndStop); 

</script> 
+0

[ウェブオーディオAPIは正常に音を止める](https://stackoverflow.com/questions/41511541/web-audio-api-stop-sound-gracefully) – guest271314

答えて

1

3番目のパラメータは、時間パラメータではないので、いいえ、それは2秒で最大に膨潤は、次いで12秒間で発振器を停止、7秒で無音にフェードしてはなりません。

このパラメータは、値が変更されるの指数関数的減衰率を設定します。

したがって、5という値は非常に遅い減衰を生成します。ゆっくりと遅くなります。到達するまでに時間がかかりません。

タイミングは2番目のパラメータで行う必要があります。 0.5の固定減衰率を使用してコードを修正

は、クリックを削除します。

var audioContext = new AudioContext(); 
 

 
var fadeIn = 2; 
 
var fadeOut = 5; 
 

 
var gainNode = audioContext.createGain(); 
 
var osc = audioContext.createOscillator(); 
 
osc.type = "sine"; 
 
osc.frequency.value = 300; 
 
osc.connect(gainNode); 
 
gainNode.gain.value = 0; 
 
gainNode.connect(audioContext.destination); 
 

 
function startAndStop() { 
 
    osc.start(audioContext.currentTime); 
 
    gainNode.gain.setTargetAtTime(1, audioContext.currentTime + fadeIn, 0.5); 
 
    gainNode.gain.setTargetAtTime(0, audioContext.currentTime + fadeOut, 0.5); 
 
    osc.stop(audioContext.currentTime + fadeIn + fadeOut + 5); 
 
}; 
 

 
var button = document.getElementById("button"); 
 
button.addEventListener("click", startAndStop);
<button id="button"> 
 
Start then stop oscillators 
 
</button>

しかし確かに、あなたはlinearRampValueAtTimeの代わりsetTargetAtTimeを使用するように見えます。

+1

はい!これははるかに理にかなっています。 3番目のパラメータは、それが正確に何をしているのかにかかわらず、「比例して伸びる」ようです。次回は、関数の振る舞いについて、私のリファレンス/チュートリアルではなくMozドキュメントをチェックすることを忘れないでください。ありがとうございました! –

関連する問題