3

ドラム マシンを作成していますが、MIDI ビート クロックの出力に問題があります。簡単にするために、Thread.sleep(_time) を呼び出して内部クロックを実行するように設定しました。_time は、次のコードで計算される 16 分音符の時間です。

/**
 * 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 の整数値です。前述のとおり、私のドラム マシンは問題なく動作しますが、ビート クロックを出力するときに問題が発生します。スレーブ デバイスのビート クロックは、4 分音符あたり 24 パルスの受信を想定しているため、16 分音符あたり 6 パルスのレートが得られます。出力キューにメッセージを追加するために timer.scheduleAtFixedRate を使用しています。

120 BPM のテンポがあるとします。これにより、4 分音符あたり 60000/120 = 500 の時間が得られます。これは、16 分音符ごとに 125 ミリ秒です。16 番目の音符ごとに 6 つのパルスが必要です。scheduleAtFixedRate のパラメータはミリ秒しかかからないので、もっと精度の高いカウンターを作らないといけないのですが、ナノ秒を使ってもしばらくするとズレてしまいます..

私は本当にJava MIDI APIをくまなく調べて、これに役立つものを見つけようとしましたが、これのために設計されたメソッドを見つけることができないようです. 何か提案があれば教えてください。

乾杯。/M

4

1 に答える 1

1

このリンクによると、Java 5 から利用可能な Object.wait(millis, nanos) および Thread.sleep(millis, nanos) を使用できます。スレッドをスケジュールする場合は、ScheduledThreadPoolExecutor を使用することをお勧めします。

このライブラリも見つけました。チェックする価値があるかもしれません。

幸運を!

于 2013-07-23T21:10:47.143 に答える