Transmitterから定期的な信号 (1 分あたりのビート数) を受信しており、1/1、1/2、1/4、1/8、1/16 などのように、周期の一部でメソッドを呼び出したいと考えています。 。 ノート。
これに対する私の解決策は、スレッドを作成し、ビジー状態で待機してからメソッドを実行することです。ここでの問題は、信号をリッスンし、処理して送り返すと、数ミリ秒の遅延が発生することです (システムによって異なります)。
したがって、着信信号とスレッドの定期的な信号の間の遅延を特定したいと思います。遅延が != 0 の場合は、現在のスレッドを停止し、「bpm - 遅延」ミリ秒後に新しいスレッドを開始します。これはどのように行うことができますか?
図:
送信機信号: |----|----|----|----|
******ランナー信号: |----|----|----|----|
ランナー信号を「onePeriod - delay」ミリ秒遅らせる:
送信機信号: |----|----|----|----|
***"ランナー信号:**** |----|----|----|----|
両方の信号が同期しています。
public class Quantiser implements Receiver{
private int[] bpmsInMillis = new int[4];
private int bpmInMillis=0;
private double smallestNote = 1;
private long period=0;
private long fire=0;
private long prevTimeStamp=0;
private Runnable runny = new Runnable() {
@Override
public void run() {
while(true){
fire = System.nanoTime() + period;
while(System.nanoTime() < fire){} // busy wait
// Call some methods here.
}
}
};
private Thread thread = new Thread(runny);
@Override
public void send(MidiMessage message, long timeStamp) {
// Calculate average bpm
for(int i=0; i<bpmsInMillis.length-1;i++)
bpmsInMillis[i] = bpmsInMillis[i+1];
bpmsInMillis[bpmsInMillis.length-1] = (int) ((timeStamp - prevTimeStamp) / 1000);
bpmInMillis = arithmeticMean(bpmsInMillis);
prevTimeStamp = timeStamp;
period = (long) (bpmInMillis * smallestNote * 1000000);
if(!thread.isAlive()) {
thread.start();
}
/*
else{
Calculate delay between signal and thread-signal.
if(delay != 0){
Delay new thread by "bpm - delay" milliseconds.
Stop old thread.
Start new thread.
}
*/
}
@Override
public void close() {
}