MIDI 文件格式
MIDI 文件结构
Chunks
MIDI 文件由 chunks 组成:XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
每个chunk 的组成:
类型
长度
数据
4 字节
4 字节
(前面规定的)长度
- A 4-字节 chunk 类型 (ASCII)
- A 4-byte 长度(32 位, msb first)
- (前面规定的)长度数据
有两种类型的 chunks :
Header Chunks
有一个chunk标志“MThd”
Track Chunks
有一个chunk标志“MTrk”
一个 MIDI文件由一个header chunk和紧接的一个或多个track chunks组成。
在chunks结构中,自长度区以后是严格规定好的。它可能容纳的chunks除了“MThd”或“MTrk”其它的将被忽略。MIDI说明书要求软件能够处理意想不到的chunk,并忽略掉整个chunk。
类型
长度
数据
MIDI
文件
:
MThd
6
MTrk
...
:
MTrk
...
数值表示法
在MIDI 文件中,除了基本的MIDI数据,还有一个变化的数据(类型)。如: delta-times 和 meta-events。
这里有一些关于这样的数的一些资料,它们有通常有下面1~2种格式:
二进制数
二进制数的存贮:
- 每个字节8位
- MSB first (最左方的字节权(或数位)大)
(除非其它的描述)
可变长度数
这个可变长度数是为了方便表示任意大的整数,而不必创建固定宽度的整数。
一个可变长度数被表示为连续的7位数据。从最高位到最低位,最后一个字节bit7等于0,前面的字节bit7等于1。
例:
数
可变长度数
十进制
十六进制
二进制
二进制
十六进制
-
abcd
aaaabbbbccccdddd
100000aa 1aabbbbc 0cccdddd
-
0
:
127
00
:
7F
0000 0000
:
0111 1111
0000 0000
:
0111 1111
00
:
7F
128
:
16383
80
:
3FFF
00000000 10000000
:
00111111 11111111
10000001 00000000
:
11111111 01111111
81 00
:
FF 7F
1000
03E8
11 1110 1000
10000111 01101000
87 68
100000
0F4240
1111 0100 0010 0100 0000
10111101 10000100 01000000
BD 84 40
如此,你可以从上面的例子发现:小的数(0~127)可以用一个字节表示。而(比较)大的数也可以表示出来。
在MIDI 文件中,最大的数是0FFF,FFFF。这个规定了可变长度数允许利用32位整数。
Header Chunks
Header chunk 数据部分包括3个16位(数据)区。这个区域描述:( MIDI 文件)格式、track 的数量和 MIDI 的时间设置。
Header chunk的长度是6个字节。无论如何软件必须遵循这个原则。即使它大于预期的,任何意料外的数据被忽略。
Header Chunk
Chunk 类型
长度
数据
4 字节
(ASCII)
4 字节
(32位二进制数)
16位
16位
16位
MThd
Chunk数据部分的长度。
这是一个32位二进制数, MSB first.
这在 MIDI 1.0文件说明书中规定为6。不过,考虑到将来的扩充,(希望)任何MIDI文件的作者能够应付大的Header chunks。
MIDI 文件的格式。
这是 一个16位二进制数, MSB first。
有效的格式是: 0、 1 和 2 。
MIDI 文件中track chunk的数量。
这是 一个16位二进制数, MSB first。
这个定义在MIDI 文件中(一个)单位的 delta-time数。
这是 一个16位二进制数, MSB first。
有下列两者之一的的格式,依赖于最高位值。
位:
15
14 ... 8
7 ... 0
0
1/4音符tick数
1
-帧/秒
ticks / 帧
bit 15 = 0:
bits 0-14
每个1/4音符的 delta-time 数。
bit 15 = 1:
bits 0-7
每个 SMTPE 帧的 delta-time 数。
bits 8-14
负数,表示每秒中SMTPE 帧的数量。有效数应符合MTC Quarter Frame消息。
-24 = 24 帧/秒
-25 = 25 帧/秒
-29 = 30 帧/秒, drop frame
-30 = 30 帧/秒, non-drop frame
MIDI File Formats
MIDI 文件有3种变化:
- 格式 0
…容纳单一的Track。 - 格式1
…容纳一个和多个同步的Track(所有的Track同时播放)。 - 格式2
…容纳一个和多个独立的Track(所有的Track独立播放)。
MIDI 文件格式 0
格式0 MIDI 文件包括一个Header-Chunk 和一个 Track-Chunk。
这个 Track-Chunk 包括所有的音符和节拍消息。
MIDI 文件格式 1
格式1 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,所有的Track同时播放。
格式1 中第一个Track是专用的。它看成“Tempo Map”。它包括所有的 meta-event :拍子记号、拍子、音序/Track 名称、音序号、标记、SMTPE偏移量。在格式1中(这些)将放入在第一个 track 中。
MIDI 文件格式 2
格式2 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,每个Track表现出独立的次序。
Track Chunks
Track chunk 的数据部分由一对和多对 组成。 是必须的,0是有效的 delta-time。
Track Chunk
类型
长度
数据
4 字节
(ASCII)
4 字节
(32位二进制数)
(二进制数)
MTrk
<event> ...
相对于前一个事件的“tick”,是一个可变长度数。
下列之一:
· 事件>
· 事件>
事件
注意:在 和 <event>之间,没有明确的分隔符。这个是因为 delta-times 和event有一个长度定义。
- Delta-time 定义最后一个字节的最高位等于0。
- MIDI Channel 消息有一个长度定义。
- Sysex-events 和 meta-events 有一个清楚的长度区。
MIDI 事件
MIDI Channel 消息包含:
Running status 通常应用于MIDI文件中的同一状态的表示。Running status 也可以被取消 。
Sysex 事件
(系统高级消息的详细描述)是令人满意的,相对于 MIDI channel 消息。可以被使用。
Sysex-events 流行两种风格:
Sysex Events
F0
F0 Sysex Event
这个导致 F0(消息的开头) 被发送。接着是。
一个可变长度数,表示 的长度
F0
作为 MIDI 消息发送。
F7
F7 Sysex Event (or 'escape')
这个导致 被发送,没有其它的附加数。
一个可变长度数,表示 的长度
作为 MIDI 消息发送。
在上面的案例中,消息的结束 F7,没有自动的发送。它必须明确的列入 or .中。
大多数系统高级消息非常简单,且作为一个单一的包被发送。开始于 F0 ,结束于 F7 。这个是非常容易的应用于 的 F0 形式。
可是,一些系统高级消息习惯于实时控制设备。怎样合成一个存在适当的延时的由一连串的‘零件’组成的系统高级消息。因为,能够深入到事件中中断一个消息,就有一定的延时。这个是可以应用 的 F7 形式。
实际上,在 MIDI 流中 F7 Sysex Event 习惯于包含 any_data。例如 MIDI 系统实时消息(尽管它并不令人满意的)。
例 1:
一般的消息:
F0 7E 09 03 01 01 F7
(Sample Dump Request - Device 9, sample number 257)
可以:
F0 06 7E 09 03 01 01 F7
或者交替:
F7 07 F0 7E 09 03 01 01 F7
例 2:
MIDI 系统实时消息“停止”用 F7 01 FC ,当“继续”用 F7 01 FB。
假设:你想停止一个外部设备——鼓,发送一个“停止”,接着48个 delta-time 单元后“继续”。完整的 delta-tem 事件序列象下面这样:
00 F7 01 FC 30 F7 01 FB
Meta 事件
Meta Events 是用来表示象 track 名称、歌词、提示点等,它并不作为 MIDI 消息被发送,但是它仍然是 MIDI 文件的(有用的)组成部分。
Meta Events 的基本形式:
FF
一个字节描述 meta-event 的类型。
可能的范围是 00-7F。 并不是所有的值都在这个范围,但是程序能够应付意想不到的值,并诊断这个长度和忽略预期外的数据部分。
紧跟的数据的长度。
这是一个可变长度(数)。
0 是一个有效
0 或更多的字节数据。
Meta Events
FF 00 02 ss ss
这是一个可选的事件,它只能产生在第一个track,并且在非零时刻之前。
格式2文件中,这个用来识别每个 track,如果忽略,这个序列号从而用 track 出现的次序表示。.
格式1文件中,这个事件只能产生在第一个 track。
ss ss
Sequence Number, 16 bit binary
FF 01
这个事件是用来注释 track 的文本。
独立的8位数据(其它的ASCII文本) 也是允许的。
的长度(可变长度数)
个字节的 ASCII 文本或8位二进制数
FF 02
版本通告
这个事件是用ASCII 文本表示的版权通告。
这个是制定的形式“(C) 1850 J.Strauss”
这个事件用于第一个 track ,第一个事件。
FF 03
音序或 track 的名称。
FF 04
乐器名称
描述这个 track 使用的乐器。
这个用来详细的记述(这个) MIDI channel 在 (这个)track 里使用的乐器。
FF 05
歌词
歌曲的歌词。
通常每个音节都有自己的歌词,在这个时候歌词将被唱起来。
FF 06
通常用于格式0或格式1的第一个 track 。
标记有意义的点(如:“诗篇1”)
FF 07
暗示
用来表示舞台上发生的事情。如:“幕布升起”、“退出,台左”等。
FF 20 01 cc
MIDI Channel 前缀
关联紧跟的 meta-events 和 sysex-events 的 MIDI channel。直到下一个(必须包含MIDI channel 信息)
cc
MIDI channel 1-16
范围: 00-0F
FF 2F 00
Track 结束
这个事件是必须的 。
它用来扫除定义的长度。它的本质信息是这个 track 是循环还是连接另一个 track 。
FF 51 03 tt tt tt
这个设定1/4音符的速度,用微妙表示。这个意味着改变一个 delta-time 的单位长度。 (注意1)
如果没有指出,缺省的速度为 120拍/分。这个相当于 tttttt = 500,000。
tt tt tt
新的拍子,表示1/4音符
24位二进制数
FF 54 05 hh mm ss fr ff
可选择的的事件,描述 track 开始时的 SMTPE 时间。
这个事件必须发生在非零 delta-time之前,且在第一个事件之前。
在格式1中,这个事件必须在第一个 track 中(the tempo map)。
hh mm ss fr
小时/分/秒/帧 用 SMTPE 格式。
这个必须与消息 MIDI Time Code Quarter Frame 一致 (细节, 时间编码必须介绍 hh)
ff
Fractional frame, in hundreth's of a frame
FF 58 04 nn dd cc bb
拍子记号的形式:
nn/2^dd
如: 6/8 用 nn=6,dd=3 表示。
这个参数 cc 是表示每个 MIDI 时钟的节拍器的 tick 数目。
通常24 个 MIDI 时钟为一个1/4音符。可是一些软件允许用户自己设置这个值。参数 bb 定义:24 MIDI 时钟(这个“一般”(表示)1/4音符)中 1/32音符的数目。
nn
拍子记号,分子
dd
拍子记号,分母表示为 2 的(dd次)冥。
例:一个分母 4 用 dd=2 表示。
cc
每个 MIDI 时钟节拍器的 tick 数目。
bb
24个MIDI时钟中1/32音符的数目(8是标准的)。
FF 59 02 sf mi
音调符号
音调符号,表示升调或降调值,大调或小调的标志。
0 表示 C 调,负数表示“降调”,正数表示“升调”。
sf
升调或降调值
-7 = 7 升调
0 = C 调
+7 = 7 降调
mi
0 = 大调
1 = 小调
FF 7F
音序器描述 Meta-event
这个在 MIDI 文件中等同于系统高级事件。
在 MIDI 文件中用这个事件表示制造商音序器统一化的描述。
长度 of + (可变长度数)
1或3个字节表示制造厂商。
这个值同样的作为 MIDI System Exclusive messages 用。
8位二进制数
Footnotes
在这种情形 (在 header chunk) 定义为单位 delta-time 数“1/4音符的 ticks 数” (MSbit=0),一个变化的拍子速度表示一个delta-time 长度的变化。
在这种情形 MSbit=1,“ticks”表示一个绝对术语( ticks/frame 和 frames/second),他没有说明书中消失,将影响一种新的tempo的应用。。
midi_modes.html
Contents
midi_control_change.html
midi_channel_mode.html
Please note this Disclaimer
翻 译:zj_zyq
Mailto:E_mail:zj_zyq@163.com">E_mail:zj_zyq@163.com
2002 年 12 月 28 日
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-996723/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10752043/viewspace-996723/