标准 MIDI 文件格式规范 1.1,更新版
本文转自 Standard MIDI file format, updated,如有侵权,请联系删除。
摘要
标准 MIDI 文件格式的详细规范
致谢
本文档最初由国际 MIDI 协会以文本格式发布。我对其进行了更新,并添加了新的附录。
© 1999 David Back 版权所有。
电子邮件:david@csw2.co.uk
网站:http://www.csw2.co.uk
此文档可以自由复制,前提是副本包含此致谢信息。
0 - 引言
本文档详细描述了 MIDI 文件的结构。MIDI 文件的目的是提供一种在不同程序(无论是在同一台计算机还是不同计算机上)之间交换带时间戳的 MIDI 数据的方式。其主要设计目标之一是紧凑的表示形式,这使得它非常适合磁盘存储的文件格式,但可能不适合存储在内存中以供音序程序快速访问。
MIDI 文件包含一个或多个 MIDI 流,每个事件都附带时间信息。该格式支持歌曲、序列、轨道结构以及速度和节拍信息。轨道名称和其他描述性信息可以与 MIDI 数据一起存储。该格式支持多轨道和多序列,因此如果程序用户打算将文件从一个程序迁移到另一个程序,且该程序支持多个轨道,那么这种格式能够实现这一点。
该规范定义了文件中使用的 8 位二进制数据流。数据可以存储为二进制文件,或进行 nibble 化、7 位化以实现高效的 MIDI 传输、转换为十六进制 ASCII、或者转化为符号表示的可打印文本文件。此规范讨论的是 8 位数据流的内容,而不讨论 MIDI 文件如何通过 MIDI 协议进行传输。
1 - 序列、轨道、块:文件块结构
在本文档中,位 0 表示字节的最低有效位,位 7 表示最高有效位。
1.1 - 可变长度数量
在 MIDI 文件中,一些数字以称为“可变长度数量”的形式表示。这些数字每个字节 7 位,按从最高有效位到最低有效位的顺序排列。除了最后一个字节,所有字节的第 7 位都被设置为 1,而最后一个字节的第 7 位被设置为 0。如果数字介于 0 和 127 之间,它将仅用一个字节表示。
可变长度数量表示的一些示例:
数字(十六进制) | 表示形式(十六进制) |
---|---|
00000000 | 00 |
00000040 | 40 |
0000007F | 7F |
00000080 | 81 00 |
00002000 | C0 00 |
00003FFF | FF 7F |
00004000 | 81 80 00 |
00100000 | C0 80 00 |
001FFFFF | FF FF 7F |
00200000 | 81 80 80 00 |
08000000 | C0 80 80 00 |
0FFFFFFF | FF FF FF 7F |
允许的最大数字是 0FFFFFFF,因此可变长度表示必须在编写可变长度数字的例程中适合 32 位。理论上,更大的数字是可能的,但在 500 拍每分钟的快速节奏下,2 x 108 个 96 分之一拍的时长为四天,这对任何 delta-time 都已经足够长了!
1.2 - 文件
对于任何文件系统,MIDI 文件只是一个由 8 位字节组成的序列。在 Macintosh 上,该字节流存储在文件的数据部分(文件类型为'MIDI'),或在剪贴板上(数据类型为'MIDI')。大多数其他计算机也将 8 位字节流存储在文件中。
1.3 - 块
MIDI 文件由“块”组成。每个块都有一个 4 字符的类型和一个 32 位长度,表示块中的字节数。该结构允许未来设计的块类型在被早期编写的程序遇到时可以轻松忽略。你的程序应该期望遇到不认识的块,并将其视为不存在。
每个块以 4 个 ASCII 字符的类型开始,后面跟着一个 32 位的长度,最高有效字节在前(例如,长度为 6 表示为 00 00 00 06)。该长度指的是随后的数据字节数:类型和长度的八个字节不包括在内。因此,一个长度为 6 的块在磁盘文件中实际上占用 14 个字节。
这种块结构类似于 Electronic Arts 的 IFF 格式使用的结构,本文描述的块可以很容易地放入 IFF 文件中。MIDI 文件本身不是 IFF 文件:它不包含嵌套块,且块不受限于偶数字节长。将其转换为 IFF 文件的过程很简单,只需填充奇数长度的块,并将整个内容放入一个 FORM 块中。
1.4 - 块类型
MIDI 文件包含两种类型的块:头块和轨道块。头块提供关于整个 MIDI 文件的最小信息,而轨道块包含 MIDI 数据的顺序流,最多可包含 16 个 MIDI 通道的信息。多个轨道、多个 MIDI 输出、模式、序列和歌曲等概念都可以通过多个轨道块来实现。
每个 MIDI 文件总是以头块开始,后面跟着一个或多个轨道块。
MThd <头数据长度>
<头数据>
MTrk <轨道数据长度>
<轨道数据>
MTrk <轨道数据长度>
<轨道数据>
. . .
2 - 块描述
2.1 - 头块
文件开头的头块指定了文件中数据的一些基本信息。完整块的语法如下:
<头块> = <块类型> <长度> <格式> <轨道数> <时间单位>
如上所述,<块类型>
是四个 ASCII 字符 'MThd';<长度>
是 32 位的数字 6(高字节优先)。
数据部分包含三个 16 位的字,以最高有效字节在前的顺序存储。
第一个字 <格式>
指定了文件的整体组织方式。仅定义了三种 <格式>
值:
0 - 文件包含一个多通道轨道
1 - 文件包含一个或多个同步轨道(或 MIDI 输出)的序列
2 - 文件包含一个或多个顺序独立的单轨模式
关于这些格式的更多信息将在下文中提供。
下一个字 <轨道数>
表示文件中的轨道块数量。对于格式 0 文件,它始终为 1。
第三个字 <分辨率>
指定了 delta-time 的含义。它有两种格式,一种用于节拍时间,另一种用于基于时间码的时间:
位 15 | 位 14 到 8 | 位 7 到 0 |
---|---|---|
0 | 每四分音符的 tick 数量 | |
1 | 负的 SMPTE 格式 | 每帧的 tick 数量 |
如果 <时间单位>
的位 15 为 0,则位 14 到 0 表示构成一个四分音符的 delta 时间 "tick" 数。例如,如果分辨率为 96,则文件中两个事件之间的八分音符间隔时间为 48。
如果 <时间单位>
的位 15 为 1,则文件中的 delta 时间与秒的细分相对应,与 SMPTE 和 MIDI 时间码一致。位 14 到 8 包含四种值之一 -24、-25、-29 或 -30,分别对应于四种标准 SMPTE 和 MIDI 时间码格式(-29 表示 30 帧丢帧格式),表示每秒的帧数。这些负值以二进制补码形式存储。第二个字节(以正数存储)表示帧内的分辨率:典型值可以是 4(MIDI 时间码分辨率)、8、10、80(位分辨率)或 100。这种结构允许精确指定基于时间码的轨道,也允许通过指定 25 帧/秒和每帧 40 单位的分辨率实现基于毫秒的轨道。如果文件中的事件以 30 帧时间码的位分辨率存储,则 <时间单位>
字的值为 E250 十六进制。
2.2 - MIDI 文件格式 0、1 和 2
格式 0 文件具有一个头块,后跟一个轨道块。它是最具互换性的表示数据方式。对于在一个需要让合成器发声但主要关注混音器或音效盒等其他内容的程序中的简单单轨播放器非常有用。即使你的程序基于轨道,能够生成这种格式也很理想,以便与这些简单的程序一起工作。
格式 1 或 2 文件具有一个头块,后跟一个或多个轨道块。支持多个同步轨道的程序应能够以格式 1(垂直一维形式,即一组轨道)保存和读取数据。支持多个独立模式的程序应能够以格式 2(水平一维形式)保存和读取数据。提供这些最低限度的功能将确保最大程度的互换性。
在一个使用歌曲指针和计时钟的带有计算机和 SMPTE 同步器的 MIDI 系统中,通常在计算机上创建速度图(描述整个轨道的速度,并可能包含节拍信息,以便推导出小节编号)。为了在同步器中使用它们,需要从计算机传输这些数据。为了便于同步器从 MIDI 文件中提取此数据,速度信息应始终存储在第一个 MTrk 块中。对于格式 0 文件,速度将分散在轨道中,速度图读取器应忽略中间事件;对于格式 1 文件,速度图必须存储为第一个轨道。如果无法使用格式 1,则应允许用户创建一个仅包含速度的格式 0 文件,以便友好地对待速度图读取器。
所有 MIDI 文件都应指定速度和节拍。如果未指定,假定节拍为 4/4,速度为每分钟 120 拍。在格式 0 中,这些元事件应至少出现在单个多通道轨道的开头。在格式 1 中,这些元事件应包含在第一个轨道中。在格式 2 中,每个时间独立的模式应至少包含初始的节拍和速度信息。
未来可能会定义支持其他结构的格式 ID。程序在遇到未知的格式 ID 时,仍可以从文件中读取其他 MTrk 块作为格式 1 或格式 2,如果其用户能够理解并根据需要将其组织成其他结构。此外,未来可能会向 MThd 块添加更多参数:即使长度超过 6,也应读取并遵守长度。
2.3 - 轨道块
轨道块(类型为 MTrk)是实际歌曲数据存储的位置。每个轨道块只是 MIDI 事件(以及非 MIDI 事件)的流,前面带有 delta-time 值。轨道块的格式(如下所述)对于所有三种 MIDI 文件格式(格式 0、1 和 2,见上文“头块”)都是相同的。
以下是 MTrk 块的语法(+ 表示“一个或多个”:至少需要一个 MTrk 事件):
<轨道块> = <块类型><长度><MTrk 事件>+
MTrk 事件的语法非常简单:
<MTrk 事件> = <delta-time><事件>
<delta-time>
以可变长度数量存储。它表示在下一个事件之前的时间量。如果轨道中的第一个事件发生在轨道的开头,或两个事件同时发生,则使用 delta-time 为零。delta-time 始终存在。(不存储 delta-time 为 0 的情况下,任何其他值至少需要两个字节,并且大多数 delta-time 并非为零。)delta-time 以拍的某个分数(或使用 SMPTE 时间记录轨道时的秒)表示,如头块中所指定。
<事件> = <MIDI 事件> | <sysex 事件> | <元事件>
<MIDI 事件>
是任何 MIDI 通道消息【详见附录 1 - MIDI 消息】。可使用运行状态:如果前一个事件是具有相同状态的 MIDI 通道消息,则可以省略状态字节。每个 MTrk 块中的第一个事件必须指定状态。delta-time 本身不被视为事件:它是 MTrk 事件语法的组成部分。注意,运行状态跨 delta-time 存在。
<sysex 事件>
用于指定一个 MIDI 系统专用消息,可以作为一个整体或分组,也可以作为“转义”来指定任何要传输的字节【详见附录 1 - MIDI 消息】。完整的系统专用消息在 MIDI 文件中以如下方式存储:
F0 <长度> <F0 之后传输的字节>
长度以可变长度数量存储,表示后续的字节数,不包括 F0 和长度本身。例如,传输的消息 F0 43 12 00 07 F7 将在 MIDI 文件中存储为 F0 05 43 12 00 07 F7。需要在结尾包含 F7 以确保 MIDI 文件的读取器知道已读取完整消息。
提供了一种不暗示应传输 F0 的 sysex 事件形式。这可以用作“转义”以传输其他非法内容,包括系统实时消息、歌曲指针或选择、MIDI 时间码等。此形式使用 F7 代码:
F7 <长度> <传输的所有字节>
不幸的是,一些合成器制造商要求将其系统专用消息以小数据包形式传输。每个数据包只是整个语法系统专用消息的一部分,但传输时间很重要。例如,这是 CZ 补丁转储中发送的字节,或 FB-01 的“系统专用模式”,其中可以传输微分音数据。F0 和 F7 sysex 事件可以结合使用,以将完整的系统专用消息分解为有时间间隔的数据包。
在一系列数据包中,第一个包使用 F0 sysex 事件——它是应传输 F0 的消息。接下来的数据包使用 F7 sysex 事件,不以 F0 开头。(当然,F7 不被视为系统专用消息的一部分。)
即使实际设备未发送 F7,语法系统专用消息必须始终以 F7 结尾,以便无需查看 MIDI 文件中的下一个事件也能知道已经读取了完整的 sysex 消息。如果消息存储在一个完整的 F0 sysex 事件中,则最后一个字节必须是 F7。在多数据包系统专用消息的各个包之间不应有可传输的 MIDI 事件。此原则在下面的段落中进行了说明。
这是一个多数据包系统专用消息的 MIDI 文件示例:假设需要发送字节 F0 43 12 00,之后是 200-tick 延迟,随后发送字节 43 12 00 43 12 00,再经过 100-tick 延迟后发送字节 43 12 00 F7,在 MIDI 文件中如下表示:
F0 03 43 12 00 | |
81 48 | 200-tick delta-time |
F7 06 43 12 00 43 12 00 | |
64 | 100-tick delta-time |
F7 04 43 12 00 F7 |
在读取 MIDI 文件时,如果遇到没有前置 F0 sysex 事件的 F7 sysex 事件开始多数据包系统专用消息序列,应假定 F7 事件用作“转义”。在这种情况下,不需要以 F7 结尾,除非需要传输 F7。
<元事件>
指定了对该格式或音序器有用的非 MIDI 信息,语法如下:
FF <类型> <长度> <字节>
所有元事件都以 FF 开始,接着是一个事件类型字节(始终小于 128),然后是以可变长度数量存储的数据长度,接着是数据本身。如果没有数据,长度为 0。与块一样,未来可能会设计未被现有程序识别的元事件,因此程序必须正确忽略它们并预期看到它们。程序不得忽略它们不识别的元事件的长度,且不应对大于预期的长度感到惊讶。如果是这样,程序必须忽略它们已知之外的所有内容。但是,它们不得在元事件末尾添加任何内容。
3 - 元事件
本文定义了一些元事件。并非每个程序都必须支持所有的元事件。
在每个元事件的语法描述中使用了一些约定来描述事件的参数。每个事件开头的 FF
、事件类型和不具有可变数据长度的事件长度均以十六进制给出。用两个小写字母(如 dd
或 se
)表示的符号代表 8 位值。四个相同的小写字母(如 wwww
)代表 16 位值,按最高有效字节优先顺序存储。六个相同的小写字母(如 tttttt
)代表 24 位值,也按最高有效字节优先顺序存储。符号 len
代表元事件语法中的长度部分,即一个存储为可变长度数量的数字,指定了刚才的文本数据的字节数。
一般情况下,轨道中同时发生的元事件可以按任何顺序排列。如果使用版权事件,应尽早在文件中放置,以便容易被注意到。序列号和序列/轨道名称事件(如果存在)必须出现在时间 0 处。结束轨道事件必须作为轨道的最后一个事件。
3.1 - 元事件定义
FF 00 02 序列号
此可选事件必须出现在轨道的开头,在任何非零时间间隔和可传输的 MIDI 事件之前,指定序列的编号。在格式 2 的 MIDI 文件中,此事件用于标识每个“模式”,以便“歌曲”序列可以使用提示消息引用这些模式。如果省略 ID 号,则使用文件中序列的默认位置顺序。在仅包含一个序列的格式 0 或 1 MIDI 文件中,该编号应包含在第一个(或唯一的)轨道中。如果需要传输多个多轨序列,必须作为格式 1 文件的组进行传输,每个文件具有不同的序列号。
FF 01 len text 文本事件
描述任何内容的任意文本。建议在轨道开始时添加文本事件,注明轨道名称、其预期编排的描述及用户希望包含的任何其他信息。文本事件也可在轨道的其他时间点出现,用作歌词或提示点的描述。该事件中的文本应使用可打印的 ASCII 字符以实现最大程度的互操作性。不过,使用高阶位字符的其他字符编码可以用于在支持扩展字符集的同一台计算机上的不同程序之间交换文件。不能处理非 ASCII 字符的程序应忽略这些字符。
元事件类型 01 至 0F 保留用于各种类型的文本事件,每个文本事件符合上述文本事件的规范,但用于不同目的:
FF 02 len text 版权声明
包含作为可打印 ASCII 文本的版权声明。声明应包含字符 (C)、版权年份及版权拥有者。如果同一 MIDI 文件中有多段音乐,应将所有版权声明放在同一事件中,以便它位于文件开头。此事件应为轨道块中的第一个事件,位于时间 0 处。
FF 03 len text 序列/轨道名称
如果在格式 0 的轨道中或格式 1 文件的第一个轨道中,则为序列名称。否则,为轨道名称。
FF 04 len text 乐器名称
描述该轨道所使用的乐器类型。可与 MIDI 通道前缀元事件一起使用,指定该描述适用于哪个 MIDI 通道,或者可在事件本身中以文本方式指定通道。
FF 05 len text 歌词
要演唱的歌词。通常,每个音节都是单独的歌词事件,该事件从其时间点开始。
FF 06 len text 标记
通常在格式 0 的轨道中或格式 1 文件的第一个轨道中使用。表示序列中该点的名称,如排练标记或段落名称(如“第一段”)。
FF 07 len text 提示点
描述音乐谱中的该点在电影、视频或舞台上发生的事件(如“汽车撞入房屋”、“幕布开启”、“她打了他的脸”等)。
FF 20 01 cc MIDI 通道前缀
此事件包含的 MIDI 通道(0-15)可用于将后续所有事件(包括系统独占和元事件)与一个 MIDI 通道关联。此通道“有效”直到下一个正常 MIDI 事件(包含通道信息)或下一个 MIDI 通道前缀元事件出现。如果 MIDI 通道引用“轨道”,该消息可放入格式 0 文件中,以保持其非 MIDI 数据与轨道关联。此功能在 Yamaha 的 ESEQ 文件格式中也存在。
FF 2F 00 轨道结束
此事件不是可选项。其作用是指定轨道的确切结束点,从而定义确切的长度,这对于循环或连接的轨道是必要的。
FF 51 03 tttttt 设置节拍(每个 MIDI 四分音符的微秒数)
此事件表示节拍变更。“每个四分音符的微秒数”可以理解为“MIDI 时钟的 1/24 微秒”。将节拍表示为每拍时间而不是每单位时间的拍数,使得在与基于时间的同步协议(如 SMPTE 时间码或 MIDI 时间码)同步时可以达到绝对精确。此节拍分辨率提供的精度使得一首 120 拍/分钟、时长为 4 分钟的乐曲在结束时的误差不超过 500 微秒。理想情况下,这类事件应仅出现在 MIDI 时钟位置,以保证或至少增加与其他同步设备的兼容性,从而便于将此格式存储的节拍/节奏图轻松传输至其他设备。
FF 54 05 hr mn se fr ff SMPTE 偏移量
如果存在,此事件指示轨道块应开始的 SMPTE 时间。它应出现在轨道开始处,即任何非零时间增量和可传输的 MIDI 事件之前。小时数必须以 SMPTE 格式编码,就像在 MIDI 时间码中一样。在格式 1 文件中,SMPTE 偏移量必须与节拍图一起存储,对于其他轨道无意义。字段 ff
包含帧的小数部分,以帧的百分之一为单位,即使在指定不同帧子分区的基于 SMPTE 的轨道中也是如此。
FF 58 04 nn dd cc bb 拍号
拍号用四个数字表示。nn
和 dd
分别代表拍号的分子和分母。分母为负的 2 的幂:2 表示四分音符,3 表示八分音符,依此类推。参数 cc
表示节拍器每次点击的 MIDI 时钟数。参数 bb
表示 MIDI 四分音符中记录的 32 分音符数(24 个 MIDI 时钟)。添加此项是因为已有多个程序允许用户指定 MIDI 所认定的四分音符(24 时钟)在标记上表示为或与其他内容相关。
因此,对于 6/8 拍,每三个八分音符一次节拍器点击,每个小节 24 时钟、72 时钟,该事件的完整表示为(十六进制):
FF 58 04 06 03 24 08
即 6/8 拍(8 是 2 的 3 次幂,所以为 06 03)、每个附点四分音符 36 MIDI 时钟(24 十六进制!)、每个四分音符 8 个标记的 32 分音符。
FF 59 02 sf mi 调号sf = -7
: 7 个降号sf = -1
: 1 个降号sf = 0
: C 大调sf = 1
: 1 个升号sf = 7
: 7 个升号
mi = 0
: 大调mi = 1
: 小调
FF 7F len data 特定音序器元事件
某些音序器的特定需求可使用此事件类型:数据的第一个字节或字节组为制造商 ID(这些 ID 通常是一个字节,如果第一个字节为 00
,则为三个字节)。如同 MIDI 系统独占事件一样,定义此元事件的制造商应发布相关信息,以便其他音序器能够使用该文件格式;具有既定特定格式的音序器在使用此格式时应尽量坚持标准功能。
请参见 附录 2 - 程序片段和示例 MIDI 文件,获取示例 MIDI 文件。
附录 1 - MIDI 消息
MIDI 消息由一个八位状态字节组成,通常后接一个或两个数据字节。MIDI 消息有多种类型。从最高层来看,MIDI 消息被分为通道消息和系统消息。通道消息适用于特定通道,其状态字节中包含通道号。系统消息不针对特定通道,其状态字节中不包含通道号。
通道消息可进一步分类为通道语音消息和模式消息。通道语音消息携带乐器演奏数据,是典型 MIDI 数据流中最常见的消息类型。通道模式消息则影响接收设备对通道语音消息的响应方式。
MIDI 系统消息可分类为系统通用消息、系统实时消息或系统独占消息。系统通用消息用于整个系统的接收器,系统实时消息用于基于时钟的 MIDI 组件之间的同步。系统独占消息包含制造商标识 (ID) 码,用于按照指定制造商定义的格式传输任意数量的数据字节。
附录 1.1 - 主要 MIDI 消息表
通道语音消息 | ||
---|---|---|
状态 D7----D0 nnnn 是MIDI通道号 | 数据字节 D7----D0 | 描述 |
1000nnnn | 0kkkkkkk 0vvvvvvv | 音符关闭事件(Note Off)。 当音符被释放(结束)时发送此消息。 (kkkkkkk) 是音符(键)的编号。 (vvvvvvv) 是力度。 |
1001nnnn | 0kkkkkkk 0vvvvvvv | 音符开启事件(Note On)。 当音符被按下(开始)时发送此消息。 (kkkkkkk) 是音符(键)的编号。 (vvvvvvv) 是力度。 |
1010nnnn | 0kkkkkkk 0vvvvvvv | 多音键压(Aftertouch)。 这条消息通常在按键“到底”后,继续加压时发送。 (kkkkkkk) 是音符(键)的编号。 (vvvvvvv) 是压力值。 |
1011nnnn | 0ccccccc 0vvvvvvv | 控制变化(Control Change)。 当控制器值发生变化时发送此消息。控制器包括踏板、杠杆等设备。某些控制器编号被保留用于特定目的。请参阅通道模式消息。 (ccccccc) 是控制器编号。 (vvvvvvv) 是新值。 |
1100nnnn | 0ppppppp | 程序变化(Program Change)。 当补丁编号变化时发送此消息。 (ppppppp) 是新程序编号。 |
1101nnnn | 0vvvvvvv | 通道压(After-touch)。 这条消息通常在按键“到底”后,继续加压时发送。它不同于多音压(Polyphonic after-touch)。此消息用于发送所有当前按下的键中最大的压力值。 (vvvvvvv) 是压力值。 |
1110nnnn | 0lllllll 0mmmmmmm | 音高轮变化(Pitch Wheel Change)。 当音高轮发生变化时发送此消息。音高轮的值由一个14位的值表示。中心(无音高变化)为2000H。灵敏度由发送器决定。 (lllllll) 是最低有效的7位。 (mmmmmmm) 是最高有效的7位。 |
通道模式消息(见上面的控制变化) | ||
1011nnnn | 0ccccccc 0vvvvvvv | 通道模式消息。 这与上面的控制变化代码相同,但通过使用保留的控制器编号来实现模式控制。编号如下: 本地控制(Local Control)。 当本地控制关闭时,给定通道上的所有设备仅响应通过MIDI接收到的数据。播放的数据等将被忽略。本地控制开启时,恢复正常控制器的功能。 c = 122, v = 0:本地控制关闭 c = 122, v = 127:本地控制开启 所有音符关闭(All Notes Off)。 |
系统公共消息 | ||
11110000 | 0iiiiiii 0ddddddd .. .. 0ddddddd 11110111 | 系统专用消息(System Exclusive)。 该消息弥补了MIDI不支持的内容。 (iiiiiii) 通常是七位的厂商ID代码。如果合成器识别此ID代码,则会接收消息的其余部分(ddddddd)。否则,消息会被忽略。系统专用消息用于发送批量数据,如补丁参数和其他非标准数据。(注意:实时消息仅可与系统专用消息交错)。该消息还用于扩展,称为通用专用消息(Universal Exclusive)。 |
11110001 | 未定义。 | |
11110010 | 0lllllll 0mmmmmmm | 歌曲位置指针(Song Position Pointer)。 这是一个内部14位寄存器,保存自歌曲开始以来的MIDI节拍数(1节拍=六个MIDI时钟)。l是最低有效位,m是最高有效位。 |
11110011 | 0sssssss | 歌曲选择(Song Select)。 歌曲选择指定要播放的序列或歌曲。 |
11110100 | 未定义。 | |
11110101 | 未定义。 | |
11110110 | 调音请求(Tune Request)。 当接收到调音请求时,所有模拟合成器应调谐其振荡器。 | |
11110111 | 专用结束(End of Exclusive)。 用于终止系统专用消息的传输(见上文)。 | |
系统实时消息 | ||
11111000 | 定时时钟(Timing Clock)。 当需要同步时,每四分之一音符发送24次。 | |
11111001 | 未定义。 | |
11111010 | 启动(Start)。 启动当前的序列播放。(此消息后会发送定时时钟)。 | |
11111011 | 继续(Continue)。 从停止时的位置继续播放序列。 | |
11111100 | 停止(Stop)。 停止当前序列。 | |
11111101 | 未定义。 | |
11111110 | 激活感应(Active Sensing)。 该消息的使用是可选的。初始发送时,接收方期望每300ms接收到另一个激活感应消息,否则它会假定连接已断开。在终止时,接收方将关闭所有声音,并返回到正常(非激活感应)操作。 | |
11111111 | 重置(Reset)。 重置系统中所有接收器至上电状态。应谨慎使用,最好在手动控制下使用。特别是,禁止在上电时发送此消息。 在MIDI文件中,此消息用作引入<meta事件>的转义符。 |
附录 1.2 - MIDI 控制器消息表(数据字节)
下表按数值(二进制)顺序列出 MIDI 控制器消息。
第二个字节值 | 功能 | 第三个字节 | |||
---|---|---|---|---|---|
二进制 | 十六进制 | 十进制 | 值 | 用途 | |
00000000 | 00 | 0 | 银行选择 | 0-127 | MSB |
00000001 | 01 | 1 | * 调制轮 | 0-127 | MSB |
00000010 | 02 | 2 | 呼吸控制 | 0-127 | MSB |
00000011 | 03 | 3 | 未定义 | 0-127 | MSB |
00000100 | 04 | 4 | 踏板控制器 | 0-127 | MSB |
00000101 | 05 | 5 | 滑音时间 | 0-127 | MSB |
00000110 | 06 | 6 | 数据输入 | 0-127 | MSB |
00000111 | 07 | 7 | * 通道音量(原主音量) | 0-127 | MSB |
00001000 | 08 | 8 | 平衡 | 0-127 | MSB |
00001001 | 09 | 9 | 未定义 | 0-127 | MSB |
00001010 | 0A | 10 | * 声像 | 0-127 | MSB |
00001011 | 0B | 11 | * 表情控制器 | 0-127 | MSB |
00001100 | 0C | 12 | 效果控制1 | 0-127 | MSB |
00001101 | 0D | 13 | 效果控制2 | 0-127 | MSB |
00001110 | 0E | 14 | 未定义 | 0-127 | MSB |
00001111 | 0F | 15 | 未定义 | 0-127 | MSB |
00010000 | 10 | 16 | 通用控制器 #1 | 0-127 | MSB |
00010001 | 11 | 17 | 通用控制器 #2 | 0-127 | MSB |
00010010 | 12 | 18 | 通用控制器 #3 | 0-127 | MSB |
00010011 | 13 | 19 | 通用控制器 #4 | 0-127 | MSB |
00010100 | 14 | 20 | 未定义 | 0-127 | MSB |
00010101 | 15 | 21 | 未定义 | 0-127 | MSB |
00010110 | 16 | 22 | 未定义 | 0-127 | MSB |
00010111 | 17 | 23 | 未定义 | 0-127 | MSB |
00011000 | 18 | 24 | 未定义 | 0-127 | MSB |
00011001 | 19 | 25 | 未定义 | 0-127 | MSB |
00011010 | 1A | 26 | 未定义 | 0-127 | MSB |
00011011 | 1B | 27 | 未定义 | 0-127 | MSB |
00011100 | 1C | 28 | 未定义 | 0-127 | MSB |
00011101 | 1D | 29 | 未定义 | 0-127 | MSB |
00011110 | 1E | 30 | 未定义 | 0-127 | MSB |
00011111 | 1F | 31 | 未定义 | 0-127 | MSB |
00100000 | 20 | 32 | 银行选择 | 0-127 | LSB |
00100001 | 21 | 33 | 调制轮 | 0-127 | LSB |
00100010 | 22 | 34 | 呼吸控制 | 0-127 | LSB |
00100011 | 23 | 35 | 未定义 | 0-127 | LSB |
00100100 | 24 | 36 | 踏板控制器 | 0-127 | LSB |
00100101 | 25 | 37 | 滑音时间 | 0-127 | LSB |
00100110 | 26 | 38 | 数据输入 | 0-127 | LSB |
00100111 | 27 | 39 | 通道音量(原主音量) | 0-127 | LSB |
00101000 | 28 | 40 | 平衡 | 0-127 | LSB |
00101001 | 29 | 41 | 未定义 | 0-127 | LSB |
00101010 | 2A | 42 | 声像 | 0-127 | LSB |
00101011 | 2B | 43 | 表情控制器 | 0-127 | LSB |
00101100 | 2C | 44 | 效果控制1 | 0-127 | LSB |
00101101 | 2D | 45 | 效果控制2 | 0-127 | LSB |
00101110 | 2E | 46 | 未定义 | 0-127 | LSB |
00101111 | 2F | 47 | 未定义 | 0-127 | LSB |
00110000 | 30 | 48 | 通用控制器 #1 | 0-127 | LSB |
00110001 | 31 | 49 | 通用控制器 #2 | 0-127 | LSB |
00110010 | 32 | 50 | 通用控制器 #3 | 0-127 | LSB |
00110011 | 33 | 51 | 通用控制器 #4 | 0-127 | LSB |
00110100 | 34 | 52 | 未定义 | 0-127 | LSB |
00110101 | 35 | 53 | 未定义 | 0-127 | LSB |
00110110 | 36 | 54 | 未定义 | 0-127 | LSB |
00110111 | 37 | 55 | 未定义 | 0-127 | LSB |
00111000 | 38 | 56 | 未定义 | 0-127 | LSB |
00111001 | 39 | 57 | 未定义 | 0-127 | LSB |
00111010 | 3A | 58 | 未定义 | 0-127 | LSB |
00111011 | 3B | 59 | 未定义 | 0-127 | LSB |
00111100 | 3C | 60 | 未定义 | 0-127 | LSB |
00111101 | 3D | 61 | 未定义 | 0-127 | LSB |
00111110 | 3E | 62 | 未定义 | 0-127 | LSB |
00111111 | 3F | 63 | 未定义 | 0-127 | LSB |
01000000 | 40 | 64 | * 脚踏板开/关(延音踏板) | <63=关闭 | >64=开启 |
01000001 | 41 | 65 | 滑音开/关 | <63=关闭 | >64=开启 |
01000010 | 42 | 66 | 持续音开/关 | <63=关闭 | >64=开启 |
01000011 | 43 | 67 | 柔音踏板开/关 | <63=关闭 | >64=开启 |
01000100 | 44 | 68 | 滑音踏板 | <63=关闭 | >64=开启 |
01000101 | 45 | 69 | 保持 2 | <63=关闭 | >64=开启 |
01000110 | 46 | 70 | 音色控制器 1(音色变化) | 0-127 | LSB |
01000111 | 47 | 71 | 音色控制器 2(音色色彩) | 0-127 | LSB |
01001000 | 48 | 72 | 音色控制器 3(释放时间) | 0-127 | LSB |
01001001 | 49 | 73 | 音色控制器 4(攻击时间) | 0-127 | LSB |
01001010 | 4A | 74 | 音色控制器 5(亮度) | 0-127 | LSB |
01001011 | 4B | 75 | 音色控制器 6 | 0-127 | LSB |
01001100 | 4C | 76 | 音色控制器 7 | 0-127 | LSB |
01001101 | 4D | 77 | 音色控制器 8 | 0-127 | LSB |
01001110 | 4E | 78 | 音色控制器 9 | 0-127 | LSB |
01001111 | 4F | 79 | 音色控制器 10 | 0-127 | LSB |
01010000 | 50 | 80 | 通用控制器 #5 | 0-127 | LSB |
01010001 | 51 | 81 | 通用控制器 #6 | 0-127 | LSB |
01010010 | 52 | 82 | 通用控制器 #7 | 0-127 | LSB |
01010011 | 53 | 83 | 通用控制器 #8 | 0-127 | LSB |
01010100 | 54 | 84 | 滑音控制 | 0-127 | 来源音符 |
01010101 | 55 | 85 | 未定义 | 0-127 | LSB |
01010110 | 56 | 86 | 未定义 | 0-127 | LSB |
01010111 | 57 | 87 | 未定义 | 0-127 | LSB |
01011000 | 58 | 88 | 未定义 | 0-127 | LSB |
01011001 | 59 | 89 | 未定义 | 0-127 | LSB |
01011010 | 5A | 90 | 未定义 | 0-127 | LSB |
01011011 | 5B | 91 | 效果 1 深度 | 0-127 | LSB |
01011100 | 5C | 92 | 效果 2 深度 | 0-127 | LSB |
01011101 | 5D | 93 | 效果 3 深度 | 0-127 | LSB |
01011110 | 5E | 94 | 效果 4 深度 | 0-127 | LSB |
01011111 | 5F | 95 | 效果 5 深度 | 0-127 | LSB |
01100000 | 60 | 96 | 数据输入 +1 | 无 | |
01100001 | 61 | 97 | 数据输入 -1 | 无 | |
01100010 | 62 | 98 | 非注册参数号 LSB | 0-127 | LSB |
01100011 | 63 | 99 | 非注册参数号 MSB | 0-127 | MSB |
01100100 | 64 | 100 | * 注册参数号 LSB | 0-127 | LSB |
01100101 | 65 | 101 | * 注册参数号 MSB | 0-127 | MSB |
01100110 | 66 | 102 | 未定义 | ? | |
01100111 | 67 | 103 | 未定义 | ? | |
01101000 | 68 | 104 | 未定义 | ? | |
01101001 | 69 | 105 | 未定义 | ? | |
01101010 | 6A | 106 | 未定义 | ? | |
01101011 | 6B | 107 | 未定义 | ? | |
01101100 | 6C | 108 | 未定义 | ? | |
01101101 | 6D | 109 | 未定义 | ? | |
01101110 | 6E | 110 | 未定义 | ? | |
01101111 | 6F | 111 | 未定义 | ? | |
01110000 | 70 | 112 | 未定义 | ? | |
01110001 | 71 | 113 | 未定义 | ? | |
01110010 | 72 | 114 | 未定义 | ? | |
01110011 | 73 | 115 | 未定义 | ? | |
01110100 | 74 | 116 | 未定义 | ? | |
01110101 | 75 | 117 | 未定义 | ? | |
01110110 | 76 | 118 | 未定义 | ? | |
01110111 | 77 | 119 | 未定义 | ? | |
01111000 | 78 | 120 | 关闭所有声音 | 0 | |
01111001 | 79 | 121 | * 重置所有控制器 | 0 | |
01111010 | 7A | 122 | 本地控制开/关 | 0=关 | 127=开 |
01111011 | 7B | 123 | * 关闭所有音符 | 0 | |
01111100 | 7C | 124 | Omni模式关(包括所有音符关闭) | 0 | |
01111101 | 7D | 125 | Omni模式开(包括所有音符关闭) | 0 | |
01111110 | 7E | 126 | Poly模式开/关(包括所有音符关闭) | ** | |
01111111 | 7F | 127 | Poly模式开(包括mono=关 +所有音符关闭) | 0 |
* 为符合通用 MIDI 1 级标准,设备必须对此进行响应。
** 等于通道数,如果通道数等于接收器中的声部数则为零。
附录 1.3 - MIDI 音符编号表
此表按八度列出所有 MIDI 音符编号。
绝对八度号的指定基于 C4 为中音 C,这是一个任意但广泛使用的约定。
八度 # | 音符编号 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
C | C# | D | D# | E | F | F# | G | G# | A | A# | B | |
-1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
0 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
1 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
2 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
3 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
4 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
5 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |
6 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
7 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 |
8 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 |
9 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |
附录 1.4 - 通用 MIDI 乐器音色映射
- 乐器名称指示在通用 MIDI 合成器上选择该乐器编号(MIDI 程序更改或“PC#”)时将听到的音色。
- 除第 10 通道外,所有 MIDI 通道的音色相同,第 10 通道仅有打击乐和一些音效。(参见附录 1.5 - 通用 MIDI 打击乐键位映射)
GM 乐器家族
通用 MIDI 乐器音色按家族分类。每个家族包含 8 个特定乐器。
PC# | 家族 | PC# | 家族 |
---|---|---|---|
1-8 | 钢琴 | 65-72 | 簧乐器 |
9-16 | 色彩打击乐 | 73-80 | 管乐器 |
17-24 | 风琴 | 81-88 | 合成主音 |
25-32 | 吉他 | 89-96 | 合成铺底音 |
33-40 | 低音 | 97-104 | 合成效果音 |
41-48 | 弦乐器 | 105-112 | 民族乐器 |
49-56 | 合奏 | 113-120 | 打击乐器 |
57-64 | 铜管乐器 | 121-128 | 声音效果 |
GM 乐器音色映射
注意:尽管通用 MIDI (GM) 并未定义任何音色的具体特性,但在合成器主音、铺底音和音效后括号中的名称仅作为指导。
PC# | 乐器 | PC# | 乐器 |
---|---|---|---|
1. | 原声大钢琴 | 65. | 高音萨克斯 |
2. | 明亮原声钢琴 | 66. | 中音萨克斯 |
3. | 电钢琴 | 67. | 次中音萨克斯 |
4. | 酒吧钢琴 | 68. | 低音萨克斯 |
5. | 电钢琴 1(Rhodes 钢琴) | 69. | 双簧管 |
6. | 电钢琴 2(合唱钢琴) | 70. | 英国管 |
7. | 羽管键琴 | 71. | 巴松 |
8. | 击弦古钢琴 | 72. | 单簧管 |
9. | 钢片琴 | 73. | 短笛 |
10. | 钟琴 | 74. | 长笛 |
11. | 音乐盒 | 75. | 竖笛 |
12. | 颤音琴 | 76. | 排笛 |
13. | 马林巴琴 | 77. | 吹瓶声 |
14. | 木琴 | 78. | 尺八 |
15. | 管钟 | 79. | 哨声 |
16. | 扬琴 | 80. | 陶笛 |
17. | 拉杆风琴(汉蒙德风琴) | 81. | 主音 1(方波) |
18. | 击打风琴 | 82. | 主音 2(锯齿波) |
19. | 摇滚风琴 | 83. | 主音 3(蒸汽风琴) |
20. | 教堂风琴 | 84. | 主音 4(管风琴音) |
21. | 簧风琴 | 85. | 主音 5(查兰音) |
22. | 手风琴(法国手风琴) | 86. | 主音 6(人声独唱) |
23. | 口琴 | 87. | 主音 7(五度音) |
24. | 探戈手风琴(班多钮手风琴) | 88. | 主音 8(低音 + 主音) |
25. | 原声吉他(尼龙弦) | 89. | 铺底音 1(新世纪幻想音) |
26. | 原声吉他(钢弦) | 90. | 铺底音 2(温暖音) |
27. | 电吉他(爵士) | 91. | 铺底音 3(复音合成) |
28. | 电吉他(清音) | 92. | 铺底音 4(合唱声空间音) |
29. | 电吉他(闷音) | 93. | 铺底音 5(弓弦玻璃音) |
30. | 过载吉他 | 94. | 铺底音 6(金属音) |
31. | 失真吉他 | 95. | 铺底音 7(光环音) |
32. | 吉他和声 | 96. | 铺底音 8(扫掠音) |
33. | 原声低音提琴 | 97. | 效果 1(雨声) |
34. | 电贝斯(指弹) | 98. | 效果 2(音轨音) |
35. | 电贝斯(拨片) | 99. | 效果 3(水晶音) |
36. | 无品低音 | 100. | 效果 4(大气音) |
37. | 拍击贝斯 1 | 101. | 效果 5(明亮音) |
38. | 拍击贝斯 2 | 102. | 效果 6(妖精音) |
39. | 合成贝斯 1 | 103. | 效果 7(回声,水滴) |
40. | 合成贝斯 2 | 104. | 效果 8(科幻,星际主题) |
41. | 小提琴 | 105. | 西塔尔琴 |
42. | 中提琴 | 106. | 班卓琴 |
43. | 大提琴 | 107. | 三味线 |
44. | 低音提琴 | 108. | 古筝 |
45. | 颤弦弦乐 | 109. | 卡林巴 |
46. | 拨弦乐 | 110. | 风笛 |
47. | 管弦竖琴 | 111. | 小提琴 |
48. | 定音鼓 | 112. | 筝 |
49. | 弦乐合奏 1(弦乐) | 113. | 铃铛 |
50. | 弦乐合奏 2(慢弦) | 114. | 阿哥戈鼓 |
51. | 合成弦乐 1 | 115. | 钢鼓 |
52. | 合成弦乐 2 | 116. | 木鱼 |
53. | 合唱“啊”声 | 117. | 太鼓 |
54. | 人声“喔”声 | 118. | 音调鼓 |
55. | 合成声乐 | 119. | 合成鼓 |
56. | 管弦乐打击声 | 120. | 倒钹声 |
57. | 小号 | 121. | 吉他品噪音 |
58. | 长号 | 122. | 呼吸声 |
59. | 大号 | 123. | 海浪声 |
60. | 闭塞小号 | 124. | 鸟鸣声 |
61. | 法国号 | 125. | 电话铃声 |
62. | 铜管乐段 | 126. | 直升机音 |
63. | 合成铜管乐 1 | 127. | 鼓掌声 |
64. | 合成铜管乐 2 | 128. | 枪声 |
附录 1.5 - 通用 MIDI 打击乐键位映射
在 MIDI 通道 10 上,每个 MIDI 音符编号(“键号”)对应不同的打击乐音效,如下所示。GM 兼容的乐器必须在所示键位上具有这些音效。虽然许多现代乐器在所示范围之外还包含额外的音效,并可能具有不同的“套件”提供这些音效的变体,但通用 MIDI 仅支持以下音效。
键号 | 音符 | 打击乐音效 | 键号 | 音符 | 打击乐音效 |
---|---|---|---|---|---|
35 | B1 | 原声低音鼓 | 59 | B3 | 2 号吊镲 |
36 | C2 | 低音鼓 1 | 60 | C4 | 高邦戈鼓 |
37 | C#2 | 边击 | 61 | C#4 | 低邦戈鼓 |
38 | D2 | 原声军鼓 | 62 | D4 | 闷音高康加鼓 |
39 | D#2 | 掌声 | 63 | D#4 | 开音高康加鼓 |
40 | E2 | 电子军鼓 | 64 | E4 | 低康加鼓 |
41 | F2 | 低音地嗵鼓 | 65 | F4 | 高提巴勒鼓 |
42 | F#2 | 闭合踩镲 | 66 | F#4 | 低提巴勒鼓 |
43 | G2 | 高音地嗵鼓 | 67 | G4 | 高阿哥戈鼓 |
44 | G#2 | 踏板踩镲 | 68 | G#4 | 低阿哥戈鼓 |
45 | A2 | 低嗵鼓 | 69 | A4 | 卡巴萨 |
46 | A#2 | 开音踩镲 | 70 | A#4 | 沙锤 |
47 | B2 | 中低嗵鼓 | 71 | B4 | 短哨 |
48 | C3 | 高中嗵鼓 | 72 | C5 | 长哨 |
49 | C#3 | 1 号碎镲 | 73 | C#5 | 短刮瓜 |
50 | D3 | 高嗵鼓 | 74 | D5 | 长刮瓜 |
51 | D#3 | 1 号吊镲 | 75 | D#5 | 梆子 |
52 | E3 | 中式镲 | 76 | E5 | 高木鱼 |
53 | F3 | 铃铛 | 77 | F5 | 低木鱼 |
54 | F#3 | 铃鼓 | 78 | F#5 | 闷音奎卡鼓 |
55 | G3 | 水花镲 | 79 | G5 | 开音奎卡鼓 |
56 | G#3 | 牛铃 | 80 | G#5 | 闷音三角铁 |
57 | A3 | 2 号碎镲 | 81 | A5 | 开音三角铁 |
58 | A#3 | 震动器 |
附录 2 - 程序片段与 MIDI 文件示例
以下是一些用于读取和写入 MIDI 文件中可变长度数字的例程。这些例程用 C 语言编写,使用 getc
和 putc
,它们分别从输入文件和输出文件中读取和写入单个 8 位字符。
WriteVarLen(value)
register long value;
{
register long buffer;
buffer = value & 0x7f;
while((value >>= 7) > 0)
{
buffer <<= 8;
buffer |= 0x80;
buffer += (value & 0x7f);
}
while (TRUE)
{
putc(buffer, outfile);
if (buffer & 0x80) buffer >>= 8;
else
break;
}
}
doubleword ReadVarLen()
{
register doubleword value;
register byte c;
if ((value = getc(infile)) & 0x80)
{
value &= 0x7f;
do
{
value = (value << 7) + ((c = getc(infile)) & 0x7f);
} while (c & 0x80);
}
return(value);
}
以下是一个示例,MIDI 文件中包含该代码片段的内容。首先是格式 0 文件,所有信息交织在一起;然后是格式 1 文件,其中所有数据分为四个轨道:一个用于节奏和拍号,三个用于音符。示例使用每四分音符 96 个“滴答”的分辨率。4/4 拍和 120 拍每分钟的速度虽然是隐含的,但被明确表示。
以下是该示例中 MIDI 流内容的详细说明:
时间差 (十进制) | 事件代码 (十六进制) | 其他字节 (十进制) | 注释 |
---|---|---|---|
0 | FF 58 | 04 04 02 24 08 | 4 字节;4/4 拍;24 个 MIDI 时钟/点击,8 个 32 分音符/24 个 MIDI 时钟 (24 个 MIDI 时钟 = 1 叉子音符 = 1 拍) |
0 | FF 51 | 03 500000 | 3 字节:500,000 微秒/四分音符 = 120 拍/分钟 |
0 | C0 | 5 | 通道 1 程序变更 5 = GM 乐器 6 = 电钢琴 2 |
0 | C1 | 46 | 通道 2 程序变更 46 = GM 乐器 47 = 竖琴 |
0 | C2 | 70 | 通道 3 程序变更 70 = GM 乐器 71 = 巴松管 |
0 | 92 | 48 96 | 通道 3 音符打开 C3,强音 |
0 | 92 | 60 96 | 通道 3 音符打开 C4,强音 |
96 | 91 | 67 64 | 通道 2 音符打开 G4,中强音 |
96 | 90 | 76 32 | 通道 1 音符打开 E5,轻音 |
192 | 82 | 48 64 | 通道 3 音符关闭 C3,标准音 |
0 | 82 | 60 64 | 通道 3 音符关闭 C4,标准音 |
0 | 81 | 67 64 | 通道 2 音符关闭 G4,标准音 |
0 | 80 | 76 64 | 通道 1 音符关闭 E5,标准音 |
0 | FF 2F | 00 | 轨道结束 |
以下是格式 0 MIDI 文件的完整内容(十六进制表示)。首先是头块:
4D 54 68 64 | MThd |
00 00 00 06 | 块长度 |
00 00 | 格式 0 |
00 01 | 一个轨道 |
00 60 | 每四分音符 96 个滴答 |
然后是轨道块。其头部后接事件(在某些地方使用了运行状态):
4D 54 72 6B | MTrk |
00 00 00 3B | 块长度 (59) |
时间差 | 事件 | 注释 |
---|---|---|
00 | FF 58 04 04 02 18 08 | 拍号 |
00 | FF 51 03 07 A1 20 | 速度 |
00 | C0 05 | |
00 | C1 2E | |
00 | C2 46 | |
00 | 92 30 60 | |
00 | 3C 60 | 运行状态 |
60 | 91 43 40 | |
60 | 90 4C 20 | |
81 40 | 82 30 40 | 两字节时间差 |
00 | 3C 40 | 运行状态 |
00 | 81 43 40 | |
00 | 80 4C 40 | |
00 | FF 2F 00 | 轨道结束 |
格式 1 文件的表示方式略有不同。其头块如下:
4D 54 68 64 | MThd |
00 00 00 06 | 块长度 |
00 01 | 格式 1 |
00 04 | 四个轨道 |
00 60 | 每四分音符 96 个滴答 |
第一个轨道块用于时间签名和速度。其头部后接事件:
4D 54 72 6B | MTrk |
00 00 00 14 | 块长度 (20) |
时间差 | 事件 | 注释 |
---|---|---|
00 | FF 58 04 04 02 18 08 | 拍号 |
00 | FF 51 03 07 A1 20 | 速度 |
83 00 | FF 2F 00 | 轨道结束 |
然后是第一个音乐轨道的轨道块。在此示例中使用了音符打开/关闭运行状态的 MIDI 约定:
4D 54 72 6B | MTrk |
00 00 00 10 | 块长度 (16) |
时间差 | 事件 | 注释 |
---|---|---|
00 | C0 05 | |
81 40 | 90 4C 20 | |
81 40 | 4C 00 | 运行状态:音符开启,力度=0 |
00 FF 2F 00 |
第二个音乐轨道的轨道块如下:
4D 54 72 6B | MTrk |
00 00 00 0F | 块长度 (15) |
时间差 | 事件 | 注释 |
---|---|---|
00 | C1 2E | |
60 | 91 43 40 | |
82 20 | 43 00 | 运行状态 |
00 | FF 2F 00 | 轨道结束 |
第三个音乐轨道的轨道块如下:
4D 54 72 6B | MTrk |
00 00 00 15 | 块长度 (21) |
时间差 | 事件 | 注释 |
---|---|---|
00 | C2 46 | |
00 | 92 30 60 | |
00 | 3C 60 | 运行状态 |
83 00 | 30 00 | 两字节时间差,运行状态 |
00 | 3C 00 | 运行状态 |
00 | FF 2F 00 | 轨道结束 |
完。