2011-11-19 268 views
1

我正在使用實現Receiver的類實時從我的midi鍵盤讀取MIDI消息,並輸出彈奏的音符。如何將時間戳轉換爲刻度(PPQ) - 實時Midi

我按下筆記時收到的唯一信息是MidiMessage和timeStamp。

我想把筆記畫成實際的鋼琴樂譜,而且用戶現在必須事先設置bpm。

因此,如果我知道速度是120bpm(例如),如何使用timestamps來確定按下音符的長度?

我假設如果我可以將timeStamp轉換爲ticks(ppq),那麼我可以使用它來計算時間。

任何幫助,非常感謝。以下是我的Receiver類中的「send」方法。

'firstStamp'和'secondStamp'變量只是輸出音符的長度。筆記釋放時我記錄了時間戳,並在按下時扣除了時間戳。

@Override 
public void send(MidiMessage message, long timeStamp) { 

    String strMessage = null; 

    if (firstStamp == 0) { 
     firstStamp = timeStamp; 
     secondStamp = timeStamp; 
    } 

    firstStamp = secondStamp; 
    secondStamp = timeStamp; 

    stampDif = (secondStamp - firstStamp); 

    if (message instanceof ShortMessage) { 

     strMessage = decodeMessage((ShortMessage) message, timeStamp); 


    } else if (message instanceof MetaMessage) { 

     strMessage = decodeMessage((MetaMessage) message); 

    } else if (message instanceof SysexMessage) { 

     strMessage = decodeMessage((SysexMessage) message); 

    } else { 
     strMessage = "other message" + message.getStatus(); 
    } 
    r_out.println("Timestamp: " + timeStamp + " " + strMessage); 
    r_printStream.println("Timestamp: " + timeStamp + " " + strMessage); 

} 

回答

2

如果時間戳是以毫秒爲單位,那麼你可以將其轉換爲蜱是這樣的:

long ticks = timestamp * bpm/(1000 * 60); 

位,你會得到一個高的起點蜱因爲時間戳可能是因爲1月1日1970年因此,如果你想讓你的第一個「打勾」爲0,你需要跟蹤這是否是你第一次看到的事件。

if (tickOffset == -1) { // Using -1 as not initialized 
    tickOffset = ticks; 
} 
ticks = ticks - tickOffset; 
+0

感謝您的回覆。 –

相關問題