我需要從MIDI文件中獲取速度值。我發現,該set_tempo命令具有值0x51,所以我有這一段代碼:如何從MetaMessage.getData()返回的字節數組中獲取整數值?
for (int i = 0; i < tracks[0].size(); i++) {
MidiEvent event = tracks[0].get(i);
MidiMessage message = event.getMessage();
if (message instanceof MetaMessage) {
MetaMessage mm = (MetaMessage) message;
if(mm.getType()==SET_TEMPO){
// now what?
mm.getData();
}
}
}
但該方法的getData()返回一個字節數組!我怎樣才能把它轉換成正常的人形,a.k.a.整數? 我讀過它的格式是這樣存儲的:「tt tt tt」,但是整個大/小端,有符號/無符號和可變長度的東西使它太混亂了。
兩種解決方案都不能提供相同的結果嗎?如果是這樣,我不明白你的解決方案的優點是什麼。 – Leprechaun
結果大約相差4倍。即使第一個結果除以4,它也會與第二個結果相差最多3%,具體取決於位的模式和每個數據項中符號位的存在。測試的方法是檢查播放或錄製各種節奏的音樂的持續時間。 – user8182116
這很奇怪。實際上,我幾年前在我的學士論文中使用了接受的答案。它提供了正確的結果,當打印和評估與估計的基本面相關的一些midi數據時。錄音的長度也等於繪製和評估的MIDI信號。曲目長達幾分鐘,因此立即會注意到4倍的差異。 如果你所說的是真的,我唯一能解釋的方法是隻能在特定的速度值下才能觀察到。那是對的嗎? – Leprechaun