MIDI格式
MIDI格式是指以标准MIDI文件(Standard MIDI File,SMF)为核心的一类音乐文件格式,通常以.mid或.midi为扩展名。它记录的是一系列带有时间标记的演奏指令,如音符起止、力度、音色与控制器变化,而不存储实际的声音波形,因此体积远小于音频文件,事件的音高、时值等内容也可以被重新编辑[1]。文件需要经由音源或合成器读取才能发声,同一文件在不同设备上的听感可能不同。
定义
MIDI格式指按标准MIDI文件规范保存的二进制音乐文件,扩展名一般为.mid或.midi,媒体类型标记为audio/midi[2][3]。它属于指令型格式,文件内部是一串按时间先后排列的演奏事件,用来描述演奏者做了什么,而非把声波录下来[1]。
标准MIDI文件与设备之间实时传输的MIDI通信协议并不相同:后者是即时的串行消息流,前者则为每个事件附加了时间戳,使其可以脱离硬件按顺序回放[1]。规范同时支持乐曲、序列、轨道结构以及速度和拍号等信息,轨道名称、版权声明、歌词等描述性内容也可以一并存入文件[4]。
原理
文件采用分块(chunk)结构,每块以一个4个字符的类型标识开头,随后是4字节的长度字段,长度只计算其后的数据部分[5]。整体结构可表示为 $\text{SMF} = \text{MThd} + \text{MTrk}^{+}$,即先有一个头块,再跟随一个或多个音轨块[6]。头块固定长度6字节,内含格式类型、音轨数量和时间分辨率三项16位数据[6]。
flowchart LR
A["MThd 头块<br/>格式 / 轨道数 / 时间分辨率"] --> B["MTrk 音轨块 1"]
B --> C["MTrk 音轨块 2"]
C --> D["…"]
B --> E["增量时间 + 事件"]
C --> E
音轨块内的每个事件由「增量时间」加「事件」构成,增量时间表示距上一事件经过的计时单位数,并以可变长度方式编码以节省字节[6]。事件分三类:通道消息(如音符开、音符关、控制器、音色切换)、系统独占消息,以及供音序软件读取的元事件[6]。元事件以0xFF开头,可承载速度设定、拍号、调号、歌词、版权声明和轨道结束标记等内容[6]。
时间分辨率的取值决定计时方式:最高位为0时,低15位表示每四分音符的滴答数;最高位为1时,则改用与SMPTE及MIDI时间码一致的帧率与每帧滴答数,便于与影视画面同步[5]。每个音轨块最多可携带16个MIDI通道的数据,多轨结构正是为容纳超出16通道的编配而设[1]。
发展历程
MIDI本身作为乐器间串行通信的规范在1983年确立,标准MIDI文件格式随后在协议之上补充了时间戳与文件封装,使演奏数据能在不同程序与不同计算机之间交换[7][4]。该规范由MIDI制造商协会(MMA)发布并受版权保护,日文版则由日本方面的音乐电子事业协会负责[2]。
格式最初规定了0、1、2三种类型:类型0把全部通道合并进单一音轨,类型1为多条同时播放的音轨,类型2为若干彼此独立的单轨段落[5]。其中类型0便于直接顺序读取,类型1利于分轨编辑,类型2在实际使用中未能推广[1]。
为解决同一文件在不同音源上音色错位的问题,MMA与日本MIDI标准委员会在1991年推出通用MIDI(General MIDI)规范,将128个音色编号与乐器对应关系固定下来,并规定通道10专用于打击乐[8]。该规范要求兼容设备至少具备24个复音、可同时使用全部16个通道,并响应力度与若干控制器消息[8]。后续又出现了扩展版本GM2,部分厂商还各自提出了兼容性更细的扩展方案[1]。
MIDI 1.0的详细规范文本在1996年整理出版,标准MIDI文件规范被收入其中[9]。近年来,基于通用MIDI数据包的新文件形式也被提出,用于适配新一代协议[4]。
应用
MIDI文件最常见的用途是交换带时间信息的演奏数据,因此成为网络上流传的乐曲载体之一,也被用于现场演出中的伴奏播放[1]。文件由软件或硬件播放器载入后,交由与之相连或内置于播放器的音源引擎发声[1]。
在音乐制作环节,编曲通常在数字音频工作站或音序软件中完成,再通过另存或导出功能生成标准MIDI文件;主流工作站软件以及数码钢琴、合成器、工作站等硬件普遍具备读写能力[1]。文件除演奏数据外还可携带速度、每通道音色选择、控制器初值等设置信息,以及作曲者与版权等文字内容[1]。
由于数据量小且事件可编辑,这类文件也用于乐曲的重新编排、互动创作与教学演示[1]。在程序开发与声音化研究中,MIDI消息与文件结构常被直接用于参数映射与控制[10]。
局限
MIDI文件不记录任何音频采样,因此无法保存人声、实录乐器等真实声音本身,它只能描述演奏动作[11][12]。回放效果取决于所用音源的音色库与合成方式,若音色库中缺少某件乐器,对应音符可能完全不出声,若编号对应关系不同则会奏出别的音色[13]。
同一文件在两套系统上的听感可能差异明显,除非两边的合成器相近,否则听到的结果未必符合创作者本意[1]。通用MIDI及其后续版本正是为缩小这种不可预期性而制定,但它只能保证编号与基本行为一致,并不保证音色质量相同[8]。
在浏览器环境中,网页媒体元素普遍不包含MIDI合成能力,直接播放标准MIDI文件通常无法出声,需要先行渲染为音频格式,或借助音源另行处理[3]。此外,该格式并未被注册进互联网号码分配机构的音频媒体类型标准树,实际使用中依赖既有的通用约定[3]。
格式本身也较为朴素,部分设备专属参数的设定需要借助系统独占消息,这类消息的内容随硬件而异[14]。串行传输在同时触发大量事件时还会带来时间偏差,多通道同时发声时靠后的通道会被推迟[15]。
参见
参考资料
- About MIDI-Part 4:MIDI Files [引用日期2026-10-29]
- MIDI—Wolfram Documentation [引用日期2026-10-29]
- audio/midi MIME Type: Standard MIDI Files and Support [引用日期2026-10-29]
- Standard MIDI Files [引用日期2026-10-29]
- Standard MIDI file format, updated [引用日期2026-10-29]
- Standard MIDI File Structure [引用日期2026-10-29]
- Standard MIDI File Format [引用日期2026-10-29]
- General MIDI [引用日期2026-10-29]
- MIDI - Free Pascal wiki [引用日期2026-10-29]
- WAV files are digitally stored sound samples [引用日期2026-10-29]
- SAP Help Portal [引用日期2026-10-29]
- MIDI - The Discovery - One small step for the dog [引用日期2026-10-29]
- MIDI: Difference between revisions [引用日期2026-10-29]
- 2009LARE0022_OSebastien(PDF) [引用日期2026-10-29]
- wikipedia.org 上的网页 [引用日期2026-10-29]