MIDI 文件结构Chunks MIDI 文件由 chunks 组成: 每个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。
| <---Chunk---> |
| 类型 | 长度 | 数据 | MIDI 文件 : | MThd | 6 | <格式> | <tracks> | <division> | MTrk | <长度> | <delta_time> <event> ... | : | MTrk | <长度> | <delta_time> <event> ... |
数值表示法 在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位二进制数) | <-- 长度(= 6字节) --> | 16位 | 16位 | 16位 | MThd | <长度> | <格式> | <tracks> | <division> |
<长度> Chunk数据部分的长度。 这是一个32位二进制数, MSB first. 这在 MIDI 1.0文件说明书中规定为6。不过,考虑到将来的扩充,(希望)任何MIDI文件的作者能够应付大的Header chunks。 <格式> MIDI 文件的格式。 这是 一个16位二进制数, MSB first。 有效的格式是: 0、 1 和 2 。 <tracks> MIDI 文件中track chunk的数量。 这是 一个16位二进制数, MSB first。 <division> 这个定义在MIDI 文件中(一个)单位的 delta-time数。 这是 一个16位二进制数, MSB first。 有下列两者之一的的格式,依赖于最高位值。
位: | 15 | 14 ... 8 | 7 ... 0 | <division> | 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 的数据部分由一对和多对 <delta-time> <event> 组成。 <delta-time>是必须的,0是有效的 delta-time。
Track Chunk | 类型 | 长度 | 数据 | 4 字节 (ASCII) | 4 字节 (32位二进制数) | <-- 长度--> (二进制数) | MTrk | <长度> | <delta-time> <event> ... |
<delta-time> 相对于前一个事件的“tick”,是一个可变长度数。 <event> 下列之一: · <midi 事件> · <sysex 事件> · <meta 事件> 事件 注意:在 <delta-time> 和 <event>之间,没有明确的分隔符。这个是因为 delta-times 和event有一个长度定义。 - Delta-time 定义最后一个字节的最高位等于0。
- MIDI Channel 消息有一个长度定义。
- Sysex-events 和 meta-events 有一个清楚的长度区。
|