1、1 總觀一個mid文件主要包括兩部分,標頭數據和音軌數據。
2、簡介的第二部分介紹標頭數據,第三部分介紹音軌數據。
(相關資料圖)
3、mid文件包含僅一個標頭數據來描述文件格式等,和任意數量的音軌數據。
4、一個音軌可以被理解為多聲道磁帶的磁軌你可以指定一個音軌為一個聲音,一段填充空白,一個樂器或你希望的什么東西。
5、2 標頭數據標頭數據出現在文件的開頭,描述文件的三個部分。
6、標頭數據總向這樣:4D 54 68 64 00 00 00 06 ff ff nn nn dd dd前4比特等價于ASCII字符“MThd”。
7、在這4比特頭標簽之后,總是00 00 00 06,因為頭信息總是六比特。
8、(譯者按:這六比特頭信息是4D 54 68 64 00 00,最后兩比特用0填充。
9、之后是的00 06而不是06,是因為整型變量要占兩個字節(jié)。
10、這就是數字6前面多出來一個字節(jié)的原因。
11、下同。
12、)ff ff是文件類型,一共有3種類型:0 - 單音軌1 - 多音軌,同步音軌2 - 多音軌,異步音軌單音軌,顧名思義,只有一條音軌。
13、同步多音軌是說所有的音軌并行播放,通俗地說,同時開始播放,這樣可以在音樂中代表不同的聲部。
14、異步多音軌不一定在音樂開始時播放。
15、它們可以完全異步。
16、nn nn是mid文件的音軌數量。
17、dd dd是每個四分音占用的時間片(這個以后再詳細說明)。
18、(譯者按:這兩個比特越大,音樂節(jié)奏越快。
19、)3 音軌數據標頭數據之后,文件剩下的部分是音軌數據。
20、每個音軌都有一個標頭,和你需要的數個命令。
21、就像文件的標頭數據,音軌標頭是這樣的:4d 54 72 6b xx xx xx xx這里的前4比特等價于ASCII字符的“MTrk”。
22、之后的4個字節(jié)說明了這個音軌長度,音軌字節(jié)數(不包括音軌標頭)。
23、標頭之后的是midi事件。
24、這些事件實際上是送向midi合成器接口的數據和一個附加數據:時間片。
25、時間片表示經過多少tick之后事件開始被運行。
26、每四分音之后的時間片被預先定義在標頭數據里。
27、這里的時間片是可變長度的編碼數據。
28、這種格式盡管有些混亂,卻可以使大數字使用隨意的字節(jié)數,不用浪費被填成0的字節(jié)。
29、這些數被轉換為7比特的字節(jié),每個字節(jié)最特殊的最高有效位(MSB),除了數字的末字節(jié)是0外,其他字節(jié)是1。
30、這樣,讀取數字每次讀一字節(jié),當你看到最高有效位是0時,你就會知道這是數字的最后一個字節(jié)。
31、根據mid規(guī)格,整個時間片最多占4字節(jié)。
32、時間片之后是mid事件,每個mid事件(除了運行事件)有一個最高位是1的命令字節(jié)(字節(jié)數值>=128)附錄列表A是大部分命令。
33、每個命令有不同的參數和長度,但命令后的數據必須是最高位為0的字節(jié)(字節(jié)數值)。
34、以上規(guī)則有一個例外,是meta事件,它可以包含最高位是1的數據字節(jié)。
35、然而,meta事件要求有一個長度參數,這樣能減輕你的困惑。
36、一個可能帶來混亂的細節(jié)(subtlety)是運行模式。
37、實際上這里是mid命令被疏忽,最近的mid命令發(fā)行物被假設的地方。
38、這意味著mid事件可以由時間片和和參數構成,這參數會轉到可能存在的命令。
39、4 總結如果這些解釋只能增加本文的混亂,那么附錄的例子可能使本文清晰一些。
本文到此分享完畢,希望對大家有所幫助。