2012-01-15 44 views
1

我只是寫我自己的MIDI解析器,我想知道如何區分0xFF,從一些Meta-event也與編碼的0xFF開始指定完整的實時類別消息Reset,然後一些字節(例如FF 2F 00 - >End of track )。MIDI解析 - 如何知道0xFF字節指定的是什麼?

+1

你在談論解析MIDI文件,不是直接的MIDI數據,是的? – Brad 2012-01-15 21:19:06

+0

對不起,有一些(looong)時間。是的,我的目標是解析一個MIDI文件,但真的有區別嗎?我相信實時類別的消息也可以在文件中遇到(我還沒有找到任何來源說它不能,如果是這樣,請讓我現在)。據我所知,實時消息可以隨時發生,當你處於解析某個其他命令的過程中時,這就是爲什麼我不知道如何區分這兩種情況的原因。 – nuoritoveri 2012-05-05 12:12:13

回答

1

正如@Brad暗示的,關於您是在解析流式MIDI數據還是從文件中讀取數據是有區別的。無論如何,當你從文件中讀取時,你只需要跟蹤你所處的狀態。你可以在文件中的許多地方遇到0xff,但是你需要知道你是否正在解析事件或變長的時間戳,或者別的東西。例如,如果您剛剛解析了一個時間戳並遇到0xff,那麼這將是一個元事件。

另外,我發現,MIDI文件格式最好的參考是在這裏:

http://www.sonicspot.com/guide/midifiles.html

+0

當然你是對的,在MIDI文件格式中,有必要跟蹤你所處的狀態(你是否要讀取deltatime或命令代碼或其參數),但是我讀到了可能發生的實時類別消息在任何時候,即使在其他一些命令的中間。當我處於該狀態時,我可以期待'0xFF',我怎麼能知道它是實時消息還是命令的代碼開始? – nuoritoveri 2012-05-05 12:18:31

+2

我想你的意思是http://www.sonicspot.com/guide/midifiles.html – Brad 2012-05-05 17:37:28

+0

是的,thx。固定鏈接。 – 2012-05-06 08:40:48

1

在一個MIDI電纜,MIDI 消息是在傳輸他們即刻打算髮生。 A MIDI文件實際上是時間戳記的MIDI信息的記錄,以供以後重放。時間戳和MIDI信息的組合稱爲事件。 MIDI電纜上出現的信息與出現在MIDI文件中的事件之間存在一些差異。

在MIDI電纜上,您正確的是,一個字節的實時消息可能發生在其他消息的字節中間。但是,在MIDI文件中,跟蹤每個事件的確切字節數很重要,所以實時消息不能存儲在其他事件中間的MIDI文件中。

系統獨佔事件對於存儲在MIDI文件中很有用,但通常將其他系統公共或系統實時消息存儲在MIDI文件中是沒有意義的。

  • $ FF復位:在MIDI電纜,狀態字節$ FF意味着復位。但是,當您播放MIDI文件時,在播放過程中重置接收的MIDI設備通常沒有意義。因此,在MIDI文件中,$ FF的狀態字節被重新定義以指示元事件。

  • $ F6調整請求:如果設備響應此消息,我認爲它會執行一些內部調整校準,以中斷正在進行的任何播放。與重置消息類似,中斷MIDI文件內的播放沒有任何意義。

  • 時鐘,位置和啓動/停止的消息($ F1 MIDI時間碼季度框架,$ F2樂曲位置指針,$ F3歌曲選擇,$ F8時鐘,$ FA開始,$ FB繼續,$ FC停止):記錄MIDI文件的設備或軟件通常不會將這些傳入的消息記錄到MIDI文件中。但是,設備可以選擇將這些消息解釋爲實際重新定位,啓動,停止或控制播放或錄製的速度。播放MIDI文件的設備或軟件可以選擇將這些信息發送到MIDI輸出端口,以控制除MIDI文件音符以外正在播放其各自聲部的其他MIDI設備。由於這種用法,MIDI播放器負責發送這些時鐘,位置和開始/停止消息,而不是MIDI文件。

  • $ FE Active Sensoring:如果發送設備發送此消息,它將用作閒置填充以表明電纜仍然正確連接。如果接收設備開始看到活動感應消息,然後它們停止,則可以將其解釋爲電纜斷開連接並且保持靜音。將空閒填充符存儲在MIDI文件中是沒有用的。這將是發送設備發送它的功能,而不是MIDI文件的責任。

如果您確實需要將系統常用或系統實時消息存儲在MIDI文件中,我相信它們可以存儲在MIDI文件中的$ F7事件中。我的理解是存儲在$ F7事件中的數據字節將在MIDI電纜上逐字傳輸。 Sonic Spot document將$ F7的這種用法稱爲「Authorization SysEx」事件(滾動到文檔的底部)。 MIDI Technical Fanatic's Brainwashing Center文檔MIDI File Format將$ F7的這種用法稱爲「Escaped」事件(請參閱「MTrk中的事件」頁)。 MIDI音序器軟件Sekaiju將$ F7稱爲「SysEx(任意)」事件。


一般的警告:在MIDI Manufacturers Association網站,你可以找到一些official information(表和增編的標準),或要求在forum問題。但正如你可能知道的那樣,official MIDI standards cost money的主要內容。我沒有購買它們,所以我的理解基於第三方網站的描述和MIDI軟件的一般用法。您應該始終意識到第三方可能已經解釋了與官方標準不同的意思。 (例如,傑夫·格拉特的MIDI技術狂熱者的洗腦班文件MIDI Specification說$ F9是蜱消息,但MMA說,消息$F9 is undefined and reserved。格拉特說General MIDI program 47 is Orchestral Strings,在MMA說program 47 is Orchestral Harp。)