在下面的代码中,我希望每次按下按钮元素时都会创建一个分配给o的新振荡器节点,允许多次按下,在440处产生多个1秒音调。但是我发现的是按钮只能按下一次产生一个音调,然后它就像我没有创建新的振荡器节点一样死了。我正在开始使用JavaScript,我怀疑它一定是微不足道的。有人有想法吗?
<html>
<body>
<button id='but' label='Button'/>
<script>
function secondContext(){
play([440],0,1);
}
function play(freqs, delay, duration) {
freqs.forEach(function(freq){
o = audio_context.createOscillator();
o.frequency.value = freq;
o.connect(audio_context.destination);
o.start(0);
o.stop(1);
});
}
var audio_context = new (AudioContext || webkitAudioContext);
button_ele = document.getElementById('but')
button_ele.addEventListener('click',function(){secondContext()});
</script>
</body>
</html>
编辑:
刚刚找到解决问题的this question。解决方案是将audio_context.currentTime()添加到偏移量中,如下所示:
o.start(audio_context.currentTime + 0);
o.stop(audio_context.currentTime + 1);
答案 0 :(得分:0)
如您所述,start()
和stop()
方法&#39;第一个参数是基于时钟维持audioContext.currentTime
的时间戳。
如果时间戳小于当前时间,则立即执行启动/停止方法。否则,当时钟与时间戳同时执行时(分别启动或停止振荡器)方法。
when参数描述声音应该在什么时间(以秒为单位)开始播放。它与AudioContext的currentTime属性在同一时间坐标系。如果为此值传入0或者该值小于currentTime,则声音将立即开始播放。 start只能被调用一次,必须在stop之前调用....