gpt4 book ai didi

javascript - 在 Javascript 中模拟 MIDI 节拍时钟

转载 作者:行者123 更新时间:2023-11-29 22:28:18 27 4
gpt4 key购买 nike

任务是在 js 中模拟 MIDI 播放器的工作,但只是为了模拟节拍之间的延迟。有一个节拍时钟格式的节拍开始时间数组,例如 [960, 1280, 2200, ...],以及我用于计算每个节拍滴答的毫秒时间的公式:

var beatTickTime = 60000 / (tempo * 96);

问题在于非常慢的报价实时生成。即使我使用 1 秒延迟,它仍然很慢。这是它的实现方式:

var tickTimer = setInterval(function() {
...
tickCount += 1;
}, beatTickTime); // or just 1 ms

我应该通过 tickCount += someNumber 传递一些节拍吗?或者有更常见的方法来解决这个问题?此外,我不确定我的公式中是否包含 96(PPQ * 4 次)。

P. S.节拍来自解析的吉他专业文件

最佳答案

不能保证 setInterval() 会按照您要求的速度运行。即使超时设置为 1,您也不能指望该函数每秒被调用 1,000 次。

您很可能需要执行以下操作:

var startTime = (new Date()).getTime();
setInterval(function() {
var relTime = (new Date()).getTime() - startTime;
// relTime is now the number of ms since the script started

/*
In here, you'll need to see if relTime is large enough to indicate the next
beat has been reached. So that means keeping some sort of external marker
to indicate the most recent beat that has occurred -- when relTime is big
enough to move that marker to the next beat, also run any code that is
necessary to handle that beat.
*/
}, 1);

循环运行“尽可能快”,但仍然比预期慢得多。它测量相对于脚本开始的当前时间,并确定每次迭代的差异。您可以将这段时间除以歌曲的节奏,这样您就会知道您目前在歌曲中所处的位置。

关于javascript - 在 Javascript 中模拟 MIDI 节拍时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com