




免费预览已结束,剩余18页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MIDI解码实例(my E-MAIL 148398720)/* header chunk */0x4D,0x54,0x68,0x64, /M T H D 0x00,0x00, 0x00,0x06, /the actual header information will always be 6 bytes. 0x00,0x00,/the file format. there are 3 formats:0 - single-track 1 - multiple tracks, synchronous2 - multiple tracks, asynchronous0x00,0x01,/the number of tracks in the midi file.0x00,0x78,/the number of delta-time ticks per quarter note. (delta-time consists of ticks)1.a delta time is the number of ticks, and its MSB is 0. When MSB is 1, it is another format.2.the number of ticks per quarternote 3.the entire delta-time should be at most 4 bytes long. and its MSB is 0. When MSB is 1, it is another format./* track chunks */0x4D,0x54,0x72,0x6B, /M T R K0x00,0x00,0x00,0x57, /the length of the track (not including the track header) in bytes.0x00,0xFF,0x03,/ track name0x08,/ length of name 0x75,0x6E,0x74,0x69,0x74,0x6C,0x65,0x64,0x00,0xFF,0x01,/ text event name0x02,/ length of name0x51,0x51,0x00,0xFF,0x58,0x04,0x04,0x02,0x18,0x08,/ time signature拍子符号0x00,0xFF,0x59,0x02,0x00,0x00,/ key signature音调符号0x00,0xFF,0x51,0x03,0x07,0xA1,0x20,/set tempo (microseconds/quarter note)0x00,0xC0,0x50,0x00,0xB0,0x07,0x78,0x00,0x90,0x5E,0x78,0x0F,0x5E,0x00,/stop 0x90 is omitted because of the same format.0x0F,0x5E,0x78,/play 0x0F,0x5E,0x00,/stop. Here, 0x0F,0x90,0x5E,0x00 does the same work as 0x0F,0x80,0x5E,0x78.0x0F,0x5E,0x78,/play0x0F,0x5E,0x00,0x0F,0x5E,0x78,0x0F,0x5E,0x00,0x0F,0x5E,0x78,0x0F,0x5E,0x00,0x0F,0x5E,0x78,0x0F,0x5E,0x00,0x00,0xFF,0x2F,0x00/the track(consist of midi events).1. a midi event is preceded by a delta-time.2. the midi event will consist of a delta-time and the parameters that would go to the command if it were included.Time = delta-time* tempo/ ticksTime :the cost of the time per quarternote.delta-time :The number of ticks per quarternote will be played, just like 0x0F.tempo :microseconds per quarternote, just like 0x07,0xA1,0x20.ticks :the number of delta-time ticks per quarter note, just like 0x00,0x78.Attention :delta-time is a variable-length encoded value. this format, while confusing, allows large numbers to use as many bytes as they need, without requiring small numbers to waste bytes by filling with zeros. the number is converted into 7-bit bytes, and the most-significant bit of each byte is 1 except for the last byte of the number, which has a msb of 0. this allows the number to be read one byte at a time, and when you see a msb of 0, you know that it was the last (least significant) byte of the number.Addition:/view/7969.htmMIDI 文件格式MIDI 文件结构ChunksMIDI 文件由 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。 类型长度数据MIDI文件: MThd 6 MTrk . : MTrk . 数值表示法在MIDI 文件中,除了基本的MIDI数据,还有一个变化的数据(类型)。如: delta-times 和 meta-events。这里有一些关于这样的数的一些资料,它们有通常有下面12种格式: 二进制数 可变长度数 二进制数二进制数的存贮: 每个字节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 如此,你可以从上面的例子发现:小的数(0127)可以用一个字节表示。而(比较)大的数也可以表示出来。在MIDI 文件中,最大的数是0FFF,FFFF。这个规定了可变长度数允许利用32位整数。Header ChunksHeader 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 frameMIDI File FormatsMIDI 文件有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 ChunksTrack 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 EventsF0 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 FBMeta 事件Meta Events 是用来表示象 track 名称、歌词、提示点等,它并不作为 MIDI 消息被发送,但是它仍然是 MIDI 文件的(有用的)组成部分。Meta Events 的基本形式:FF 一个字节描述 meta-event 的类型。 可能的范围是 00-7F。 并不是所有的值都在这个范围,但是程序能够应付意想不到的值,并诊断这个长度和忽略预期外的数据部分。 紧跟的数据的长度。 这是一个可变长度(数)。 0 是一个有效 0 或更多的字节数据。 Meta EventsFF 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 hundreths of a frame FF 58 04 nn dd cc bb 拍子记号拍子记号的形式:nn/2dd 如: 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文件属于二进制文件,这种文件一般都有如下基本结构: 文件头+数据描述 文件头一般包括文件的类型,因为Midi文件仅以.mid为扩展名的就有0类和1类两种,而大家熟悉的位图文件的格式就更多了,所以才会出现文件头这种东西。 而数据描述部份是主体,我们现在来一起分析它的结构: 在每个Midi文件的开头都有如下内容,它们的十六进制代码为:“4d 54 68 64 00 00 00 06 ff ff nn nn dd dd”。 前四个是ASCII字符“MThd”是用来鉴别是否Midi文件,而随后的四个字节是指明文件头描述部分的字节数,它总是6,所以一定是“00 00 00 06”,以下是剩余部分的含义: 以上就是MIDI文件头了,后面的所有内容都是真正做事的,我们先来看看它的构成。 MIDI的数据是由若干个格式相同的子数据构成的,这些子数据在多音轨的格式中记录了一个轨道的所有信息。多加一个音轨,就简单地把数据追加在前一音轨的后面就可以了,不过不要忘记更改文件头中的nn nn(轨道数)。 先看全局音轨。全局音轨包括歌曲的附加信息(比如标题和版权)、歌曲速度和系统码(Sysx)等内容。 不管是全局音轨还是含有音符的音轨,都以“4D 54 72 6B”开头,它其实是ASCII字符“MTrk”,其后跟着一个4个字节的整数,它标志了该轨道的字节数,这不包括前面的4个字节和本身的4个字节。这一点,我们可以在后面的例子中去理解。 接着就是记录数据的地方了,每一个数据有着相同的结构:时间差+事件。 所谓时间差,指的是前一个事件到该事件的时间数,它的单位是tick(MIDI的最小时间单位)。它的构成比较特殊,这里要用二进制来说明。 一个字节有8位,如果仅使用7位,它可以表示0127这128个数,而剩下的一位,则用来作为标志。如果要表示的数在以上范围,则这个标志为0,这时,一 个7位的字节可以表示0127tick。如果要表示的数超出了这个范围(比如240),则把标志设置成1,然后记录下高7位,剩下的留给下一个字节,在 该例中240可以分解成128*1+112,这里的1就是第一个字节要记录的,加上标志位,应该为10000001,即十六进制的81;而112是下一个 字节记录的,它的十六进制为70:所以要表示240这个时间,要写成81 70。同理,如果要表示65535tick,则可以先计算出65535=1282*3+1281*127+1280*127,然后得出结果:83 FF 7F。由此,我们反过来也可以知道如何确定时间差:只要标志位为0,则表示结束读取时间差。比如82 C0 03表示1282*2+1281*64+1280*3=40963,如果基本时间为120,则有341:043个四分音符。 以这种方式记录整数的字节称为动态字节,它根据记录的整数改变自身的长度,这在后面还要用到,所以必须熟练计算。 看完了这么麻烦的东西,我们再来看个更麻烦的东西:事件。在这些标准的解释后面,我们会通过一些例子来进一步掌握这些内容。 事件大体上可以分为音符、控制器和系统信息这几个种类。对于这些事件,都有统一的表达结构:种类+参数。 对于一个音符,由于它的有效范围是0127,所以直接用007F作为“种类”,可以认为是个音符,比如3C表示中央C。而一个音符的最重要的参数是力度(也叫速度:velocity)。比如,3C 64 表示一个力度为十进制100的中央C音符。 因为一个字节有8位,所以剩余的一位如果置1,再联合其他的7位,则可以表示各种信息。我们暂且无视一个音轨到底是全局的还是用于记录音符的。它们归根结底都是用来记录各种事件的,只不过有些应出现在全局音轨比较合乎逻辑而已。既然这样,我们就可以从下面的表来看事件: 下表中,x表示音轨0F,比如81表示松开第二轨的音符。 下表详细地列出了FF的详细情况,对于字节数由数据决定的情况,表中以“-”表示。对于制作MIDI音乐来说,比播放MIDI文件本身更复杂得多。我们得了解一些乐理常识和MIDI文件结构。一、MIDI文件结构分析 MIDI文件包含首部块(Header Chunk)和音轨块(Track Chunk)两部分。其格式一般如下: MThd /首部块.Mtrk /音轨块Header Chunk 结构为:char MidiId4;long length;intfoarmt;intTrackNum;intdivision;其中:MidiId称为MIDI文件头标志,一般将其设置为MThd;length为文件首部数据长度(除它本身和文件头标志占用的字节以外),通常它设置为6,即format,TrackNum和division共占用的字节数据长度;format表示MIDI文件存放的格式,当前只有种格式: 0 表示MIDI文件只有一个Track Chunk;1 表示MIDI文件只有一个或多个Track Chunk;2 表示MIDI文件只有一个或多个各处独立的Track Chunk。division指定计数的方法,一种随时间计数(最高位设置为时),另一种使用制式的时间码(最高位设置为时)。这里,主要介绍随时间计数的一种格式。其各位意义如下: 0 每一拍的计数值 b15 b14 b0其最高位一定要设置为0,其它的15位表示每一拍的计数值。如该数据为(以八分音符为一拍),则表示一个四分音符延时数应该为192。另外,在MIDI文件中,long和int型数据均将高字节值存放入低地址上,如一个long型数据为0x45678,则在文件中,存放的结果为:0x00,0x04,0x56,0x78。而在内存中,int,long的变量值通常将高字节值存放高地址上。因此,存放数据时,应该作一下调整。Track Chunk为用来播放歌曲的数据信息。每一个Track Chunk是一组简单的MIDI码(包括一些非MIDI码)的集合。它又由头部信息和若干个Mtrk event组合而成。头部结构和意义为: char TrackChunkId4;/Track Chunk标志MTrklong TrackChunkMsgLength;/该Track Chunk信息长度而Mtrk event是由时间计数值(dela-time)和event(MIDI码信息)组合成的。即:= 使用可变长度的形式存储数据,它代表处理event之前要计数时间值。 它在音乐中,即表示拍数。通常音乐开始演奏时,总是将计数时间值设置为0。为了能连续处理两个event,我们可以将deta-time设置为0。如:3和5同时演奏2拍(每一拍计数值为24),可以设置如下: deta-timeevent0 开始演奏0 开始演奏48停止演奏0 停止5演奏event表示MIDI码信息集,如0x9n表示开始发音,0x8n表示关闭发音等等(下有说明)。上述的dela-time使用可变长度的形式表示数据值。可变长度形式是MIDI文件中对于大于位的数据打用的一种存储方式,它把每一个数据定义为位,剩下的最高位作为数据长度的识别。当这一位为0时,表示数据是最后一个,若为,则表示还有下一个。如:数值0x3fff,可变长度形式便为0xff,0x7f;0x4000则应该为0x81,0x80,0x00。此数据的转换可以参阅WriteLenghtToBuf()函数。二、常见MIDI码说明MIDI码是制定音乐交换的信息码,它使用串行非同步传送,因此数据码是用多码形式。第一个MIDI码是状态码,剩余的都是数据码,其长度视状态而定。以下是一些常见的MIDI码。、开始发音(0x9n)格式为:0x9n note speed它一共占用个字节,n表示通道号,取值0-1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司股东对财务管理制度
- 公司菜籽油留样管理制度
- 公司行政部配制管理制度
- 公司访客及门岗管理制度
- 公司财务规范化管理制度
- 公司车辆t停放管理制度
- 写字楼公司卫生管理制度
- 出租车公司人力管理制度
- 分公司专款专用管理制度
- 分公司经营成本管理制度
- 机柜维修维护方案(3篇)
- 静脉治疗指南解读
- 江苏省南通市海安市2025年七年级下学期期末英语试题及答案
- 有限空间作业通风时间专题
- 广东省广州市天河外国语学校2025年七年级英语第二学期期末综合测试模拟试题含答案
- Java EE-形考任务一-国开(LN)-参考资料
- 西安无人机项目商业计划书
- 2025年公务员综合素质能力考试卷及答案
- 化工智能控制技术-形考任务4(预备知识:第十~十三章;分值100分;不需辅导老师评阅)测验-国开-参考资料
- 蚂蚁花呗对大学生消费行为的实证分析
- 储能专业知识考试试题及答案
评论
0/150
提交评论