我正在创建一个鼓机,我在输出MIDI节拍时遇到了一些问题。 为简单起见,我通过调用Thread.sleep(_time)设置内部时钟运行,其中_time是由以下代码计算的十六分音符的时间量:
/**
* Calculates the length of a semiquaver in the sequencer
* @return the time of a semiquaver in milliseconds
*/
private void calculateTempo()
{
Log.i(DEBUG_TAG , "Calculated tempo.");
/**
* Fjärdedelsnot
*/
_quarterNote = 60000/_tempo;
/**
* Sextondel
*/
_sixteenthNote = (_quarterNote/4);
}
_tempo是BPM的整数值。 正如我所说,我的鼓机运行正常,但在输出节拍时我遇到了问题。 从动设备中的节拍时钟期望每四分音符接收24个脉冲,这给出了每十六分音符6个脉冲的速率。 我正在使用timer.scheduleAtFixedRate将消息添加到输出队列。
假设我们的节奏为120 BPM,这给了我们每季度音符60000/120 = 500的时间,即每十六音符125毫秒。 每十六分音符应该有六个脉冲,125/6 = 20.83333 ..你可以看到为什么这会让我陷入困境。 scheduleAtFixedRate只需要毫秒作为参数,所以我必须制作一个具有更高精度的计数器,但即使我使用纳秒,事情也会在一段时间后开始漂移......
我真的在梳理Java MIDI api,试图找到一些能帮助我的东西,但我似乎无法找到任何为此设计的方法。 如果您有任何建议,请告诉我们。
干杯。 / M
答案 0 :(得分:1)
根据this link,您可以使用Java 5提供的Object.wait(millis,nanos)和Thread.sleep(millis,nanos)。 如果你想使用ScheduledThreadPoolExecutor来安排线程。
我也找到this library,也许值得一试。
祝你好运!