- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MIDI文件格式结构 2
MIDI文件格式结构 2
midi 格式,编程,(1)2006年08月04日 星期五 08:41对于制作midi音乐来说,比播放midi文件本身更复杂得多。我们得了解一些乐理常识和midi文件结构。
一、midi文件结构分析 midi文件包含首部块(header chunk)和音轨块(track chunk)两部分。其格式一般如下:
mthd 数据长度 header数据 //首部块
.......
mtrk 数据长度 track数据 //音轨块
header chunk 结构为:
char midiid[4];
long length;
int foarmt;
int tracknum;
int division;
其中:
midiid称为midi文件头标志,一般将其设置为mthd;
length为文件首部数据长度(除它本身和文件头标志占用的字节以外),通常它设置为6,即format,tracknum和division共占用的字节数据长度;
format表示midi文件存放的格式,当前只有3种格式:
0 表示midi文件只有一个track chunk;
1 表示midi文件只有一个或多个track chunk;
2 表示midi文件只有一个或多个各处独立的track chunk。
division指定计数的方法,一种随时间计数(最高位设置为0时),另一种使用制式的时间码(最高位设置为1时)。这里,主要介绍随时间计数的一种格式。其各位意义如下:
┌─┬─────────┐
│0 │ 每一拍的计数值 │
└─┴─────────┘
b15 b14  ̄ b0
其最高位一定要设置为0,其它的15位表示每一拍的计数值。如该数据为96(以八分音符为一拍),则表示一个四分音符延时数应该为192。
另外,在midi文件中,long和int型数据均将高字节值存放入低地址上,如一个long型数据为0x45678,则在文件中, 存放的结果为:0x00,0x04,0x56,0x78。而在内存中,int,long的变量值通常将崐高字节值存放高地址上。因此,存放数据时,应该作一下调整。
track chunk为用来播放歌曲的数据信息。每一个track chunk是一组简单的midi码(包括一些非midi码)的集合。它又由头部信息和崐若干个mtrk event组合而成。
头部结构和意义为:
char trackchunkid[4]; //track chunk标志mtrk
long trackchunkmsglength; //该track chunk信息长度
而mtrk event是由时间计数值(dela-time)和event(midi码信崐息)组合成的。即:
mtrk event=dela-time event
dela-time使用可变长度的形式存储数据,它代表处理event 之前要计数时间值。 它在音乐中,即表示拍数。通常音乐开始演奏时,总是将计数时间值设置为0。为了能连续处理两个event,我们可以将deta-time设置为0。如:3和5同时演奏2拍(每一拍计数值为24 ),可以设置如下:
deta-time event
0 开始演奏3
0 开始演奏5
48 停止3演奏
0 停止5演奏
event表示midi码信息集,如0x9n表示开始发音,0x8n表示关闭发音等等(下有说明)。
上述的dela-time使用可变长度的形式表示数据值。可变长度形崐式是midi文件中对于大于8位的数据打用的一种存储方式,它把每一个数据定义为7位,剩下的最高位作为数据长度的识别。当这一位为0时,表示数据是最后一个,若为1,则表示还有下一个。
如:数值0x3fff,可变长度形式便为0xff,0x7f;0x4000则应该为0x81,0x80,0x00。此数据的转换可以参阅writelenghttobuf()函数。
二、常见midi码说明
midi码是制定音乐交换的信息码,它使用串行非同步传送,因此数据码是用多码形式。第一个midi码是状态码,剩余的都是数据码,其长度视状态而定。
以下是一些常见的midi码。
1、开始发音(0x9n)
格式为:0x9n note speed
它一共占用3个字节,n表示通道号,取值0-15。midi 可以同时演奏16个通道,用此指定在哪一个通道上发音(以下n相同)。
note表示音高数值,即音阶码值。如c4(中音1)为60,它的取值在0xc和0x6c之间(具体码值,可参考「参考书籍1」)。
speed表示按键时的速度,用此表示音的力度。若没有力度感,可以
文档评论(0)