【BLE MIDI】MIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )
文章目錄
- 一、從 MIDI 文件中可以獲取的信息
- 1、音符速度設置事件
- 2、拍號設置事件
- 3、文件頭基本時間
- 二、節拍時值計算
- 三、小節時值計算
一、從 MIDI 文件中可以獲取的信息
MIDI 時間標志原始信息來源 , 就是 MIDI 文件中的 Meta 事件 ;
Meta 事件 以 FF 開始 , 其格式如下 :
FF xx nn dd
- FF : 表示 Meta 事件的 開始標志 ;
- xx : 表示 該 Meta 事件的類型 , 如 03 類型表示該 Meta 事件是 " 音符速度設置事件 " , 04 類型表示該 Meta 事件是 " 拍號設置事件 " ;
- nn : 表示 該 Meta 事件有多少個字節 , 該數值可以是可變長度的數值 , 一般情況下只占 111 字節 ;
- dd : Meta 事件的實際數據 , 有 nn 個字節 ;
MIDI 文件中的 " 音符速度設置 Meta 事件 " , " 拍號設置 Meta 事件 " , " 文件頭的 基本時間 " , 決定了該 MIDI 曲子的事件標志 ;
1、音符速度設置事件
參考 【BLE MIDI】MIDI 文件格式分析總結 ★★★ 八、FF 51 03 四分音符時長 博客章節 , 可以知道 , FF 51 03 是時間設定的標志 ;
FF 51 03 07 A1 20 : 32 ~ 37 字節 , 音符速度標志 ;
FF 51 03 是音符速度標志位 , 后面的 07 A1 20 3 字節是一個數字 , 代表 四分音符 的時長 , 單位是微秒 ;
07 A1 20 對應十進制數是 500000 , 五十萬 , 也就是一個四分音符是 50 萬微秒 ;
在之前的 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件頭解析 | MIDI 文件頭標識 | MIDI 文件頭長度 | MIDI 文件格式 | MIDI 軌道個數 | 基本時間 ) 二、MIDI 文件頭解析 5、基本時間 博客章節 解析到一個四分音符有 480 個 tick ;
此時可以計算出每個 tick 的時長為 500000480\cfrac{500000}{480}480500000? 微秒 ;
再回顧下 delta-time 的計算 :
8E 7E 對應的二進制位數為 : 1000 1110 0111 1110
第一個字節 8E 對應的二進制數據位 1000 1110 , 其中第七位的 1 表示這是 delta-time 的高位字節 , 后面的 000 1110 是實際的數值數據 ;
第一個字節 7E 對應的二進制數據位 0111 1110 , 其中第七位的 0 表示這是 delta-time 的低位字節 , 后面的 111 1110 是實際的數值數據 ;
則該 delta-time 的實際數據是 000 1110 111 1110 , 重新組合后為 111 0111 1110 , 該 delta-time 的值是 1918 , 也就是 1918 個 tick 數 ;
上述的 delta-time 是 1918 個 tick , 對應的時間是 500000×1918480\cfrac{500000 \times 1918}{480}480500000×1918? 微秒
2、拍號設置事件
FF 58 04 04 02 18 08 : 39 ~ 45 字節 , 拍子記號 ;
FF 58 04 是拍子記號的標志 ;
04 02 18 08 分別表示 :
- 04 : 拍子記號的分子 ;
- 02 : 拍子記號分母標志 , 這里的值是 2 的次冪值 , 如當前設置的值是 2 , 則拍子記號的分母是 22=42^2 = 422=4 , 分母是 4 ;
- 18 : 每個 MIDI 時鐘包含的 tick 數 ; 標準值是 24 , 一般不會改變 ;
- 08 : 每 24 個 MIDI 時鐘 , 對應的 32 分音符的數目 ; 標準值是 8 , 一般不會改變 ;
后面的 00 是 delta-time , 與下一個 midi 事件間隔的 tick 數 ;
delta-time 參考 【BLE MIDI】MIDI 文件格式分析 ( MIDI 軌道分析 | MIDI 軌道頭 | MIDI 軌道長度 | delta-time 間隔 ) 四、delta-time 間隔 博客章節 ;
3、文件頭基本時間
參考 【BLE MIDI】MIDI 文件格式分析總結 ★★★ 二、MIDI 文件頭解析 5、基本時間 博客章節 ;
01 E0 : 12 ~ 13 字節 , 用于指定基本時間 ;
2 個字節 , 要拆分成 3 部分 , 最高位 ( 第 15 位 ) 作為標識位 , 第 8 ~ 14 位 作為一部分 , 第 0 ~ 7 位 作為一部分 ;
由于是大端格式排列 , mid 文件第 12 字節 ( 低地址 ) 是 高位 , mid 文件第 13 字節 ( 高地址 ) 是低位 ;
01 E0 的二進制形式如下 : 0000 0001 11110 0000 ;
最高位 0000 0001 11110 0000 是 0 , 紅色的是最高位 , 表示當前 代表的事件格式是 類型1 , 第 0 ~ 14 位 代表的是 四分音符的 tick 數 ;
十六進制 01 E0 對應的十進制數字是 480 , 也就是說一個四分音符有 480 tick ;
tick 是時間單位 , 這是 mid 文件中計算時間的最基本單位 ;
二、節拍時值計算
在文件頭的基本時間中 , 可以獲取到每個 四分音符的 tick 或 pulse 數 ;
在 Meta 事件 音符速度設置事件 中 , 可以獲取到每個 四分音符的 微秒數 ;
此時可以將 tick 或 pulse 值 , 與 現實的 微秒 時間 對應起來 ;
如果要計算具體的小節位置 , 需要結合拍號來計算 ,
上面只是獲取了 四分音符 的時值信息 , 即 四分音符的 tick 數 , 以及 四分音符 的 微秒數 ;
如果要計算 節拍 時間 , 要看 拍號中的分母值 ,
-
如果分母是 222 , 則每拍的時值 直接使用 四分音符 時值乘以 222 ;
-
如果分母是 444 , 則每拍的時值 就是 四分音符的時值 ;
-
如果分母是 888 , 則每拍的時值 直接使用 四分音符 時值除以 222 ;
三、小節時值計算
每個小節的時值 就是 每拍的時值 乘以 拍號分子 ;
總結
以上是生活随笔為你收集整理的【BLE MIDI】MIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数字信号处理】傅里叶变换性质 ( 序列
- 下一篇: 【错误记录】Manifest 清单文件报