MIDI文件格式解析

MIDI文件由兩部分構(gòu)成:Header Chunk(MThd)+ Track Chunk(MTrk)

“Chunk”是一種數(shù)據(jù)結(jié)構(gòu),每個(gè)chunk由最初4字節(jié)的“Chunk類(lèi)型”叛拷,緊接著4字節(jié)的“Chunk大小”,和最后長(zhǎng)度可變的“Chunk數(shù)據(jù)”構(gòu)成缀踪。注意,“Chunk大小”描述的是“Chunk 數(shù)據(jù)”的長(zhǎng)度虹脯,而不是整個(gè)Chunk的長(zhǎng)度驴娃。

用編輯器打開(kāi)JSB Chorales數(shù)據(jù)集中的一個(gè)midi文件,截取前8行顯示如下:

4d54 6864 0000 0006 0000 0001 0064 4d54
726b 0000 03a9 00c0 0000 903c 5a00 903f
5a00 9043 5a00 9048 5a78 803f 0000 904b
5a78 803c 0000 8043 0000 8048 0000 9037
5a00 9046 5a78 8037 0000 8046 0000 9038
5a00 9048 5a00 904d 5a78 8038 0000 8048
0000 804b 0000 903a 5a00 9046 5a00 904a
5a78 803a 0000 804a 0000 804d 0000 903f

這是midi文件的十六進(jìn)制代碼循集。
每一個(gè)十六進(jìn)制代碼能表示4bit唇敞,
1 byte(字節(jié))=8bit,1 word(字)=2 byte暇榴,
因此4d這樣的兩個(gè)十六進(jìn)制代碼就是1 byte厚棵,
4d54這樣的四個(gè)十六進(jìn)制代碼就是1 word

MThd

在每個(gè) Midi 文件的開(kāi)頭都有如下內(nèi)容,它們的十六進(jìn)制代碼為
4d54 6864 0000 0006 ffff nnnn dddd
對(duì)應(yīng)例中的
4d54 6864 0000 0006 0000 0001 0064
其中蔼紧,
4d54 6864是ACSII表示的“MThd”字符串婆硬,表示構(gòu)成MIDI文件的Chunk類(lèi)型是文件頭(Header Chunk)。
0000 0006是MThd中數(shù)據(jù)部分的長(zhǎng)度奸例,以目前標(biāo)準(zhǔn)均為6字節(jié)彬犯,也就是接下來(lái)的ffff nnnn dddd向楼。

MThd中的數(shù)據(jù)部分

補(bǔ)充:nnnn值表示文件中有多少個(gè)MTrk塊。對(duì)于MIDI 0格式文件谐区,nnnn值僅為0001湖蜕,即只有一個(gè)Track Chunk;MIDI 1格式文件則可以有多個(gè)Track Chunk宋列,而且Track Chunk數(shù)目為實(shí)際的音軌數(shù)目加一昭抒;MIDI 2格式文件不常見(jiàn),不了解炼杖。

補(bǔ)充2: dddd值多采用TPQN時(shí)間度量法灭返。TPQN是“Ticks Per Quarter-Note(每四分音符中所包含的Midi Tick數(shù)量)”的縮寫(xiě),可以是十進(jìn)制的60-480之間坤邪,數(shù)值越大熙含,MIDI系統(tǒng)的時(shí)間分辨率就越大,也就是說(shuō)可以演奏時(shí)值越小的音符艇纺。通常這個(gè)數(shù)都采用120怎静、240、480黔衡,因?yàn)檫@些數(shù)都能被2蚓聘、3、4甚至6员帮、8整除或粮,方便于八分音符、十六分音符捞高、三連音甚至更短音符的演奏,換算成十六進(jìn)制渣锦,就是0x78硝岗、0xF0、0x1E0袋毙。當(dāng)然注意型檀,這些十六進(jìn)制數(shù)的最高位都是0。dddd值如果大于0x8000听盖,則為SMPTE時(shí)間碼度量法胀溺,這里不詳細(xì)介紹了。

