MIDI文件研究

来源:互联网 发布:网络注册营业执照 编辑:程序博客网 时间:2024/06/18 02:45

MIDI的相关资料在midi.org网站有下载,基本上最有用的是2个:

standard midi file format spec 1.1.pdf (记不清是不是有PDF,也许是网页直接打开,可以把它保存为PDF,方便随时查看)

midi message table.pdf

基本上把这2个文件看懂,就可以掌握MIDI的播放控制了。

在MIDI文件格式里面,有以下内容:

0--introduction 

1 - Sequences, Tracks, Chunks: File Block Structure1.1 - Variable Length Quantity
1.2 - Files
1.3 - Chunks

1.4 - Chunk Types2 - Chunk Descriptions

2.1 - Header Chunks
2.2 - MIDI File Formats 0,1 and 22.3 - Track Chunks

3 - Meta-Events
3.1 - Meta Event Definitions

Appendix 1- MIDI Messages
Appendix 1.1- Table of Major MIDI Messages
Appendix 1.2- Table of MIDI Controller Messages (Data Bytes)Appendix 1.3- Table of MIDI Note Numbers
Appendix 1.4- General MIDI Instrument Patch Map
Appendix 1.5- General MIDI Percussion Key Map

Appendix 2- Program Fragments and Example MIDI Files 


在第一章里,主要讲文件头的格式,这部分很好理解,可以同时用ue打开一个MIDI文件进行对比,很容易识别出文件头各个字节的意义。

对于变长数量的概念,一开始不太习惯,但自己计算一,二次就能理解了,这样的设计是为了尽可能减少传输的字节数,当接收设备识别到最高位为1的时候,就会知道后面还有一个字节的数据进来,而每次进来的数据只会用它的低7位来表示,所以一个字节能表示0--127,2个字节能表示2的14次方,3个字节能表示21位,最大可以用到4个字节,也就是28个位的二进制数。

chunk就是数据块的意思,我们一般叫轨道,就是有一个header tag,然后有个长度,然后就跟一堆数据,这些数据的长度是可变的。一般MIDI有一个头类型的轨道,然后跟着内容轨道,有可能有1个,也可能多个。这是在header chunk里面定义,header chunk是最简单的,因为它的长度是固定的,而且它的内容很简单,只有6个字节,第一个是格式,MIDI的格式有3种,分别是0,1,2.格式0的文件只有一个轨道,文件1可以有16个轨道。格式2没有研究过。然后是轨道数。然后是一个叫tick的值,它表示一个四分音符里面包含多少个tick。有时候这个里面不是tick,如果最高位是1的情况下,它采用的是另一种表示时间的方式,这种情况我还没有见到过。

要理解MIDI,还需要懂一些音乐知识。首先关于这个四分音符的概念,音符分根据它的时间长短,一般分为全音符,半音符,四分之一音符和1/8音符,这些音符不同之处就是他们占用的时间不同,一般一个全音符会占用2秒,然后1/4音符就会占用0.5秒。然后刚才说那个tick就是对时间的计算方式,它把一个音符细分成一些小的时间粒度,通常我们看到的MIDI定义的tick值为120.也就是说在描述某个音符的时间时,可以精确到一个音符的1/120,如果假设一个音符为0.5秒的情况下,一个tick值代表的时间大约是4ms。

但是现在我们还有一个问题没有解决,就是一个四分音符具体是不是永远都是0.5秒呢?在MIDI的规范里,是可变的,是需要在第一个轨道的开始时就定义好的,如果没有定义,我们也要设置一个默认值。有些文件会在文件的多个地方定义这个值,它要求在音乐进行到某个阶段时动态地挑整这个参数。这个参数在MIDI里面名为tempo值。tempo值通常由3个字节构成。它代表的是一个1/4音符有多少us。

我刚开始把tick和beat per minute搞混了,一开始我以为在header里面定义的ticks数就是每一分钟里面包含多少个1/4音符,其实BPM是由tempo值决定,因为知道一个1/4音符占用多少us,就可以计算出一分钟里面包含多少个1/4音符。


然后下面讲一下MIDI的一些主要命令:

通常MIDI的命令最高位都是1,一般一个命令之前会有一个时间值,这个叫delta time,也就是距离上一个命令的时间差,或者差了多少个ticks,因为MIDI最小时间粒度是tick,而不是我们常用的秒。而且这个时间表达时用多少个字节是不固定的,按照变长度值的方式来表示,也就是说如果你看到一个像0x76这样的数,因为它的最高位不是1,所以这个值只有一个字节。而如果你遇到一个0x87这样的,那么你需要继续取下一个,然后把2者合起来,假设下一个的最高位还是1,那么就要取第三个,甚至第四个。

