我只是寫我自己的MIDI解析器,我想知道如何區分0xFF
,從一些Meta-event
也與編碼的0xFF
開始指定完整的實時類別消息Reset
,然後一些字節(例如FF 2F 00
- >End of track
)。MIDI解析 - 如何知道0xFF字節指定的是什麼?
回答
正如@Brad暗示的,關於您是在解析流式MIDI數據還是從文件中讀取數據是有區別的。無論如何,當你從文件中讀取時,你只需要跟蹤你所處的狀態。你可以在文件中的許多地方遇到0xff,但是你需要知道你是否正在解析事件或變長的時間戳,或者別的東西。例如,如果您剛剛解析了一個時間戳並遇到0xff,那麼這將是一個元事件。
另外,我發現,MIDI文件格式最好的參考是在這裏:
當然你是對的,在MIDI文件格式中,有必要跟蹤你所處的狀態(你是否要讀取deltatime或命令代碼或其參數),但是我讀到了可能發生的實時類別消息在任何時候,即使在其他一些命令的中間。當我處於該狀態時,我可以期待'0xFF',我怎麼能知道它是實時消息還是命令的代碼開始? – nuoritoveri 2012-05-05 12:18:31
我想你的意思是http://www.sonicspot.com/guide/midifiles.html – Brad 2012-05-05 17:37:28
是的,thx。固定鏈接。 – 2012-05-06 08:40:48
在一個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。)
- 1. 的Python 0xFF的字節
- 2. 什麼是C#中的0xFF?
- 3. Java MIDI解析器?
- 4. 爲什麼字節b =(字節)0xFF等於整數-1?
- 5. 軌道如何知道:什麼是?
- 6. 如果我不指定字符串,Angular如何知道要注入什麼?
- 7. a [0] = addr&0xff是什麼?
- 8. 在iOS中解析Midi包
- 9. 如何知道什麼時候Drupal節點是新的
- 10. MIDI文件解析
- 11. 解析方法定義字符串,不知道如何解析成scala.meta.Decl.Def
- 12. 活動如何知道R是什麼?
- 13. 如何知道什麼是語言?
- 14. JIRA如何知道未解決的問題是什麼?
- 15. 如何用0xFF字節填充MemoryStream?
- 16. 如何在VB.NET中寫入(字節)0xFF
- 17. 如何在Python中打印0xff字節?
- 18. 如何才能知道什麼是C#
- 19. 如何知道什麼是多要求
- 20. jquery如何知道是什麼
- 21. 如何知道什麼是存根?
- 22. 如何知道什麼
- 23. 打字稿不知道FORMDATA是什麼
- 24. 爲什麼我的PNG解析與Ghostscript不是我指定的?
- 25. 你知道如何解析這個嗎?
- 26. 不知道如何正確解析typedef
- 27. 如何知道指針是否指向特定的結構?
- 28. 「AND AL,0xFF」的用途是什麼?
- 29. charCodeAt(...)&0xff是什麼完成的?
- 30. 如何解析/忽略標準MIDI文件中的未指定命令?
你在談論解析MIDI文件,不是直接的MIDI數據,是的? – Brad 2012-01-15 21:19:06
對不起,有一些(looong)時間。是的,我的目標是解析一個MIDI文件,但真的有區別嗎?我相信實時類別的消息也可以在文件中遇到(我還沒有找到任何來源說它不能,如果是這樣,請讓我現在)。據我所知,實時消息可以隨時發生,當你處於解析某個其他命令的過程中時,這就是爲什麼我不知道如何區分這兩種情況的原因。 – nuoritoveri 2012-05-05 12:12:13