MIDI文件格式

MIDI文件属于二进制文件,这种文件一般都有如下基本结构: 文件头+数据描述 文件头一般包括文件的类型。
基础资料
  • 中文名:MIDI文件格式
  • 构成:由若干个格式相同的子数据构成的
  • 文件结构:类型指的是"MThd"或"MTrk"
  • 简介

    分析

    MIDI文件属于二进制文件,这种文件一般都有如下基本结构: 文件头+数据描述     文件头一般包括文件的类型,因为Midi文件仅以.mid为扩展名的就有0类和1类两种,而大家熟悉的位图文件的格式就更多了,所以才会出现文件头这种东西。

    以下是MIDI文件块结构

    类型

    长度

    数据

    4个字节

    4个字节

    4个字节

    类型指的是"MThd"或"MTrk",长度指的是除去类型和长度两部分外,其他数据占的字节数。

    而数据描述部份是主体,现在来一起分析它的结构:

    在每个Midi文件的开头都有如下内容,它们的十六进制代码为:“4d 54 68 64 00 00 00 06 ff ff nn nn dd dd”。

    前四个是ASCII字符“MThd”是用来鉴别是否Midi文件,而随后的四个字节是指明文件头描述部分的字节数,它总是6,所以一定是“00 00 00 06”,以下是剩余部分的含义:

     ff ff

     指定Midi的格式

    00 00单音轨

    00 01多音轨,且同步。这是最常见的

    00 02多音轨,但不同步

     nn nn

     指定轨道数

     实际音轨数加上一个全局的音轨

     dd dd

     指定基本时间格式类型

    类型1:定义一个四分音符的tick数,tick是MIDI中的最小时间单位

    类型2:定义每秒中SMTPE帧的数量及每个SMTPE帧的tick

    以上就是MIDI文件头了,后面的所有内容都是真正做事的,先来看看它的构成。

    构成

    MIDI的数据是由若干个格式相同的子数据构成的,这些子数据在多音轨的格式中记录了一个轨道的所有信息。多加一个音轨,就简单地把数据追加在前一音轨的后面就可以了,不过不要忘记更改文件头中的nn nn(轨道数)。

    先看全局音轨。全局音轨包括歌曲的附加信息(比如标题和版权)、歌曲速度和系统码(Sysx)等内容。

    不管是全局音轨还是含有音符的音轨,都以“4D 54 72 6B”开头,它其实是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这个时间,要写成81 70。同理,如果要表示65535tick,则可以先计算出65535=1282*3+1281*127+1280*127,然后得出结果:83 FF 7F。由此,反过来也可以知道如何确定时间差:只要标志位为0,则表示结束读取时间差。比如82 C0 03表示1282*2+1281*64+1280*3=40963,如果基本时间为120,则有341:043个四分音符。

    以这种方式记录整数的字节称为动态字节,它根据记录的整数改变自身的长度,这在后面还要用到,所以必须熟练计算。

    看完了这么麻烦的东西,再来看个更麻烦的东西:事件。在这些标准的解释后面,会通过一些例子来进一步掌握这些内容。

    事件大体上可以分为音符、控制器和系统信息这几个种类。对于这些事件,都有统一的表达结构:种类+参数。

    对于一个音符,由于它的有效范围是0~127,所以直接用00~7F作为“种类”,可以认为是个音符,比如3C表示中央C。而一个音符的最重要的参数是力度(也叫速度:velocity)。比如,3C 64 表示一个力度为十进制100的中央C音符。

    因为一个字节有8位,所以剩余的一位如果置1,再联合其他的7位,则可以表示各种信息。暂且无视一个音轨到底是全局的还是用于记录音符的。它们归根结底都是用来记录各种事件的,只不过有些应出现在全局音轨比较合乎逻辑而已。既然这样,就可以从下面的表来看事件:

    下表中,x表示音轨0~F,比如81表示松开第二轨的音符。

    种类

    字节含义

    参数(十六进制)

    8x 松开音符

    音符(00~7F):松开的音符 力度:00~7F

    9x按下音符

    音符(00~7F):按下的音符

    力度:00~7F

    Ax触后音符

    音符:00~7F

    力度:00~7F

    Bx 控制器

    控制器号码:00~7F

    控制器参数:00~7F

    Cx改变乐器

    乐器号码:00~7F

    展开表格

    下表详细地列出了FF的详细情况,对于字节数由数据决定的情况,表中以“--”表示。

    种类

    字节 含义

    字节数

    数据

    00 设置轨道音序

    02

    音序号 00 00~ FF FF

    01 歌词备注

    音轨文本

    --

    文本信息

    文本信息

    02 歌曲版权

    --

    版权信息

    03 歌曲标题

    音轨名称

    --

    用于全局音轨

    音轨名

    04 乐器名称

    --

    音轨文本(同01/2)

    展开表格

    简介

    与波形文件不同,MIDI文件不对音乐进行抽样,而是对音乐的每个音符记录为一个数字,所以与波形文件相比文件要小得多,可以满足长时间音乐的需要。MIDI标准规定了各种音调的混合及发音,通过输出装置可以将这些数字重新合成为音乐。

    MIDI音乐的主要限制是它缺乏重现真实自然声音的能力,因此不能用在需要语音的场合。此外,MIDI只能记录标准所规定的有限种乐器的组合,而且回放质量受到声音卡的合成芯片的限制。近年来,国外流行的声音卡普遍采用波表法进行音乐合成,使MIDI的音乐质量大大提高。

    MIDI文件有几个变通格式,如RMI和CIF等。其中CMF文件(creative music format)是随声霸卡一起使用的音乐文件。RMI文件是Windows使用的RIFF(resource interchange file format)文件的一种子格式,称为RMID,即包含MIDI文件的格式。

    首页
    科技
    #贵族
    最新入驻
    贾科莫·普契尼
    Caroline Lufkin
    翁建宇
    相关阅读
    GetStockObject
    内容词条·4988人浏览
    CClientDC
    内容词条·5694人浏览
    蓝鳍金枪鱼-21型自主式水下航行器
    内容词条·7113人浏览
    OnDraw
    内容词条·4804人浏览
    CreateIC
    内容词条·726人浏览
    ReleaseDC
    内容词条·2743人浏览
    • 网站地图
    • |

    Copyright 2023 fuwu029.com赣ICP备2022008914号-4