MIDI 檔案格式 (轉)

worldblog發表於2008-01-06
MIDI 檔案格式 (轉)[@more@]

MIDI 格式

MIDI 檔案結構

Chunks

MIDI 檔案由 chunks 組成::namespace prefix = o ns = "urn:schemas--com::office" />

每個chunk 的組成:

型別 

長度

資料 

4 位元組

4 位元組

 (前面規定的)長度

  • A 4-位元組 chunk 型別 (ASCII)
  • A 4-byte 長度(32 位, msb first)
  • (前面規定的)長度資料

有兩種型別的 chunks :

Header Chunks

有一個chunk標誌“MThd”

Track Chunks

有一個chunk標誌“MTrk”

 一個 MIDI檔案由一個header chunk和緊接的一個或多個track chunks組成。

 在chunks結構中,自長度區以後是嚴格規定好的。它可能容納的chunks除了“MThd”或“MTrk”其它的將被忽略。MIDI說明書要求能夠處理意想不到的chunk,並忽略掉整個chunk。

 

 

型別

長度

資料

MIDI
檔案
:

MThd

6

MTrk

...

:

MTrk

...

數值表示法

 在MIDI 檔案中,除了基本的MIDI資料,還有一個變化的資料(型別)。如: delta-times 和 meta-events。

 這裡有一些關於這樣的數的一些資料,它們有通常有下面1~2種格式:

  • /Desktop/Midi%20File%20Format/Chinese/midi_file_format.html#二進位制數">二進位制

二進位制數

二進位制數的存貯:

  • 每個位元組8位
  • MSB first (最左方的位元組權(或數位)大)

(除非其它的描述)

可變長度數

 這個可變長度數是為了方便表示任意大的整數,而不必建立固定寬度的整數。

 一個可變長度數被表示為連續的7位資料。從最高位到最低位,最後一個位元組bit7等於0,前面的位元組bit7等於1。

例:

 數

可變長度數

十進位制

十六進位制

二進位制

二進位制

十六進位制

-

abcd

aaaabbbbccccdddd

100000aa 1aabbbbc 0cccdddd

-

0
:
127

00
:
7F

0000 0000
:
0111 1111

0000 0000
:
0111 1111

00
:
7F

128
:
16383

80
:
3FFF

00000000 10000000
:
00111111 11111111

10000001 00000000
:
11111111 01111111

81 00
:
FF 7F

1000

03E8

11 1110 1000

10000111 01101000

87 68

100000

0F4240

1111 0100 0010 0100 0000

10111101 10000100 01000000

BD 84 40

 如此,你可以從上面的例子發現:小的數(0~127)可以用一個位元組表示。而(比較)大的數也可以表示出來。

 在MIDI 檔案中,最大的數是0FFF,FFFF。這個規定了可變長度數允許利用32位整數。

Header Chunks

 Header chunk 資料部分包括3個16位(資料)區。這個區域描述:( MIDI 檔案)格式、track 的數量和 MIDI 的時間設定。

 Header chunk的長度是6個位元組。無論如何軟體必須遵循這個原則。即使它大於預期的,任何意料外的資料被忽略。

Header Chunk

Chunk 型別

長度 

資料 

4 位元組
(ASCII)

4 位元組
(32位二進位制數)

16位

16位

16位

MThd

Chunk資料部分的長度。
這是一個32位二進位制數, MSB first.
這在 MIDI  1.0檔案說明書中規定為6。不過,考慮到將來的擴充,(希望)任何MIDI檔案的作者能夠應付大的Header chunks。

MIDI 檔案的格式。
這是 一個16位二進位制數, MSB first。
有效的格式是: 、 和 。

MIDI 檔案中track chunk的數量。
這是 一個16位二進位制數, MSB first。

這個定義在MIDI 檔案中(一個)單位的 delta-time數。
這是 一個16位二進位制數, MSB first。

有下列兩者之一的的格式,依賴於最高位值。 

:

15

14 ... 8

7 ... 0

0

1/4音符tick數

1

-幀/秒

ticks / 幀

bit 15 = 0:

bits 0-14

每個1/4音符的 delta-time 數。

bit 15 = 1:

bits 0-7

每個  SMTPE 幀的 delta-time 數。

bits 8-14

負數,表示每秒中SMTPE 幀的數量。有效數應符合訊息。

  -24 = 24 幀/秒


  -25 = 25 幀/秒


  -29 = 30 幀/秒, drop frame


  -30 = 30 幀/秒, non-drop frame


MIDI File Formats

