2011-11-05 47 views
0

我試圖解析MIDI文件,但我的解析器無法從互聯網上解析大多數MIDI文件,因爲它一直在SMF規範中未指定的命令字節上磕磕絆絆。用FL Studio導出的MIDI文件工作正常,但幾乎所有其他MIDI似乎都打破了。如何解析/忽略標準MIDI文件中的未指定命令?

例如,從this midi file
00 B0 20 02 | 00 00 00 | 00 C0 00
第一部分很容易解析。這是根據MIDI規範的控制變化。但第二部分沒有意義。 0滴答後,做什麼?在此之後我可以期待多少字節? 0x00未在SMF中指定爲命令。不過,之後的部分是可識別的,所以你可以看到第二部分有1個數據字節。

但是,如果我只是解決前一個問題,後面就會變得一團糟:
00 C0 00 | 00 B0 07 6E | 00 0A 40 00 5B 46 00 5D 00 00 5E 19 86 70 90 41 6E 00 45 6E 48 45 00 00 41 00 00 43 6E 48 43 00 00 48 6E 60 48 00 00 3C 6E 00 35 6E 30 35 00 [etc]
好的,讓我們來看看。補丁更改,檢查。控制器更改,檢查。 0A? 0A到底做了什麼?試圖識別0A部分無效後的任何命令,這都是一團糟,我不知道屬於那個0A命令或下一個實際的SMF命令何時開始。在這個混亂之後,我根本不知道如何解析剩下的音軌。

然而,像Winamp和FL Studio這樣的程序可以很好地打開這些MIDI文件。他們是如何做到的呢?我如何知道垃圾數據何時結束並開始正確的命令?

回答

2

這不是垃圾數據。這是運行狀態。如果在處理一個命令後,下一個字節小於80美元,則假定與前一個命令的狀態字節相同。 Here's a description of running status.

+0

非常感謝!這解決了這個問題。 – VDZ

+0

很高興聽到它! – SSteve