MIDI的命令在开始提到的2个文档中都有详细介绍,这里只讲一下个人体会比较深的:

80,81,82---8e

这些是关闭音符的命令,注意其中低4位表示MIDI的通道,MIDI通常有16个通道,每一个通道有一种乐器,每个乐器可以输出128种音符,然后可以有128种力度。注意一种乐器可以同时输出多个音符,就像我们弹钢琴一样,可以用3个手指同时按下,同样,释放的时候也可以只放开其中一个。这就是为什么在关闭音符的时候也要指出具体关闭哪个音符,而不能只告诉系统关闭通道。

90,91,9n

这些是打开音符的命令,后面同样跟2个参数,就是音符和力度。需要注意的是,为了节约字节,当对某个通道要连续进行打开音符操作的时候,可以把第一个命令字节省略,也就是如果看到:

90 40 50 00 50 60 00时,意思是首选执行

90 40 50

00代表时间差

然后又是90 50 60

这样对于那些需要同时输出多个音符的情况是比较省事。


a0,a1,a2,这些是跟按键的复调有关,还没有细看


b0,bx,也是比较难理解的,有些重要的用途就是能把所有声音关闭,或者调节音量,还有一些调节踏板,滚轮,推子之类的


cx,改变音色,一开始我不知道program有音色的意思,所以总是不理解。


dx  跟 ax有点关系,但又不一样


ex pitch轮子


f--以f开头的命令是系统命令,包括歌词,各种文本,版权信息,chunk结束点,tempo值的设定,时间标记,key标记,

我们最常用的是MIDI的歌词,通常MIDI的歌词是有一个独立的轨道,但这个轨道往往也会夹带一些音符,只是这些音符通常都不发出声音。歌词最重要一个是它的文本,第二重要是它保护的对于的时间点,因为要在正确的时间呈现出来。

然后MIDI的tempo值也很重要,它决定我们要以什么样的节奏来播放这个曲子。

然后是时间标记,这里面也涉及到一些音乐概念。最常见的时间标记是4/4,其中做分子的4表示一个小节里面有4个音符,而做分母的那个4表示每个音符是1/4音符的长度。最典型的例子是欢乐颂。在5线谱里面,1/4用实心圆圈来表示��,类似于这样。每个小节之间会用竖线分割,我们会看到每个小节里面有4个这样的音符。

假如时间标记是3/4的话,那就表示每个小节里面有3个音符,然后每个音符是1/4音符的长度。

如果是6/8,就会有每个小节有6个音符,每个音符是1/8音符长度,1/8音符是在1/4音符的基础上带一个尾巴。1/8音符因为时间短,往往节奏会比较快,变化多,当然也要结合它的tempo值。


音调标记:

音调是一个乐谱里面采用的基准音调,在五线谱里面会在开始的地方注明,最常见的是C大调,它的意思是这首曲的do音在中央C这个键。然后以此类推,re音在D,mi ,fa ,so,la,si分别在E,F,G,A,B这些白键上面。

我以前一直以为do音必须在C键,后来知道了半音和全音之后,才知道,其实do音可以在任何键,只是如果do音不在C的情况下,要想发出re,mi,fa,so,la这些音的时候不能只用白键,而是要在适当的地方用黑键。

还有一点容易搞错的就是,不要把C大调和弦和C大调音阶搞混了,C大调和谐指的是同时按下C,E,G三个key,因为中间的E和根音C隔了2个全音,所以发出的声音很明亮,欢快。而如果把E换成Eb,就会变成C minor chord,听起来就会很沉闷,忧郁的感觉。但是C大调音阶更多的是指一首曲子的频域活动范围。

我之前还有一个疑问,对于C major chord而言,C和E之间的音程是2个全音,可是为什么E,G之间并未相隔2个full note?但是我确认major chord只要求root note和3rd note符合2个full note的要求,并没有规定3rd note和5th note要有2个full note。



在MIDI的通道10根别的通道有点不一样,这个是专门用来控制打击乐器的,而每个表示音符的位置表示一种打击乐器,打击乐器的列表在文档里面有说明。我开始想不通对于格式0的文件只有一个音频轨道怎么办?后来我明白轨道跟通道是不同的概念,其实轨道也就是chunk,可以控制任何通道,轨道可以只有1个,或者5个,16个,有的可能超过16个,但通道就只有16个。




0 0
原创粉丝点击