MIDI 檔案有3種變化:

  • 格式 0
    …容納單一的Track。
  • 格式1
    …容納一個和多個同步的Track(所有的Track同時)。
  • 格式2
    …容納一個和多個獨立的Track(所有的Track獨立播放)。

MIDI 檔案格式 0

格式0 MIDI 檔案包括一個Header-Chunk 和一個 Track-Chunk。

這個 Track-Chunk 包括所有的音符和節拍訊息。

MIDI 檔案格式 1

格式1 MIDI 檔案包括一個Header-Chunk 和多個 Track-Chunk,所有的Track同時播放。

格式1 中第一個Track是專用的。它看成“Tempo Map”。它包括所有的 meta-event :、、、、、。在格式1中(這些)將放入在第一個 track 中。

MIDI 檔案格式 2

格式2 MIDI 檔案包括一個Header-Chunk 和多個 Track-Chunk,每個Track表現出獨立的次序。

Track Chunks

Track chunk 的資料部分由一對和多對 組成。 是必須的,0是有效的 delta-time。

Track Chunk

型別

長度

資料 

4 位元組
(ASCII)

4 位元組
(32位二進位制數)

(二進位制數)

MTrk

<event> ...

相對於前一個事件的“tick”,是一個可變長度數。

下列之一:

· 

· 

· 

事件

注意:在 <event>之間,沒有明確的分隔符。這個是因為 delta-times 和event有一個長度定義。 

  • Delta-time 定義最後一個位元組的最高位等於0。
  • MIDI Channel 訊息有一個長度定義。
  • Sysex-events 和 meta-events 有一個清楚的長度區。

MIDI 事件

MIDI Channel 訊息包含:

通常應用於MIDI檔案中的同一狀態的表示。Running status 也可以被取消 。

Sysex 事件

  (高階訊息的詳細描述)是令人滿意的,相對於 MIDI channel 訊息。可以被使用。

Sysex-events 流行兩種風格:

Sysex Events

F0

F0 Sysex Event

 

這個導致 F0(訊息的開頭) 被髮送。接著是

 

一個可變長度數,表示 的長度

 

F0
作為 MIDI 訊息傳送。

F7

F7 Sysex Event (or 'escape')

 

這個導致 被髮送,沒有其它的附加數。

 

一個可變長度數,表示  的長度

 


作為 MIDI 訊息傳送。

 在上面的案例中,訊息的結束 F7,沒有自動的傳送。它必須明確的列入 or .中。

 大多數系統高階訊息非常簡單,且作為一個單一的包被髮送。開始於 F0 ,結束於 F7 。這個是非常容易的應用於 的 F0 形式。

 可是,一些系統高階訊息習慣於實時控制裝置。怎樣合成一個存在適當的延時的由一連串的‘零件’組成的系統高階訊息。因為,能夠深入到事件中中斷一個訊息,就有一定的延時。這個是可以應用 的 F7 形式。

 實際上,在 MIDI 流中 F7 Sysex Event 習慣於包含 any_data。例如 MIDI 系統實時訊息(儘管它並不令人滿意的)。

 例 1:

一般的訊息:
F0 7E 09 03 01 01 F7
(Sample Dump Request - Device 9, sample number 257)
可以:
F0 06 7E 09 03 01 01 F7
或者交替:
F7 07 F0 7E 09 03 01 01 F7

 例 2:

MIDI 系統實時訊息“停止”用 F7 01 FC ,當“繼續”用 F7 01 FB。 

假設:你想停止一個外部裝置——鼓,傳送一個“停止”,接著48個 delta-time 單元后“繼續”。完整的 delta-tem 事件序列象下面這樣:

  00 F7 01 FC 30 F7 01 FB


Meta 事件

Meta Events 是用來表示象 track 名稱、歌詞、提示點等,它並不作為 MIDI 訊息被髮送,但是它仍然是 MIDI 檔案的(有用的)組成部分。

Meta Events 的基本形式:

FF

一個位元組描述 meta-event 的型別。
可能的範圍是 00-7F。 並不是所有的值都在這個範圍,但是能夠應付意想不到的值,並診斷這個長度和忽略預期外的資料部分。  

緊跟的資料的長度。
這是一個可變長度(數)。
0 是一個有效

0 或更多的位元組資料。

 Meta Events

FF 00 02 ss ss

音序號 

 

這是一個可選的事件,它只能產生在第一個track,並且在非零時刻之前。

格式2檔案中,這個用來識別每個 track,如果忽略,這個序列號從而用 track 出現的次序表示。.

格式1檔案中,這個事件只能產生在第一個 track。

 

ss ss

Sequence Number, 16 bit binary

FF 01

