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