2017-10-25 1 views
0

아래의 코드 (also live here)는 setTargetAtTime과 일치하지 않는 성능을 나타내는 것으로 보입니다. 2 초에 최대로 팽창 한 다음 7 초에 무음으로 변하고 12 초에 발진기를 종료합니다. "the ugly click")WebAudio : setTargetAtTime의 비정상적인 동작입니까?

대신에 최대 2 초에 부풀어 오르고 12 초에 끝나지 않은 페이드가 시작됩니다. 그 시점에서 우리는 추악한 클릭을 듣습니다.

왜 이런 일이 일어 났는지 설명 할 수 있습니까? 짧은 값 (주석이 달린 //0.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

세번째 파라미터는 시간 파라미터 아니므 아니, 2 초에서 최대 팽윤 후 다음 12초의 발진기를 종료 7 초간 침묵 페이드 안된다.

이 매개 변수는 값이 변경되는의 지수 감소율 을 설정합니다.

값이 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 사용하고자하는 것 :

0.5의 고정 붕괴 속도를 사용하여 코드를 수정은 클릭을 제거합니다.

+1

예! 좋습니다, 이것은 훨씬 더 의미가 있습니다. 세 번째 매개 변수는 그것이 정확하게 수행하고 있기 때문에 "비례 적으로 늘어납니다"것처럼 보입니다. 다음 번에 필자는 기능의 동작에 대한 나의 참고 자료/튜토리얼보다는 Moz 문서를 확인하는 것을 잊지 않을 것이다. 고맙습니다! –