文字事件 

 

這個事件是用來註釋 track 的文字。
獨立的8位資料(其它的ASCII文字) 也是允許的。

 

  的長度(可變長度數)

 

個位元組的  ASCII 文字或8位二進位制數

FF 02

版本通告 

 

這個事件是用ASCII 文字表示的版權通告。
這個是制定的形式“(C) 1850 J.Strauss”

這個事件用於第一個 track ,第一個事件。

FF 03

音序 / Track 名稱 

 

音序或 track 的名稱。

FF 04

樂器名稱 

 

描述這個 track 使用的樂器。
這個用來詳細的記述(這個) MIDI channel 在 (這個)track 裡使用的樂器。

FF 05

歌詞 

 

歌曲的歌詞。 
  通常每個音節都有自己的歌詞,在這個時候歌詞將被唱起來。

FF 06

標記 

 

通常用於格式0或格式1的第一個 track 。
標記有意義的點(如:“詩篇1”)

FF 07

暗示 

 

用來表示舞臺上發生的事情。如:“幕布升起”、“退出,臺左”等。 

FF 20 01 cc

MIDI Channel 字首

 

關聯緊跟的 meta-events  和 sysex-events 的 MIDI channel。直到下一個(必須包含MIDI channel 資訊)

 

cc

MIDI channel 1-16
範圍: 00-0F

FF 2F 00

Track 結束

 

這個事件是必須的 。
它用來掃除定義的長度。它的本質資訊是這個 track 是迴圈還是連線另一個 track 。

FF 51 03 tt tt tt

拍子

 

這個設定1/4音符的速度,用微妙表示。這個意味著改變一個 delta-time 的單位長度。

如果沒有指出,預設的速度為 120拍/分。這個相當於 tttttt = 500,000。

 

tt tt tt

新的拍子,表示1/4音符
24位二進位制數

FF 54 05 hh mm ss fr ff

SMTPE 偏移量 

 

 

 可選擇的的事件,描述 track 開始時的 SMTPE 時間。

 這個事件必須發生在非零 delta-time之前,且在第一個事件之前。 

 在格式1中,這個事件必須在第一個 track 中(the tempo map)。

 

 

hh mm ss fr

 小時/分/秒/幀 用  SMTPE 格式。
 這個必須與訊息  一致 (細節, 時間編碼必須介紹  hh)

 

 

ff

Fractional frame, in hundreth's of a frame

 

FF 58 04 nn dd cc bb

拍子記號

 

 

拍子記號的形式: 

nn/2^dd
如: 6/8 用 nn=6,dd=3 表示。

這個引數 cc 是表示每個 MIDI 時鐘的節拍器的 tick 數目。

通常24 個 MIDI 時鐘為一個1/4音符。可是一些軟體允許自己設定這個值。引數 bb 定義:24 MIDI 時鐘(這個“一般”(表示)1/4音符)中 1/32音符的數目。

 

 

nn

拍子記號,分子 

 

 

dd

拍子記號,分母表示為 2 的(dd次)冥。
例:一個分母 4 用 dd=2 表示。

 

 

cc

每個 MIDI 時鐘節拍器的 tick 數目。 

 

 

bb

24個MIDI時鐘中1/32音符的數目(8是標準的)。

 

FF 59 02 mi

音調符號 

 

 

音調符號,表示升調或降調值,大調或小調的標誌。 

0 表示 C 調,負數表示“降調”,正數表示“升調”。

 

 

sf

升調或降調值
-7 = 7 升調
  0 =  C 調
+7 = 7 降調

 

 

mi

0 = 大調
1 = 小調

 

FF 7F

音序器描述  Meta-event

 

 

 這個在 MIDI 檔案中等同於系統高階事件。

 在 MIDI 檔案中用這個事件表示製造商音序器統一化的描述。

 

 

長度 of + (可變長度數)

 

 

1或3個位元組表示製造廠商。
這個值同樣的作為  用。

 

 

8位二進位制數

 


Footnotes

注意 1

在這種情形 (在 header chunk) 定義為單位 delta-time  數“1/4音符的 ticks 數” (MSbit=0),一個變化的拍子速度表示一個delta-time 長度的變化。

在這種情形 MSbit=1,“ticks”表示一個絕對術語( ticks/frame 和 frames/second),他沒有說明書中消失,將影響一種新的tempo的應用。。 

Please note this


翻  譯:zj_zyq   

to:E_mail:zj_zyq@163.com">E_mail:zj_zyq@163.com 

2002 年 12 月 28 日 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996723/,如需轉載,請註明出處,否則將追究法律責任。

相關文章