Web Audio Oscillator无法创建新的振荡器

时间:2014-06-19 05:28:32

标签: javascript web-audio

在下面的代码中,我希望每次按下按钮元素时都会创建一个分配给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);

1 个答案:

答案 0 :(得分:0)

如您所述,start()stop()方法&#39;第一个参数是基于时钟维持audioContext.currentTime的时间戳。

如果时间戳小于当前时间,则立即执行启动/停止方法。否则,当时钟与时间戳同时执行时(分别启动或停止振荡器)方法。

  

when参数描述声音应该在什么时间(以秒为单位)开始播放。它与AudioContext的currentTime属性在同一时间坐标系。如果为此值传入0或者该值小于currentTime,则声音将立即开始播放。 start只能被调用一次,必须在stop之前调用....

http://webaudio.github.io/web-audio-api/#widl-AudioBufferSourceNode-start-void-double-when-double-offset-double-duration