MTrk

MTrk(Track Chunk)內(nèi)部則包含了實(shí)際的MIDI信息和一些輔助信息皆看,如meta-event仓坞。還是以上面的midi文件為例:
4d54 726b 是MTrk的開(kāi)頭,也就是“MTrk”的ASCII編碼腰吟。
0000 03a9 是MTrk數(shù)據(jù)部分的大形薨!(非固定)徙瓶,這里轉(zhuǎn)化為十進(jìn)制是937。接下來(lái)就是937字節(jié)的數(shù)據(jù)嫉称。
xxyy xxyyyy ... ... xx代表了Delta-time侦镇,yy代表了真正的MIDI事件。這些MIDI事件才是音序器在播放MIDI文件時(shí)需要實(shí)時(shí)處理和發(fā)送的數(shù)據(jù)织阅。
00ff 2f00 是meta-event事件壳繁,表示此Track結(jié)束。

  • Delta-time:時(shí)間差荔棉,表征著當(dāng)前事件距離上一個(gè)事件有多長(zhǎng)時(shí)間闹炉,單位為tick。音序器通過(guò)對(duì)MIDI Tick進(jìn)行計(jì)數(shù)江耀,判斷是否該處理下一個(gè)MIDI事件剩胁。Delta-time使用可變長(zhǎng)度數(shù)的格式,最短1個(gè)字節(jié)祥国,最長(zhǎng)4個(gè)字節(jié)(最長(zhǎng)可以表示0x0fffffff)昵观。具體來(lái)說(shuō),一個(gè)字節(jié)有 8 bit舌稀,將其最高位bit作為標(biāo)志位啊犬,剩下7 bit就可以表示 0~127。如果Delta-time值超過(guò)127壁查,就將標(biāo)志位設(shè)置為1觉至,并且下一個(gè)字節(jié)用來(lái)繼續(xù)表示Delta-time。只要標(biāo)志位為 0睡腿,則表示結(jié)束讀取Delta-time语御。
  • MIDI事件:MIDI事件包括1.實(shí)際需要發(fā)送的數(shù)據(jù)(音序器直接將數(shù)據(jù)發(fā)送出去);2.meta-event事件(音序器修改自身的相關(guān)參數(shù))席怪。

MIDI事件

下表中,x 表示音軌 0~F,比如 90 表示按下第一軌的音符应闯。
MIDI事件
音符編號(hào)

在例中,接下來(lái)的MIDI編碼為:
---- ---- ---- 00c0 0000 903c 5a00 903f
5a00 9043 5a00 9048 5a-- ---- ---- ----

