【BLE MIDI】MIDI 文件格式分析总结 ★★★
文章目錄
- 一、MIDI 文件簡介
- 二、MIDI 文件頭解析
- 1、MIDI 文件頭標(biāo)識
- 2、MIDI 文件頭長度
- 3、MIDI 文件格式
- 4、MIDI 軌道個(gè)數(shù)
- 5、基本時(shí)間
- 三、MIDI 軌道分析
- 四、MIDI 軌道頭
- 五、MIDI 軌道長度
- 六、delta-time 間隔
- 七、FF 03 軌道名稱
- 八、FF 51 03 四分音符時(shí)長
- 九、FF 58 04 拍號
- 十、音符開指令
- 十一、音符關(guān)指令
- 十二、音軌結(jié)束標(biāo)志
一、MIDI 文件簡介
下面的 mid 文件是一個(gè)簡單 midi , 其中只有一條軌道 , 一個(gè)音符 ;
這個(gè) mid 文件很簡單 , 但是麻雀雖小 , 五臟俱全 , 其中有所有的必須的 midi 文件頭 , midi 軌道頭 , 時(shí)間標(biāo)志 , 等信息 ;
下面開始逐個(gè)字節(jié) , 解析上述 midi 文件 ;
4D 54 68 64 00 00 00 06 00 00 00 01 01 E0 4D 54 72 6B 00 00 00 25 00 FF 03 05 B2 E2 CA D4 30 00 FF 51 03 07 A1 20 00 FF 58 04 04 02 18 08 00 90 3C 64 8E 7E 80 3C 40 00 FF 2F 00二、MIDI 文件頭解析
文件頭數(shù)據(jù) :
4D 54 68 64 00 00 00 06 00 00 00 01 01 E01、MIDI 文件頭標(biāo)識
4D 54 68 64 : 0 ~ 3 字節(jié) , " MThd " 字符串 ASCII 碼 , 這是 mid 文件的標(biāo)識 ;
2、MIDI 文件頭長度
00 00 00 06 : 4 ~ 7 字節(jié) , 這是個(gè) 4 字節(jié)整型數(shù)據(jù) , 大端格式顯示 , 整型低位在高字節(jié) , 整型高位在低字節(jié) , 該數(shù)據(jù)表示 mid 文件文件頭長度 , 這里的文件頭長度為 6 , 表示后面 6 字節(jié)是 mid 文件文件頭的范圍 ;
大端格式 : 高位存儲在低字節(jié)中 , 符合人的書寫習(xí)慣 ;
小端格式 : 低位存儲在低字節(jié)中 , 符合計(jì)算機(jī)處理邏輯 ;
3、MIDI 文件格式
00 00 : 8 ~ 9 字節(jié) , 表示 mid 文件的格式 ; 這兩個(gè)字節(jié)是 short 類型整型 , 大端格式 ;
- 0 : mid 文件只有一條軌道 , 所有的通道都在一條軌道中 ;
- 1 : mid 文件有多個(gè)音軌 , 并且是同步的 , 即所有的軌道同時(shí)播放 ;
- 2 : mid 文件有多個(gè)音軌 , 不同步 ;
這里是 0 格式 , 也就是說只有一條軌道 ;
4、MIDI 軌道個(gè)數(shù)
00 01 : 10 ~ 11 字節(jié) , 表示 MIDI 軌道個(gè)數(shù) , short 類型 , 大端格式 ;
此處表示有一條軌道 , 所有通道的音符和節(jié)拍信息都在該軌道中 ;
5、基本時(shí)間
01 E0 : 12 ~ 13 字節(jié) , 用于指定基本時(shí)間 ;
2 個(gè)字節(jié) , 要拆分成 3 部分 , 最高位 ( 第 15 位 ) 作為標(biāo)識位 , 第 8 ~ 14 位 作為一部分 , 第 0 ~ 7 位 作為一部分 ;
由于是大端格式排列 , mid 文件第 12 字節(jié) ( 低地址 ) 是 高位 , mid 文件第 13 字節(jié) ( 高地址 ) 是低位 ;
01 E0 的二進(jìn)制形式如下 : 0000 0001 11110 0000 ;
最高位 0000 0001 11110 0000 是 0 , 紅色的是最高位 , 表示當(dāng)前 代表的事件格式是 類型1 , 第 0 ~ 14 位 代表的是 四分音符的 tick 數(shù) ;
十六進(jìn)制 01 E0 對應(yīng)的十進(jìn)制數(shù)字是 480 , 也就是說一個(gè)四分音符有 480 tick ;
tick 是時(shí)間單位 , 這是 mid 文件中計(jì)算時(shí)間的最基本單位 ;
三、MIDI 軌道分析
MIDI 軌道 , 以 MTrk 4D 54 72 6B 開始 , 以 FF 2F 00 結(jié)束 ;
下面的內(nèi)容是一個(gè)完整的 MIDI 軌道二進(jìn)制信息 ;
4D 54 72 6B 00 00 00 25 00 FF 03 05 B2 E2 CA D4 30 00 FF 51 03 07 A1 20 00 FF 58 04 04 02 18 08 00 90 3C 64 8E 7E 80 3C 40 00 FF 2F 00四、MIDI 軌道頭
4D 54 72 6B : MTrk 的 ASCII 碼 ;
五、MIDI 軌道長度
00 00 00 25 : 這是一個(gè) int 類型的整型數(shù)據(jù) , 大端格式顯示 , midi 軌道長度是十六進(jìn)制的 0x25 , 也就是十進(jìn)制的 37 , 代表從下一個(gè)字節(jié)開始計(jì)數(shù) 到 軌道結(jié)束位置 FF 2F 00 的最后一個(gè)字節(jié) , 一共有 37 個(gè)字節(jié) ;
每個(gè)軌道開始的標(biāo)志是 MTrk , 后面的 4 字節(jié)就是軌道的長度 ;
在下圖中 , 選中的字節(jié)有 373737 個(gè)字節(jié) ;
六、delta-time 間隔
delta-time 間隔 是 mid 中的重要機(jī)制 ;
midi 中的音符 , 事件 的時(shí)間間隔 , 都是通過 delta-time 體現(xiàn)的 ;
delta-time 是一個(gè)整數(shù) , 位數(shù)不固定 , 其單位是 tick , 也就是 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件頭解析 | MIDI 文件頭標(biāo)識 | MIDI 文件頭長度 | MIDI 文件格式 | MIDI 軌道個(gè)數(shù) | 基本時(shí)間 ) 二、MIDI 文件頭解析 5、基本時(shí)間 博客章節(jié)中計(jì)算的 tick 時(shí)間 ;
delta-time 的每個(gè)字節(jié)中 , 最高位 第 7 位 用于表示連續(xù)標(biāo)志 , 后面的 0 ~ 6 位 表示真實(shí)的數(shù)據(jù) ;
如果一個(gè) delta-time 由 2 字節(jié)組成 , 每個(gè)字節(jié)中最高位是連續(xù)標(biāo)志 , 后面 0 ~ 6 位是數(shù)據(jù) , 也就是說該 delta-time 實(shí)際的數(shù)值位數(shù)只有 14 位 ;
以后面的 8E 7E delta-time 為例 :
8E 7E 對應(yīng)的二進(jìn)制位數(shù)為 : 1000 1110 0111 1110
第一個(gè)字節(jié) 8E 對應(yīng)的二進(jìn)制數(shù)據(jù)位 1000 1110 , 其中第七位的 1 表示這是 delta-time 的高位字節(jié) , 后面的 000 1110 是實(shí)際的數(shù)值數(shù)據(jù) ;
第一個(gè)字節(jié) 7E 對應(yīng)的二進(jìn)制數(shù)據(jù)位 0111 1110 , 其中第七位的 0 表示這是 delta-time 的低位字節(jié) , 后面的 111 1110 是實(shí)際的數(shù)值數(shù)據(jù) ;
則該 delta-time 的實(shí)際數(shù)據(jù)是 000 1110 111 1110 , 重新組合后為 111 0111 1110 , 該 delta-time 的值是 1918 , 也就是 1918 個(gè) tick 數(shù) ;
以 82 C0 03 為例 , 對應(yīng)的二進(jìn)制數(shù)據(jù)為 1000 0010 1100 0000 0000 0011
第一個(gè)字節(jié) 82 對應(yīng)的二進(jìn)制數(shù)據(jù)位 1000 0010 , 其中第七位的 1 表示這是 delta-time 的高位字節(jié) , 后面的 000 0010 是實(shí)際的數(shù)值數(shù)據(jù) ;
第二個(gè)字節(jié) C0 對應(yīng)的二進(jìn)制數(shù)據(jù)位 1100 0000 , 其中第七位的 1 表示這是 delta-time 的高位字節(jié) , 后面的 100 0000 是實(shí)際的數(shù)值數(shù)據(jù) ;
第三個(gè)字節(jié) 03 對應(yīng)的二進(jìn)制數(shù)據(jù)位 0000 0011 , 其中第七位的 0 表示這是 delta-time 的低位字節(jié) , 后面的 000 0011 是實(shí)際的數(shù)值數(shù)據(jù) ;
則該 delta-time 的實(shí)際數(shù)據(jù)是 000 0010 100 0000 000 0011 , 重新組合后為 1010 0000 0000 0011 , 該 delta-time 的值是 40963 , 也就是 40963 個(gè) tick 數(shù) ;
七、FF 03 軌道名稱
FF 03 05 B2 E2 CA D4 30 : 23 ~ 30 字節(jié) , FF 03 是 Meta 事件 , 軌道名稱設(shè)置 ;
FF 03 后面是長度信息 , 05 表示該軌道名稱有 5 字節(jié) , 后面的 5 字節(jié)就是軌道名稱 ;
軌道信息后面的 31 字節(jié) 00 是 delta-time ;
八、FF 51 03 四分音符時(shí)長
FF 51 03 07 A1 20 : 32 ~ 37 字節(jié) , 音符速度標(biāo)志 ;
FF 51 03 是音符速度標(biāo)志位 , 后面的 07 A1 20 3 字節(jié)是一個(gè)數(shù)字 , 代表 四分音符 的時(shí)長 , 單位是微秒 ;
07 A1 20 對應(yīng)十進(jìn)制數(shù)是 500000 , 五十萬 , 也就是一個(gè)四分音符是 50 萬微秒 ;
在之前的 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件頭解析 | MIDI 文件頭標(biāo)識 | MIDI 文件頭長度 | MIDI 文件格式 | MIDI 軌道個(gè)數(shù) | 基本時(shí)間 ) 二、MIDI 文件頭解析 5、基本時(shí)間 博客章節(jié) 解析到一個(gè)四分音符有 480 個(gè) tick ;
此時(shí)可以計(jì)算出每個(gè) tick 的時(shí)長為 500000480\cfrac{500000}{480}480500000? 微秒 ;
再回顧下 delta-time 的計(jì)算 :
8E 7E 對應(yīng)的二進(jìn)制位數(shù)為 : 1000 1110 0111 1110
第一個(gè)字節(jié) 8E 對應(yīng)的二進(jìn)制數(shù)據(jù)位 1000 1110 , 其中第七位的 1 表示這是 delta-time 的高位字節(jié) , 后面的 000 1110 是實(shí)際的數(shù)值數(shù)據(jù) ;
第一個(gè)字節(jié) 7E 對應(yīng)的二進(jìn)制數(shù)據(jù)位 0111 1110 , 其中第七位的 0 表示這是 delta-time 的低位字節(jié) , 后面的 111 1110 是實(shí)際的數(shù)值數(shù)據(jù) ;
則該 delta-time 的實(shí)際數(shù)據(jù)是 000 1110 111 1110 , 重新組合后為 111 0111 1110 , 該 delta-time 的值是 1918 , 也就是 1918 個(gè) tick 數(shù) ;
上述的 delta-time 是 1918 個(gè) tick , 對應(yīng)的時(shí)間是 500000×1918480\cfrac{500000 \times 1918}{480}480500000×1918? 微秒
九、FF 58 04 拍號
FF 58 04 04 02 18 08 : 39 ~ 45 字節(jié) , 拍子記號 ;
FF 58 04 是拍子記號的標(biāo)志 ;
04 02 18 08 分別表示 :
- 04 : 拍子記號的分子 ;
- 02 : 拍子記號分母標(biāo)志 , 這里的值是 2 的次冪值 , 如當(dāng)前設(shè)置的值是 2 , 則拍子記號的分母是 22=42^2 = 422=4 , 分母是 4 ;
- 18 : 每個(gè) MIDI 時(shí)鐘包含的 tick 數(shù) ; 標(biāo)準(zhǔn)值是 24 , 一般不會改變 ;
- 08 : 每 24 個(gè) MIDI 時(shí)鐘 , 對應(yīng)的 32 分音符的數(shù)目 ; 標(biāo)準(zhǔn)值是 8 , 一般不會改變 ;
后面的 00 是 delta-time , 與下一個(gè) midi 事件間隔的 tick 數(shù) ;
delta-time 參考 【BLE MIDI】MIDI 文件格式分析 ( MIDI 軌道分析 | MIDI 軌道頭 | MIDI 軌道長度 | delta-time 間隔 ) 四、delta-time 間隔 博客章節(jié) ;
十、音符開指令
90 3C 64 : 47 ~ 49 字節(jié) , 音符開指令 ;
90 是音符開標(biāo)志 ;
3C 是音符音高 60 , 取值范圍 0 ~ 127 ;
64 是音符的力度值 , 取值范圍 0 ~ 127 ;
后面的 8E 7E 是 delta-time , 與后面的指令間隔的 tick 數(shù) ;
delta-time 參考 【BLE MIDI】MIDI 文件格式分析 ( MIDI 軌道分析 | MIDI 軌道頭 | MIDI 軌道長度 | delta-time 間隔 ) 四、delta-time 間隔 博客章節(jié) ;
十一、音符關(guān)指令
80 3C 40 : 52 ~ 54 字節(jié) , 音符關(guān)指令 ;
80 是音符開標(biāo)志 ;
3C 是音符音高 60 , 取值范圍 0 ~ 127 ;
40 是音符的力度值 , 取值范圍 0 ~ 127 ;
后面的 00 是 delta-time , 與后面的指令間隔的 tick 數(shù) ;
delta-time 參考 【BLE MIDI】MIDI 文件格式分析 ( MIDI 軌道分析 | MIDI 軌道頭 | MIDI 軌道長度 | delta-time 間隔 ) 四、delta-time 間隔 博客章節(jié) ;
十二、音軌結(jié)束標(biāo)志
FF 2F 00 : 56 ~ 58 字節(jié) , 音軌結(jié)束標(biāo)識 ;
至此 , 整個(gè) midi 文件解析完畢 ;
總結(jié)
以上是生活随笔為你收集整理的【BLE MIDI】MIDI 文件格式分析总结 ★★★的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【开发环境】戴尔电脑系统重装 ( 下载
- 下一篇: 【Android 逆向】Linux 文件