midi檔案格式 - 華人百科

文章推薦指數: 80 %
投票人數:10人

MIDI檔案屬於二進制檔案,這種檔案一般都有如下基本結構: 檔案頭+數據描述檔案頭一般包括檔案的類型,因為Midi檔案僅以。

mid為擴展名的就有0類和1類兩種,而大家熟悉的 ... midi檔案格式MIDI檔案屬於二進制檔案,這種檔案一般都有如下基本結構:檔案頭+數據描述檔案頭一般包括檔案的類型,因為Midi檔案僅以。

mid為擴展名的就有0類和1類兩種,而大家熟悉的點陣圖檔案的格式就更多了,所以才會出現檔案頭這種東西。

中文名稱MIDI檔案格式檔案結構類型指的是"MThd"或"MTrk"構    成由若干個格式相同的子數據構成的基本信息MIDI檔案不對音樂進行抽樣基本信息與波形檔案不同,MIDI檔案不對音樂進行抽樣,而是對音樂的每個音符記錄為一個數位,所以與波形檔案相比檔案要小得多,可以滿足長時間音樂的需要。

MIDI標準規定了各種音調的混合及發音,通過輸出裝置可以將這些數位重新合成為音樂。

MIDI音樂的主要限製是它缺乏重現真實自然聲音的能力,因此不能用在需要語音的場合。

此外,MIDI隻能記錄標準所規定的有限種樂器的組合,而且回放質量受到聲音卡的合成晶片的限製。

近年來,國外流行的聲音卡普遍採用波表法進行音樂合成,使MIDI的音樂質量大大提高。

MIDI檔案有幾個變通格式,如RMI和CIF等。

其中CMF檔案(creativemusicformat)是隨聲霸卡一起使用的音樂檔案。

RMI檔案是Windows使用的RIFF(resourceinterchangefileformat)檔案的一種子格式,稱為RMID,即包含MIDI檔案的格式。

MIDI檔案結構以下是MIDI檔案塊結構類型長度資料4個位元組4個位元組4個位元組類型指的是"MThd"或"MTrk",長度指的是除去類型和長度兩部分外,其他資料佔的位元組數。

而資料描述部份是主體,我們現在來一起分析它的結構:在每個Midi檔案的開頭都有如下內容,它們的十六進位代碼為:"4d54686400000006ffffnnnndddd"。

前四個是ASCII字元"MThd"是用來鑒別是否Midi檔案,而隨後的四個位元組是指明檔案頭描述部分的位元組數,它總是6,所以一定是"00000006",以下是剩餘部分的含義:ffff指定Midi的格式0000單音軌0001多音軌,且同步。

這是最常見的0002多音軌,但不同步nnnn指定軌道數實際音軌數加上一個全局的音軌dddd指定基本時間格式類型類型1:定義一個四分音符的tick數,tick是MIDI中的最小時間單位類型2:定義每秒中SMTPE幀的數量及每個SMTPE幀的tick以上就是MIDI檔案頭了,後面的所有內容都是真正做事的,我們先來看看它的構成。

構成MIDI的資料是由若幹個格式相同的子資料構成的,這些子資料在多音軌的格式中記錄了一個軌道的所有信息。

多加一個音軌,就簡單地把資料追加在前一音軌的後面就可以了,不過不要忘記變更檔案頭中的nnnn(軌道數)。

先看全局音軌。

全局音軌包括歌曲的附加信息(比如標題和著作權)、歌曲速度和系統碼(Sysx)等內容。

不管是全局音軌還是含有音符的音軌,都以"4D54726B"開頭,它其實是ASCII字元"MTrk",其後跟著一個4個位元組的整數,它標志了該軌道的位元組數,這不包括前面的4個位元組和本身的4個位元組。

這一點,我們可以在後面的例子中去理解。

接著就是記錄資料的地方了,每一個資料有著相同的結構:時間差+事件。

所謂時間差,指的是前一個事件到該事件的時間數,它的單位是tick(MIDI的最小時間單位)。

它的構成比較特殊,這裏要用二進位來說明。

