2009-07-25 63 views
4

我正在嘗試從.mid文件中讀取信息,但我一直看到似乎不屬於任何MIDI信息的額外字節。我不知道如何預測/處理這些問題,並且將其他所有內容都拋棄在我的項目中。有什麼建議麼?下面是幾個例子:.mid文件中的額外字節

 
4d 54 72 6b 00 00 04 48   Track Header 
00 c0 19       Program Change 
00 ff 03 07 54 72 61 63 6b 20 31 Track Title 
00 b0 05 00      Controller Event 
00 64 00 00 06 0c 00 26 00  ???? 
00 b0 20 00      Controller Event 

00 ff 58 04 0c 03 0c 08   Time Signature 
81 89        ???? 
50 ff 51 03 0f 42 40    Tempo 
00 ff 2f 00      End of Track 

00 ff 21 01 00     Unknown Meta Event 
30 b0 79 00      Controller Event 
00 07 64 01 0a 32 01 5b   ???? 
14 01 5d 11 01 20 00 00 00  ???? 
00 c0 23       Program Change 
8c 7c 90 23      ???? 

我很懷疑,我甚至有故障就在這裏,因爲其中的一些似乎有非零增量時間沒有任何理由可言。

回答

1

看起來你甚至沒有開始正確的。包括8個字節should be

4D 54 68 64 00 00 00 06

我的猜測是,該文件的大清洗,或者你沒有正確地閱讀呢?

編輯:沒關係。你沒有說這是文件的開始。你有四個字節是一個塊頭。

2

MIDI事件中的增量時間是可變長度的,因此每個事件使用1個或更多字節來編碼從上一個事件開始流逝的時間。見this

每個MIDI事件的增量時間都是0(表示它與上一個事件發生的時間完全相同)或某個正值(表示它應該在上一個事件之後發生)。

2

MusiGenesis得到它的一半正確 - 你沒有正確解析可變長度的delta。但是您看到的其他事件是running status,這是一種用於在發送多個相同類型的消息時省略狀態字節以節省帶寬的技術。

這裏是一個轉儲應該如何解析:

 
4d 54 72 6b 00 00 04 48   Track Header 
00 c0 19       Program Change 
00 ff 03 07 54 72 61 63 6b 20 31 Track Title 
00 b0 05 00      Controller Event 
00 64 00       Running status (controller event) 
00 06 0c       Running status (controller event) 
00 26 00       Running status (controller event) 
00 b0 20 00      Controller Event 

等。但是我不明白的是爲什麼在下一首曲目標題前的曲目信息結束後會出現一大堆附加事件?你有沒有粘貼你的MIDI文件?

+0

對不起,我應該指定。這只是件,整個文件是巨大的,我無法發佈所有的字節。儘管如此,仍然有一些事情我不瞭解。這是一個連續的文件。 00 ff 21 01 00(未知元事件)30 b0 79 00(控制器變化)00 07 64 01 0a 32 01 5b 14 01 5d 11 01 20 00 00 00 00 c0 23程序變更8c 7c 90 23 73 0d 23這是其次是A LOT更多的字節,這必須是控制器的變化。整個賽道沒有註釋或註釋事件,7f以上的數值只在delta時間出現。 – Skunkwaffle 2009-07-27 18:47:46