在函数

时间:2016-03-23 12:15:54

标签: javascript web-audio

根据文档,您应该每页只调用一次AudioContext。

当我尝试正确使用它并在函数外部调用它时,不会产生声音。上下文变量已定义并填充,控制台中不会抛出任何错误,它只是不会产生声音。

当我在一个名为on' onClick'事件它最初起作用,但我第六次调用它时不出所料地得到一个错误,因为我达到了我可以调用它的极限。

var context = new AudioContext; //when defined here, no sound is produced

function playChord() {
    var context = new AudioContext; //when defined here, sound is produced (only 6 times)

    var time = 0.05;
    var frequencies = [...];
    frequencies.forEach(function(frequency) {
        var oscillator = context.createOscillator();
        var gain = context.createGain();

        gain.gain.setValueAtTime(0, audioContext.currentTime);
        gain.gain.linearRampToValueAtTime(1, time);
        gain.gain.linearRampToValueAtTime(0, time + 60*0.25);

        oscillator.frequency.value = frequency;
        oscillator.connect(gain);
        gain.connect(context.destination);

        oscillator.start(...);
        oscillator.stop(...);
    });
};

为什么仅仅移动上下文变量的实例化会阻止我的浏览器(chrome)产生声音?

1 个答案:

答案 0 :(得分:0)

找到我自己的问题。不出所料,这是一个愚蠢的错误。问题在于这一行

gain.gain.linearRampToValueAtTime(1, time);

我没有将增益设置为1,相对于context.currentTime。

在函数内部定义AudioContext时它正常工作的原因是因为'currentTime'从0开始计数,并且足够接近仍然影响有问题的振荡器。

当它移出函数时,时间远远超过linearRamptoValueAtTime()影响任何东西的范围。只需添加context.currentTime,一切都会好的:)

gain.gain.linearRampToValueAtTime(1, context.currentTime + time);
gain.gain.linearRampToValueAtTime(0, context.currentTime + time + 0.25);