2011-07-30 42 views
1

我正在用Java編寫一個MIDI文件閱讀器(主要是作爲練習,可能用於Android項目,因爲它不包含javax.sound.midi庫)。我遵循this規範。解碼未知的MIDI事件

我的規範細節在我的項目中得到了很好的實施,實際的閱讀是逐個事件地進行的。在該文件上打開一個InputStream,並且同一個對象被傳遞以解析各種事件對象,以便在事件完成自身解析時,將流定位到下一個事件。這一切都非常出色。

我的第一個測試文件只是一個速度地圖,其中有一個在Sonar 8中創建的空數據軌道。速度軌道被完美地解析。空軌道的塊標識符和軌道名稱後具有以下數據:

00 B0 07 47 00 0A 40 00 FF 2F 00

第一字節被成功解析。 00 = 0,B0 =控制器事件的​​增量時間上的信道0,07 =主音量控制,71.

接下來的字節被混淆我47 =音量值。 00 0A 40最有可能的情況是它是一個值爲64的Pan事件。0A是一種Controller事件,我期望在卷事件前加上B0。但是由於它沒有一個已知的事件標識符字節,所以我的閱讀器無法解析這個事件。

所以我想我的問題是如何解釋這種類型的事件?用文件格式將控制器事件與單個B0標識符一起串起來是否可接受?此外,如果我在文件中遇到無法識別的事件類型,是否真的有辦法知道如果我不知道事件應該是什麼,我可以跳過多少數據?我希望能夠跳過未知事件,以便我的讀者不會失敗,但如果我無法確定事件,我不知道如何跳過它。希望對這些具體案例有所瞭解。

+0

我通過查看非空數據軌道(具有實際音符的軌道)獲得了一些洞察。雖然我預計會有一堆Note-On事件(0x9),但我會看到一個Note-On事件,後面跟着音軌中的所有音符。另外有趣的是沒有Note-Off事件,Note-On事件的速度爲0,筆記應該結束。所以我認爲事件標識符不僅可以識別下一個事件,而且可以將事件標識符之後的所有字節視爲該類型的事件,直到找到另一個事件標識符。我仍然希望對此進行確認或進一步解釋。 – LeffelMania

+0

[midi文件解析,無法識別的事件類型]的可能重複(http://stackoverflow.com/questions/7719366/midi-file-parsing-unrecognised-event-type) – Arhad

回答

3

這就是所謂的運行狀態。它是MIDI規範的一部分。你在做什麼是正確的。對不起,你必須通過逆向工程來設計一個MIDI數據流。Here is a longer explanation of running status.

而且,是的,速度爲0的Note On事件是Note Off。實際的註釋關閉事件具有關聯的速度,但幾乎沒有設備實現註釋關閉速度,所以在速度爲零的情況下看到註釋更爲常見。

+0

這是一個更加充實的規範,這是偉大的。非常感謝,先生。 – LeffelMania

+0

非常歡迎。在MIDI的曙光中,我做了很多與MIDI有關的編程,所以請發表您可能遇到的任何問題。 – SSteve

0

我會回答我自己的問題,以防有人遇到類似問題。 (但不太可能是這樣)

我上面的評論似乎持有。在讀取第一個識別的事件後,如果後續事件沒有事件標識符,則可將其視爲與前一事件相同的事件類型。

所以在我的例子:

00 B0 07 47 00 0A 40 00 FF 2F 00

可以理解爲即使只有一個事件標識符存在兩個連續的控制器事件。所以這確實是一個Volume事件07,接着是Pan事件0A,其次是End of Track事件FF 2F 00

我的代碼中的解決方案是記住看到的最後一個標識符,如果流中的下一個字節不是有效標識符,則下一個字節塊將被解釋爲與上一個事件相同類型的事件。似乎有意義,更重要的是,我的讀者成功完成。