没有合适的资源?快使用搜索试试~ 我知道了~
嵌入式MIDI文件格式解析设计与实现
5星 · 超过95%的资源 需积分: 9 55 下载量 18 浏览量
2009-02-19
04:04:17
上传
评论
收藏 165KB PDF 举报
温馨提示
试读
20页
建立在嵌入式系统平台上的电子乐谱阅读器可以代替传统纸质乐谱和谱架的组合成为乐谱阅读的理想方式,因此在嵌入式系统上阅读MIDI等文件格式的数字乐谱具有重要的意义。本文详细说明了从一个MIDI文件解析出五线谱信息的全过程,介绍了MIDI文件格式以及在MIDI格式读取的过程中遇到的种种问题的解决方法
资源推荐
资源详情
资源评论
MIDI 文件结构分析及生成方法
从网上找的,已经将用 BC 写的改成了 VC 的,由于对音乐的理解比乐盲还差,对于程序中转
换是否有问题我也不得而知,反正用 VC 生成的 MIDI 文件听起来惨不忍睹。
对于制作 MIDI 音乐来说,比播放 MIDI 文件本身更复杂得多。我们得了解一些乐理常识和
MIDI 文件结构。
一、MIDI 文件结构分析 MIDI 文件包含首部块(Header Chunk)和音轨块(Track Chu
nk)两部分。其格式一般如下:
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 型数据均将高字节值存放入低地址上,如一个 lon
g 型数据为 0x45678,则在文件中,存放的结果为:0x00,0x04,0x56,0x78。而在内存中,i
nt,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 表示按键时的速度,用此表示音的力度。若没有力度感,可以将其设置为 64,若
为 0,表示关闭发音。
如:在第2通道上开始演奏3,则 MIDI 码便为 0x91,63,40。
MIDI 规范还规定,若连续向同一通道上发送多个音,则可以不指出状态码。如上述同
时演奏3,5,MIDI 码便为:0x91,63,40,65,40。
2、关闭发音(0x8n)。
格式:0x8n note speed
说明同上。通常它用 0x9n,note,0 来代替。
3、切换音色(0xcn)。
格式:0xcn,program
program 表示音色代码,0 ̄255 之间,如 Acou Piano 1 (电钢1值为0),Synth B
ass 1(电贝司1值为64)等(详见「参考书籍1」)。
4、设置音量大小
格式:0xbn ,07,size
0xbn,39,size
7,表示设置主音量的高字节值;39 表示设置主音量的低字节值。
5、设置时间记号
格式:0xff 0x58 04 nn dd cc bb
nn 和 dd 直接对应到谱号的数字,dd 使用 2 的指数。如 3/8,则 nn=3,dd=3。cc 是代表
第次节拍器打后的时间是几个 MIDI clock。bb 通常设置为 8 表示多少个 MIDI clock 等于 1
/4 拍。
6、设置演奏速度
格式:0xff 0x51 03 tt tt tt
tt tt tt 表示第一拍定义多少个 Miscro Seconds。它即是用来崐变演奏的速度。
7、写歌词
格式:0xff 0x05 len text
len 表示歌词的长度,text 表示歌词文本码。
8、磁道结束
格式:0xff,0x2f,00
它表示结束点。每外 track chunk 后都应该有此 MIDI 码。
三、MIDI 信息文本文件制作
为了能制成符合规范的 MIDI 文件,我们在此规定 MIDI 信息文本制作格式如下:
[MIDI]
<调号>,<节拍>,<每分钟节拍数>,<音轨个数>
[1]
.....
[n]
....
说明:
1、调号,占用一个字符,必须为 A、B、C、D、E、F、G,否则视为 C 调;
2、节拍,取值如下:2/4,3/4,4/4,3/8,6/8....等。
3、每分钟节拍数:表示每分钟演奏的节拍总数,取值在 40-200 崐之间,否则视为 12
0。
4、音轨个数表示此歌曲声部数。如三声部,可将其设置为 3。
5、[n]后表示此音轨的音乐信息。有如下说明字符组合而成。
音高:
剩余19页未读,继续阅读
资源评论
- 一世殇情2018-09-29讲解很详细,可以参考
- a4711994622013-04-23注释很详细,不错
addy8848
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 简单的SAR成像matlab代码
- cutcamera1699880194026.png
- 1999-2022年各省城镇居民人均消费支出数据(无缺失).xls
- 药店销售管理系统ssm(药品销售)【说明】资源来源网络以及部分开源社区、仅供参考与学习、项目不可商用、一切后果由使用者承担、若
- DHT11 (2)(2).apk
- 基于JSP毕业设计-学生管理系统-毕业设计.zip
- HTML+CSS+JS精品网页模板H111.rar
- 人工智能:python+OpenCV实现视频跟踪流水线缺陷检测识别
- 2005-2022年各省居民人均消费支出数据(无缺失).xlsx
- HTML+CSS+JS精品网页模板H110.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功