Webaudio时序性能

Webaudio timing performance

下面的文件使用 ToneJS 演奏稳定的八分音符。根据计时日志,8分音符的间隔正好是0.25秒。

然而,它们甚至 听起来。音符之间的时间间隔明显不规则。

为什么会这样?有什么可以做的吗?或者这是 Javascript/webaudio-api 的性能限制?我已经在 Chrome、Firefox 和 Safari 中对其进行了测试,结果都是一样的。

感谢您提供有关此的任何信息或建议!

<!DOCTYPE html>
<html>
<head>
<title>Tone Timing Tester</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tone/14.8.32/Tone.min.js"></script>
</head>

<body>
<button onclick="start()">Start</button>
<button onclick="stop()">Stop</button>
<form>
    <input id="bpm" type="number" value="120">
    <button type="button" onclick="submitBPM()">Enter BPM</button>
</form>

<script type="text/javascript">
    
    var synth = new Tone.Synth().toDestination()

    Tone.Transport.scheduleRepeat(function(time){
        console.log('time', time);
        synth.triggerAttackRelease('C4', '8n')
    }, "8n");

    async function start() {
        await Tone.start()
        Tone.Transport.start();
    }

    function stop() {
        Tone.Transport.stop();
    }

    function submitBPM() {
        var bpm = document.getElementById('bpm').value;
        Tone.Transport.bpm.value = bpm;
    }

</script>
</body>
</html>

对于预定的 triggerAttackRelease,您应该将 time 值作为第三个参数传递。

Tone.Transport.scheduleRepeat(function(time){
    console.log('time', time);
    synth.triggerAttackRelease('C4', '8n', time);
}, "8n");

这是一个包含工作代码的 codepen