首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

MIDI 檔案格式深度解析:從標頭區塊到事件指令完整規範

     編輯:J2ME

前言

為了在 Sega Genesis 上播放 MIDI 音樂,作者深入研究了 MIDI 檔案格式,並整理出這份詳細的格式規範文檔,包含標頭區塊、軌道區塊、Delta-time 編碼、MIDI 事件指令、Meta 事件、系統專用訊息等完整規格,並附帶 C++ 解碼/編碼工具原始碼。

1. 檔案整體結構

MIDI 檔案由兩大部分組成:

  • 標頭區塊:描述檔案格式、軌道數量、時間基準等全域資訊
  • 軌道區塊:可包含多個軌道,每個軌道獨立存放音樂事件序列

可將軌道想像為多軌錄音機的單軌,每軌可承載不同樂器、聲部或音效。

2. 標頭區塊詳細格式

4D 54 68 64 00 00 00 06 ff ff nn nn dd dd
位移長度說明
0-34 bytesASCII "MThd" (0x4D546864)
4-74 bytes標頭長度,固定為 6 (0x00000006)
8-92 bytes檔案格式:0=單軌、1=多軌同步、2=多軌非同步
10-112 bytes軌道數量 (nn nn)
12-132 bytes每四分音符的 Delta-time 刻度數 (dd dd)

格式類型說明

  • 格式 0(單軌):僅含一個軌道,最簡單
  • 格式 1(多軌同步):所有軌道垂直同步,同一時間開始,表現同一首曲子的不同聲部
  • 格式 2(多軌非同步):軌道間無需同步,可完全獨立

3. 軌道區塊結構

4D 54 72 6B xx xx xx xx
位移長度說明
0-34 bytesASCII "MTrk" (0x4D54726B)
4-74 bytes軌道資料長度(不含軌道標頭),單位:byte

MIDI 事件結構

每個事件 = Delta-time + 事件資料

Delta-time 可變長度編碼

  • 採用 7-bit 分組編碼,最高位(MSB)為延續旗標:1 表示後續還有 byte,0 表示最後一個 byte
  • 最大 4 bytes(28 bits)
  • 優點:小數值佔用少 bytes,大數值自動擴展,無需補零浪費空間

事件類型識別

  • 通道訊息:命令 byte MSB=1 (值 > 128),高 4 bits 為命令類型,低 4 bits 為通道號 (0-15)
  • Meta 事件:以 0xFF 開頭,格式 FF xx nn dd...
  • 系統專用訊息:0xF0-0xFF,無通道號
  • 執行狀態:若事件無命令 byte,沿用上一條同類命令

4. 核心指令表(附錄 A 摘要)

通道語音訊息

HexBinary資料說明
8x1000ccccnn vvNote Off (釋放鍵),nn=音符號,vv=力度
9x1001ccccnn vvNote On (按下鍵),vv=0 相當於 Note Off
Ax1010ccccnn vvPolyphonic Key Pressure (觸後壓力)
Bx1011cccccc vvControl Change (控制器變更)
Cx1100ccccppProgram Change (切換音色/樂器)
Dx1101ccccccChannel Pressure (通道壓力)
Ex1110ccccbb ttPitch Bend (彎音),14-bit 值:tt=高 7 bits,bb=低 7 bits,0x2000 為中心無彎音

Meta 事件

Type資料說明
0x0002 ssss序號
0x01nn tt...文字事件
0x02nn tt...版權資訊
0x03nn tt...序列/軌道名稱
0x04nn tt...軌道樂器名稱
0x05nn tt...歌詞
0x06nn tt...標記
0x07nn tt...提示點
0x2F00軌道結束(每軌必須有)
0x5103 tttttt設定速度,微秒/四分音符
0x5804 nn dd cc bb拍號:nn=分子,dd=分母(2的冪次),cc=節拍器點擊/小節,bb=32分音符/四分音符
0x5902 sf mi調號:sf=-7~7(降/升號數),mi=0大調/1小調
0x7Fxx dd...序列器專用資訊

系統即時訊息

Hex說明
F8Timing Clock (同步時鐘)
FAStart (開始播放)
FBContinue (繼續播放)
FCStop (停止播放)

5. 音符號對照表(MIDI Note Number)

標準 88 鍵鋼琴範圍:0 (A-1) ~ 127 (G9),中央 C (C4) = 60。

八度 |  C  C#  D  D#  E  F  F#  G  G#  A  A#  B
-----|---------------------------------------------
  0  |  0   1  2   3  4  5   6  7   8  9  10  11
  1  | 12  13 14  15 16 17  18 19  20 21  22  23
  2  | 24  25 26  27 28 29  30 31  32 33  34  35
  3  | 36  37 38  39 40 41  42 43  44 45  46  47
  4  | 48  49 50  51 52 53  54 55  56 57  58  59
  5  | 60  61 62  63 64 65  66 67  68 69  70  71  ← 中央 C (60)
  6  | 72  73 74  75 76 77  78 79  80 81  82  83
  7  | 84  85 86  87 88 89  90 91  92 93  94  95
  8  | 96  97 98  99 100 101 102 103 104 105 106 107
  9  |108 109 110 111 112 113 114 115 116 117 118 119
 10  |120 121 122 123 124 125 126 127

6. 附帶工具程式原始碼

DEC.CPP - 二進位轉十進位文字

將 MIDI 等二進位檔轉為以 Tab 分隔的十進位文字檔,每行 8 個數值,便於人工編輯檢視。

REC.CPP - 十進位文字轉二進位

讀取 DEC 輸出的文字檔,重建原始二進位 MIDI 檔案。

7. 參考文獻

  • "MIDI Systems and Control" - Francis Rumsey, 1990, Focal Press
  • "MIDI and Sound Book for the Atari ST" - Bernd Enders & Wolfgang Klem, 1989
  • MIDI 規格文件:透過 LISTSERV@AUVM.AMERICAN.EDU 獲取 (GET MIDISPEC PACKAGE)
這份文檔對於開發 MIDI 解析器、音樂播放器、或進行音訊格式轉換的開發者極具參考價值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved