我正在用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
標識符一起串起來是否可接受?此外,如果我在文件中遇到無法識別的事件類型,是否真的有辦法知道如果我不知道事件應該是什麼,我可以跳過多少數據?我希望能夠跳過未知事件,以便我的讀者不會失敗,但如果我無法確定事件,我不知道如何跳過它。希望對這些具體案例有所瞭解。
我通過查看非空數據軌道(具有實際音符的軌道)獲得了一些洞察。雖然我預計會有一堆Note-On事件(0x9),但我會看到一個Note-On事件,後面跟着音軌中的所有音符。另外有趣的是沒有Note-Off事件,Note-On事件的速度爲0,筆記應該結束。所以我認爲事件標識符不僅可以識別下一個事件,而且可以將事件標識符之後的所有字節視爲該類型的事件,直到找到另一個事件標識符。我仍然希望對此進行確認或進一步解釋。 – LeffelMania
[midi文件解析,無法識別的事件類型]的可能重複(http://stackoverflow.com/questions/7719366/midi-file-parsing-unrecognised-event-type) – Arhad