分享
 
 
 

MIDI 文件格式

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

MIDI 文件格式

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。

有效的格式是: 012

<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 有一个清楚的长度区。

MIDI 事件

MIDI Channel 消息包含:

Channel Voice messages

Channel Mode messages

Running status 通常应用于MIDI文件中的同一状态的表示。Running status 也可以被取消 。

Sysex 事件

(系统高级消息的详细描述)是令人满意的,相对于 MIDI channel 消息。<sysex-data>可以被使用。

Sysex-events 流行两种风格:

Sysex Events

F0 <长度> <sysex-data>

F0 Sysex Event

这个导致 F0(消息的开头) 被发送。接着是<sysex_data>。

<长度>

一个可变长度数,表示 <sysex_data>的长度

<sysex_data>

F0 <sysex_data>

作为 MIDI 消息发送。

F7 <长度> <any-data>

F7 Sysex Event (or 'escape')

这个导致 <any_data>被发送,没有其它的附加数。

<长度>

一个可变长度数,表示 <any_data>的长度

<any_data>

<any_data>

作为 MIDI 消息发送。

在上面的案例中,消息的结束 F7,没有自动的发送。它必须明确的列入 <sysex_data> or <any_data>.中。

大多数系统高级消息非常简单,且作为一个单一的包被发送。开始于 F0 ,结束于 F7 。这个是非常容易的应用于 <sysex_event> 的 F0 形式。

可是,一些系统高级消息习惯于实时控制设备。怎样合成一个存在适当的延时的由一连串的‘零件’组成的系统高级消息。因为,能够深入到事件中中断一个消息,就有一定的延时。这个是可以应用 <sysex_event> 的 F7 形式。

实际上,在 MIDI 流中 F7 Sysex Event 习惯于包含 any_data。例如 MIDI 系统实时消息(尽管它并不令人满意的)。

例 1:

一般的消息:

F0 7E 09 03 01 01 F7

(Sample Dump Request - Device 9, sample number 257)

<sysex_event> 可以:

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 名称

音序或 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-event>(必须包含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 <len> <id> <data>

音序器描述 Meta-event

这个在 MIDI 文件中等同于系统高级事件。

在 MIDI 文件中用这个事件表示制造商音序器统一化的描述。

<长度>

长度 of <id>+<数据> (可变长度数)

<id>

1或3个字节表示制造厂商。

这个值同样的作为 MIDI System Exclusive messages 用。

<数据 >

8位二进制数

Footnotes

注意 1

在这种情形 <division> (在 header chunk) 定义为单位 delta-time 数“1/4音符的 ticks 数” (MSbit=0),一个变化的拍子速度表示一个delta-time 长度的变化。

在这种情形 <division> 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

E_mail:zj_zyq@163.com

2002 年 12 月 28 日

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有