Java中的MIDI节拍时钟

时间:2013-05-10 12:12:02

标签: java asynchronous midi outputstream

我正在创建一个鼓机,我在输出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

1 个答案:

答案 0 :(得分:1)

根据this link,您可以使用Java 5提供的Object.wait(millis,nanos)和Thread.sleep(millis,nanos)。 如果你想使用ScheduledThreadPoolExecutor来安排线程。

我也找到this library,也许值得一试。

祝你好运!