MIDI Format

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 <格式> 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位二进制数) <-- 长度(= 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 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 <长度> ... 相对于前一个事件的“tick”,是一个可变长度数。 下列之一: · · · 事件 注意:在 和 之间,没有明确的分隔符。这个是因为 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-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 名称 音序或 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 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位二进制数 Footnotes 注意 1 在这种情形 (在 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 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=614980
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值