1

下面的文件使用 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>
4

1 回答 1

1

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

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

这是一个包含工作代码的代码笔。

于 2021-11-02T12:49:26.473 回答