為了在 Sega Genesis 上播放 MIDI 音樂,作者深入研究了 MIDI 檔案格式,並整理出這份詳細的格式規範文檔,包含標頭區塊、軌道區塊、Delta-time 編碼、MIDI 事件指令、Meta 事件、系統專用訊息等完整規格,並附帶 C++ 解碼/編碼工具原始碼。
MIDI 檔案由兩大部分組成:
可將軌道想像為多軌錄音機的單軌,每軌可承載不同樂器、聲部或音效。
4D 54 68 64 00 00 00 06 ff ff nn nn dd dd
| 位移 | 長度 | 說明 |
|---|---|---|
| 0-3 | 4 bytes | ASCII "MThd" (0x4D546864) |
| 4-7 | 4 bytes | 標頭長度,固定為 6 (0x00000006) |
| 8-9 | 2 bytes | 檔案格式:0=單軌、1=多軌同步、2=多軌非同步 |
| 10-11 | 2 bytes | 軌道數量 (nn nn) |
| 12-13 | 2 bytes | 每四分音符的 Delta-time 刻度數 (dd dd) |
4D 54 72 6B xx xx xx xx
| 位移 | 長度 | 說明 |
|---|---|---|
| 0-3 | 4 bytes | ASCII "MTrk" (0x4D54726B) |
| 4-7 | 4 bytes | 軌道資料長度(不含軌道標頭),單位:byte |
每個事件 = Delta-time + 事件資料
FF xx nn dd...| Hex | Binary | 資料 | 說明 |
|---|---|---|---|
| 8x | 1000cccc | nn vv | Note Off (釋放鍵),nn=音符號,vv=力度 |
| 9x | 1001cccc | nn vv | Note On (按下鍵),vv=0 相當於 Note Off |
| Ax | 1010cccc | nn vv | Polyphonic Key Pressure (觸後壓力) |
| Bx | 1011cccc | cc vv | Control Change (控制器變更) |
| Cx | 1100cccc | pp | Program Change (切換音色/樂器) |
| Dx | 1101cccc | cc | Channel Pressure (通道壓力) |
| Ex | 1110cccc | bb tt | Pitch Bend (彎音),14-bit 值:tt=高 7 bits,bb=低 7 bits,0x2000 為中心無彎音 |
| Type | 資料 | 說明 |
|---|---|---|
| 0x00 | 02 ssss | 序號 |
| 0x01 | nn tt... | 文字事件 |
| 0x02 | nn tt... | 版權資訊 |
| 0x03 | nn tt... | 序列/軌道名稱 |
| 0x04 | nn tt... | 軌道樂器名稱 |
| 0x05 | nn tt... | 歌詞 |
| 0x06 | nn tt... | 標記 |
| 0x07 | nn tt... | 提示點 |
| 0x2F | 00 | 軌道結束(每軌必須有) |
| 0x51 | 03 tttttt | 設定速度,微秒/四分音符 |
| 0x58 | 04 nn dd cc bb | 拍號:nn=分子,dd=分母(2的冪次),cc=節拍器點擊/小節,bb=32分音符/四分音符 |
| 0x59 | 02 sf mi | 調號:sf=-7~7(降/升號數),mi=0大調/1小調 |
| 0x7F | xx dd... | 序列器專用資訊 |
| Hex | 說明 |
|---|---|
| F8 | Timing Clock (同步時鐘) |
| FA | Start (開始播放) |
| FB | Continue (繼續播放) |
| FC | Stop (停止播放) |
標準 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
將 MIDI 等二進位檔轉為以 Tab 分隔的十進位文字檔,每行 8 個數值,便於人工編輯檢視。
讀取 DEC 輸出的文字檔,重建原始二進位 MIDI 檔案。
這份文檔對於開發 MIDI 解析器、音樂播放器、或進行音訊格式轉換的開發者極具參考價值。