解析如下:
00 c0 00 :時(shí)間差00挂捻,改變第一軌樂(lè)器碉纺,樂(lè)器號(hào)碼為00
00 90 3c 5a :時(shí)間差00,按下第一軌音符刻撒,音符號(hào)碼為3c(60骨田,C4,中央C)声怔,力度為5a(90)
00 90 3f 5a :時(shí)間差00态贤,按下第一軌音符,音符號(hào)碼為3f(63捧搞,#D4)抵卫,力度為5a(90)
00 90 43 5a:時(shí)間差00狮荔,按下第一軌音符,音符號(hào)碼為43(67介粘,G4)殖氏,力度為5a(90)
00 90 48 5a:時(shí)間差00,按下第一軌音符姻采,音符號(hào)碼為48(72雅采,C5),力度為5a(90)
78 80 3f 00:時(shí)間差78(120tick)慨亲,松開(kāi)第一軌音符婚瓜,音符號(hào)碼為3f(63,#D4)刑棵,力度為5a(90)
00 90 4b 5a:時(shí)間差00巴刻,按下第一軌音符,音符號(hào)碼為4b(75蛉签,#D5)胡陪,力度為5a(90)
78 80 3c 00:時(shí)間差78(120tick),松開(kāi)第一軌音符碍舍,音符號(hào)碼為3c(60柠座,C4),力度為00
00 80 43 00:時(shí)間差00片橡,松開(kāi)第一軌音符妈经,音符號(hào)碼為43(67,G4)捧书,力度為00
00 80 48 00:時(shí)間差00吹泡,松開(kāi)第一軌音符,音符號(hào)碼為48(72经瓷,C5)荞胡,力度為00
00 90 37 5a:時(shí)間差00,按下第一軌音符了嚎,音符號(hào)碼為37(55,G3)廊营,力度為5a(90)
00 90 46 5a:時(shí)間差00歪泳,按下第一軌音符,音符號(hào)碼為46(70露筒,#A4)呐伞,力度為5a(90)

上述指令表示的就是下圖中的前7個(gè)音塊:
鋼琴卷簾

總結(jié)

MIDI 0 文件

MIDI 1 文件

參考鏈接

https://www.cnblogs.com/us-wjz/articles/11618899.html
https://blog.csdn.net/tiankong_/article/details/78754545
https://www.bilibili.com/read/cv1753143/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慎式,隨后出現(xiàn)的幾起案子伶氢,更是在濱河造成了極大的恐慌趟径,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣防,死亡現(xiàn)場(chǎng)離奇詭異蜗巧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蕾盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)幕屹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人级遭,你說(shuō)我怎么就攤上這事望拖。” “怎么了挫鸽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵说敏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丢郊,道長(zhǎng)盔沫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任蚂夕,我火速辦了婚禮迅诬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婿牍。我一直安慰自己毙驯,他們只是感情好国旷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般阎曹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澡谭,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天溃肪,我揣著相機(jī)與錄音,去河邊找鬼粉楚。 笑死辣恋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的模软。 我是一名探鬼主播伟骨,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼燃异!你這毒婦竟也來(lái)了携狭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤回俐,失蹤者是張志新(化名)和其女友劉穎逛腿,沒(méi)想到半個(gè)月后稀并,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单默,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年碘举,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕凹。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殴俱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枚抵,到底是詐尸還是另有隱情线欲,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布汽摹,位于F島的核電站李丰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逼泣。R本人自食惡果不足惜趴泌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拉庶。 院中可真熱鬧嗜憔,春花似錦、人聲如沸氏仗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皆尔。三九已至呐舔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慷蠕,已是汗流浹背珊拼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留流炕,地道東北人澎现。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像每辟,于是被迫代替她去往敵國(guó)和親昔头。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 MIDI 文件是在做音樂(lè)應(yīng)用時(shí)影兽,很可能會(huì)遇到的一種文件格式。Github上面有相關(guān)的類(lèi)庫(kù)莱革,可以用來(lái)解析MID...
    AlanWong閱讀 32,353評(píng)論 30 28
  • 要書(shū)寫(xiě)二進(jìn)制(十六進(jìn)制)文件峻堰,應(yīng)該準(zhǔn)備好一些工具讹开,比如我自己用的是VC++,因?yàn)閷W(xué)習(xí)MIDI格式無(wú)非是想寫(xiě)它的軟件...
    錢(qián)鑫_9771閱讀 1,465評(píng)論 0 2
  • 過(guò)段時(shí)間沒(méi)有輸入則會(huì)顯示Alarm clock捐名,與sub_B70有關(guān)(調(diào)用alarm旦万,nop掉)。 共有5個(gè)選項(xiàng)镶蹋。...
    靜析機(jī)言閱讀 1,333評(píng)論 0 1
  • MIDI文件屬于二進(jìn)制文件成艘,這種文件一般都有如下基本結(jié)構(gòu): 文件頭+數(shù)據(jù)描述 文件頭一般包括文件的類(lèi)型,因?yàn)镸id...
    錢(qián)鑫_9771閱讀 1,487評(píng)論 0 2
  • 11月28日12時(shí)50分左右贺归,“科學(xué)狂人”賀建奎出現(xiàn)在香港舉行的第二屆國(guó)際人類(lèi)基因編輯峰會(huì)上淆两,這也是近幾天以來(lái),風(fēng)...
    灞水一方閱讀 466評(píng)論 1 3