首页 > 应用开发 > IT综合 > MIDI 文件格式 (转)
MIDI 文件由 chunks 组成:XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
每个chunk 的组成:
类型
长度
数据
4 字节
4 字节
(前面规定的)长度
有两种类型的 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
<格式>
MTrk
<长度>
:
MTrk
<长度>
在MIDI 文件中,除了基本的MIDI数据,还有一个变化的数据(类型)。如: delta-times 和 meta-events。
这里有一些关于这样的数的一些资料,它们有通常有下面1~2种格式:
二进制数的存贮:
(除非其它的描述)
这个可变长度数是为了方便表示任意大的整数,而不必创建固定宽度的整数。
一个可变长度数被表示为连续的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 chunk 数据部分包括3个16位(数据)区。这个区域描述:( MIDI 文件)格式、track 的数量和 MIDI 的时间设置。
Header chunk的长度是6个字节。无论如何软件必须遵循这个原则。即使它大于预期的,任何意料外的数据被忽略。
Header Chunk
Chunk 类型
长度
数据
4 字节
(ASCII)
4 字节
(32位二进制数)
<-- 长度(= 6字节) -->
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 文件有3种变化:
格式0 MIDI 文件包括一个Header-Chunk 和一个 Track-Chunk。
这个 Track-Chunk 包括所有的音符和节拍消息。
格式1 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,所有的Track同时播放。
格式1 中第一个Track是专用的。它看成“Tempo Map”。它包括所有的 meta-event :拍子记号、拍子、音序/Track 名称、音序号、标记、SMTPE偏移量。在格式1中(这些)将放入在第一个 track 中。
格式2 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,每个Track表现出独立的次序。
Track chunk 的数据部分由一对和多对
Track Chunk
类型
长度
数据
4 字节
(ASCII)
4 字节
(32位二进制数)
<-- 长度-->
(二进制数)
MTrk
<长度>
相对于前一个事件的“tick”,是一个可变长度数。
下列之一:
·
· 事件>
注意:在
MIDI Channel 消息包含:
Running status 通常应用于MIDI文件中的同一状态的表示。Running status 也可以被取消 。
(系统高级消息的详细描述)是令人满意的,相对于 MIDI channel 消息。
Sysex-events 流行两种风格:
Sysex Events
F0 <长度>
F0 Sysex Event
这个导致 F0(消息的开头) 被发送。接着是
<长度>
一个可变长度数,表示
F0
作为 MIDI 消息发送。
F7 <长度>
F7 Sysex Event (or 'escape')
这个导致
<长度>
一个可变长度数,表示
作为 MIDI 消息发送。
在上面的案例中,消息的结束 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 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 名称
音序或 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。直到下一个
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
SMTPE 偏移量
可选择的的事件,描述 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位二进制数
注意 1
在这种情形
在这种情形
midi_modes.html
Contents
midi_control_change.html
midi_channel_mode.html
Please note this Disclaimer
翻 译:zj_zyq
to:E_mail:zj_zyq@163.com">E_mail:zj_zyq@163.com
2002 年 12 月 28 日
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10752019/viewspace-975877/ ,如需转载,请注明出处,否则将追究法律责任。