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

标签 javascript time midi clock

任务是在 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/

相关文章:

javascript - Moment.js 两次的差异/持续时间(不是日期)

performance - 如何降低 O(N^2) C-index 函数的时间复杂度?

midi - 在 Gervill SF2Soundbank 中将多个样本添加到一个乐器

midi - 在 Python MIDI MIDO 读取/保存文件中转换时间/节拍

iphone - BASS_MIDI_StreamEvent在零位置

javascript - 根据浏览器添加不同的HTML

javascript - 有没有办法使用 WebDriver 自动触发 setTimeout 事件?

javascript - 选择输入标签 - 在点击时选择中间日期

在时间复杂度 O(n) 的无限线上找到一个点的算法

java - 时间戳在Java中即时