Web音频振荡器仅在Firefox中单击

sch*_*nky 6 javascript firefox web-audio-api

我正在尝试使用网络音频振荡器创建一个简单的节拍器,因此不需要外部音频文件.我通过非常快速地上下调节振荡器的音量来创建节拍器的声音(因为你不能多次使用start()和stop()),然后以设定的间隔重复该功能.它最终听起来像一个漂亮的小木块.

下面的代码在Chrome,Safari和Opera中运行/听起来很棒.但是在Firefox中,当音量增加时,会出现令人讨厌的间歇性"点击".我已经尝试改变攻击/释放时间以摆脱点击,但它们必须真的,很久才会一直消失.事实上,很长一段时间,振荡器听起来像一个持续的音符.

var audio = new (window.AudioContext || window.webkitAudioContext)();
var tick = audio.createOscillator();
var tickVol = audio.createGain();

tick.type = 'sine'; 
tick.frequency.value = 1000;
tickVol.gain.value = 0; //setting the volume to 0 before I connect everything
tick.connect(tickVol);
tickVol.connect(audio.destination);
tick.start(0);

var metronome = {
    start: function repeat() {
        now = audio.currentTime;

        //Make sure volume is 0 and that no events are changing it
        tickVol.gain.cancelScheduledValues(now);
        tickVol.gain.setValueAtTime(0, now);

        //Play the osc with a super fast attack and release so it sounds like a click
        tickVol.gain.linearRampToValueAtTime(1, now + .001);
        tickVol.gain.linearRampToValueAtTime(0, now + .001 + .01);

        //Repeat this function every half second
        click = setTimeout(repeat, 500);
    },
    stop: function() {
        if(typeof click !== 'undefined') {
            clearTimeout(click);
            tickVol.gain.value = 0;
        }
    }
}

$("#start").click(function(){
  metronome.start();
});

$("#stop").click(function(){
  metronome.stop();
});
Run Code Online (Sandbox Code Playgroud)

Codepen

有没有办法让FF听起来像其他3个浏览器?

Ray*_*Toy 1

最好让 Firefox 来解决这个问题(如果确实是 Firefox 的自动化 bug)。话虽如此,您可能可以通过使用具有您想要的预先计算的点击波形的 AudioBufferSource 节点来使所有浏览器保持一致。只需生成一个正弦波,根据需要(手动)将其升高或降低,然后定期播放即可。

不是很好,但应该是跨平台的。