一個位元組有8位,如果僅使用7位,它可以表示0~127這128個數,而剩下的一位,則用來作為標志。

如果要表示的數在以上範圍,則這個標志為0,這時,一個7位的位元組可以表示0~127tick。

如果要表示的數超出了這個範圍(比如240),則把標志設定成1,然後記錄下高7位,剩下的留給下一個位元組,在該例中240可以分解成128*1+112,這裏的1就是第一個位元組要記錄的,加上標志位,應該為10000001,即十六進位的81;而112是下一個位元組記錄的,它的十六進位為70:所以要表示240這個時間,要寫成8170。

同理,如果要表示65535tick,則可以先計算出65535=1282*3+1281*127+1280*127,然後得出結果:83FF7F。

由此,我們反過來也可以知道如何確定時間差:隻要標志位為0,則表示結束讀取時間差。

比如82C003表示1282*2+1281*64+1280*3=40963,如果基本時間為120,則有341:043個四分音符。

以這種方式記錄整數的位元組稱為動態位元組,它根據記錄的整數改變自身的長度,這在後面還要用到,所以必須熟練計算。

看完了這麽麻煩的東西,我們再來看個更麻煩的東西:事件。

在這些標準的解釋後面,我們會通過一些例子來進一步掌握這些內容。

事件大體上可以分為音符、控製器和系統信息這幾個種類。

對于這些事件,都有統一的表達結構:種類+參數。

對于一個音符,由于它的有效範圍是0~127,所以直接用00~7F作為"種類",可以認為是個音符,比如3C表示中央C。

而一個音符的最重要的參數是力度(也叫速度:velocity)。

比如,3C64表示一個力度為十進位100的中央C音符。

因為一個位元組有8位,所以剩餘的一位如果置1,再聯合其他的7位,則可以表示各種信息。

我們暫且無視一個音軌到底是全局的還是用于記錄音符的。

它們歸根結底都是用來記錄各種事件的,隻不過有些應出現在全局音軌比較合乎邏輯而已。

既然這樣,我們就可以從下面的表來看事件:下表中,x表示音軌0~F,比如81表示松開第二軌的音符。

種類位元組含義參數(十六進位)8x松開音符音符(00~7F):松開的音符力度:00~7F9x按下音符音符(00~7F):按下的音符力度:00~7FAx觸後音符音符:00~7F力度:00~7FBx控製器控製器號碼:00~7F控製器參數:00~7FCx改變樂器樂器號碼:00~7FDx觸後通道值:00~7FEx滑音音高(Pitch)低位:Pitchmod128音高高位:Pitchdiv128F0系統碼系統碼位元組數:動態位元組系統碼:不含開頭的F0,但包括結尾的F7FF其他格式程式種類:00~FF資料佔用的位元組數:動態位元組資料:個數由上一參數確定00~7F上次激活格式的參數(8x、9x、Ax、Bx、Cx、Dx、Ex)下表詳細地列出了FF的詳細情況,對于位元組數由資料決定的情況,表中以"--"表示。

種類位元組含義位元組數資料00設定軌道音序02音序號0000~FFFF01歌詞備註音軌文本--文本信息文本信息02歌曲著作權--著作權信息03歌曲標題音軌名稱--用于全局音軌音軌名04樂器名稱--音軌文本(同01/2)05歌詞--歌詞06標記--用文本標記(Marker)07開始點--用文本記錄開始點(同01/2)2F音軌結束標志00無51速度033位元組整數,1個四分音符的微秒數58節拍04略59調號02大小調:0(大調),1(小調)升降號數:-7~-1(降號),0(C),1~7(升號)7F音序特定信息--音序特定信息其它詞條AlpsHopTESOL三杯杏鮑菇東東槍體脂率你是我的淫蕩女王咆哮好難得杜拉拉升職記深圳東部華僑城玄關屏風索尼C6802范特西薩普謙卑迎賓還要一起沖量子力學金門菜刀midi檔案格式@華人百科midi檔案格式



請為這篇文章評分?