本帖最后由 spainfast 于 15-10-30 18:27 编辑
就拿你这个图作为例子吧
开头的14个字节叫做Head Chunk
开始的四字节 4D 54 68 64是固定的 代表了这是MIDI文件头
后面四个字节00 00 00 06代表头的数据段长有6个字节 也就是紧接下来的6个字节也属于文件头的信息
这六个字节分为三组 第一组表示format类型 有00 01 10三种 分别表示单轨文件、多轨同步和多轨异步
一般默认为01多轨同步, 第二组代表Track的数目,你这个图里面是02代表有两个Tracks,第三组为resolution 分辨率
是指一拍一般是quarter note分割为多少个ticks单位来表示
有两种模式 看最高位是否为1 为0就是默认的ticks分割,为1就是frame分割 这里的最高位为0
0C 00转成10进制就是3072 也就是一个四分音符分割为3072个单位
这个数决定了文件的Delta Time和音符长度的转换
接下来是Track Chunk 也有个固定的四字节头 4D 54 72 6B
接下来4个字节代表了这个Track的数据段长 13代表接下来13个字节的数据都属于这个Track
之后都是Event,每个Event都会以Delta Time开头,这里的00代表Delta Time 00代表事件立刻发生不会有延时
00 FF XX这种形式属于Meta Event,保存了Track的一些字符信息 比如Instrument Name之类的
具体需要查表,比如你这里的00 FF 58 04代表的是Time Signature拍号,后面会跟四个参数
然后以00 FF 2F 结尾 他是Track end事件
Track 02 也是一样的结构 长度0E 7C delta time要换算成ticks才能知道表达多长的音符 它是一种变长值表达,
这里是延时DA 76个单位响应90 note-on控制信息 DA 76 高八位的最高位为1 代表接下来的8位也是Delta time的一部分
低八位76 最高位为0 说明这是这个Event的Delta Time的最后一个字节。换算成Ticks 128*90+118=11638
比上之前的3072 大概在延时3.8个四分音符处开始响应note on信息 音符为3A 也就是58 比60=C低两个半音 A# 力度为16
后面的8D 9C 1F也是Delta Time同样的办法换算就能得出延时多久响应80 note off信号 和note-on信号的时间相减就是音符的长度
后面的全都是这种Event 直到以00 FF 2F结尾代表Track结束