本文主要参考自 Official MIDI Specifications
每个MIDI文件由一系列 chunk 组成,每个 chunk 的前四个字节为魔数( magic number ),是由四个ASCII字符所组成的类型标识。目前标准格式中已定义的 chunk 类型只有 header 和 track 两种,其魔数分别为 "MThd" 和 "MTrk" ,对于类型未被定义的 chunk 则应该被忽略。
每个 chunk 在其四字符类型之后紧跟一个32位无纤手符号整数,意味这一 chunk 后续将要读入的字节个数,每个 chunk 已经读入的这八个字节不包含在内。
通常来说,一个MIDI文件中首先要存在一个 header chunk ,然后一系列 track chunk 紧随其后,格式大致如下:
在目前的标准中, header chunk 长度固定为14,其由五个部分所组成:
其中 type 固定为 "MThd" , format 、 ntrks 、 division 均为16位,因此 length 固定为 0x00000006 。
format 指定了整个文件的组织结构,在当前的标准下,仅支持 0x0000 、 0x0001 、 0x0002 这三种可能的值。
ntrks 表示整个文件中 track chunk 的总个数,对于 format 为零的文件来说 ntrks 的值总是 0x0001 。
最后的 division 表示了 delta-times 的含义,有 metrical time 和 time-code-based time 这两种形式,这取决于其最高位是否为零。
假如 division 最高位为零,那么就属于 metrical time 形式,这个16位无符号整数的意义为每个雹竖敬四分音符的ticks个数。否则属于 time-code-based time 形式,其低8位表示每帧的ticks个数,高8位为一个8位负数补码,有 -24 、 -25 、 -29 、 -30 这四种可能的值,其意义与 SMPTE 有关,以下内容摘抄自维基百科:
在这里可以发现,凭借 division 是完全不足以描述每个时间间隔的实际长度的。在规范中对此有所说明,在默认情况下,乐曲的节奏为4/4拍,速度为每分钟120拍。这类元数据应该在MIDI文件中被指定,对于 format 为 0x0000 的文件应处于其 track chunk 的开始,对于 format 为 0x0001 的文件应包含在第一个 track chunk 之内,对于 format 为 0x0002 的文件应包含源慎在每个 track chunk 之中。
值得一提的是,未来的标准有可能会定义更多种类的 format 和 chunk ,甚至有可能为 header chunk 添加更多的参数从而使其 length 不再为 0x00000006 ,因此对于程序的实现者来说,遵守标准是十分必要的。
无论 format 的取值是什么, Track Chunks 的结构都是一致的:
在 length 后是一串连续的 MTrk event ,每个 MTrk event 由两部分组成:
这里的 delta-time 是一种 variable-length quantity ,其每个字节仅有7个有效位,最高位若非零则说明后面还有下一字节,最多可占据四个字节,因此其最大值为 0x0fffffff 。以下为参考示例:
delta-time 后紧跟的 event 有三种不同的类型:
MIDI event 的第一个字节通常表示 running status ,其最高位必须非零,对于 sysex event 和 meta-event 来说,这个字节分别为 0xf0 或 0xff 。
在每个 track chunk 中出现的第一个 MIDI event 必须指定 running status ,而对于后续的 MIDI event ,假如其紧跟在一个 MIDI event 后面,并且与前一个 MIDI event 有着同样的 running status ,那么这一个 MIDI event 的 running status 可以被省略。
每个 MIDI event 根据其 running status 高4位的不同而存在一个或两个单字节参数,这些参数的最高位均为零, running status 的低4位表示 channel 的编号,每个 MIDI event 只会在对应的 channel 上造成影响。举几个例子,以16进制表示:高4位为 C 意为 Program Change ,其跟随一个单字节参数,表示修改乐器音色;高4位为 9 意为 Note On ,高4位为 8 意为 Note Off ,这两者都跟随两个单字节参数,分别表示音高与力度。
中央C在 MIDI event 中的值为 0x3c ,每升高半音则加一,每降低半音则减一,通过这种规律可以推断出标准音为 0x45 。
channel 最多有16个,每个 channel 之间是独立的,也就是说不同的 channel 可以通过 Program Change 同时使用不同的音色,而又由于 Note On 和 Note Off 也是独立的,因此同一个 channel 中也可以同时播放不止一个音符。不过打击乐通常位于第10号 channel 。
音色对照表见文章末尾。
这是一种结构稍显复杂的事件信息,它可以包含一连串的 sysex event ,其基本结构如下:
这里 length 为 bytes 的长度,如果 bytes 不以 0xf7 结尾,那么其后就要跟随一个变长的 delta-time ,然后在跟随下一个 sysex event ,就像这样:
除第一个 sysex event 之外,后续跟随的 sysex event 首字节应为 0xf7 ,且最后一个 sysex event 的最后一字节应为 0xf7 。以下是一串合法的 sysex event 示例:
以上部分的 0x8148 和 0x64 分别表示200-tick delta-time 和100-tick delta-time 。
这一部分的格式是比较固定的:
所有 meta-event 以 0xff 起始,然后紧跟一个字节的 type ,再然后跟随一个变长的 length , length 的值即为 bytes 的长度。
在 Standard MIDI Files 1.0 中已经预定义了一部分 meta-event ,其中 Copyright Notice 应作为第一个 track 的第一个 event , Sequence Number 和 Sequence/Track Name 若存在则必须在任何 delta-times 非零的 event 前出现, End of Track 必须作为每个 track 的最后一个 event 。
Set Tempo 参数的意义为每个四分音符的微秒数。
Time Signature 参数的意义分别为节奏的分子、以二为底取得节奏分母的对数、节拍器每响一次的 MIDI clocks 个数、每个四分音符所包含的三十二分音符个数(最后这个我也不理解有什么意义),比如以下示例:
Key Signature 的第一个参数表示乐曲经过了移调所添加的升降号个数,第二个参数取 0x00 或 0x01 意为大调或小调。
以下音色对照表引用自 General MIDI System Level 1
MIDI是“音乐数字接口”(英文:Musical Instrument Digital Interface,简称MIDI)
MIDI是一个工业标准的电子通信协议,为电子乐器等演奏设备(如合成拍核器)定义各种音符或d奏码,容许电子乐器、计算机、手机或其它的舞台演出配备彼此连接,调整和同步,得以即时交换演奏数据。
MIDI不发送声音,只发送像是音调和音乐强度的数据,音量,颤音和相位等参数的控制信号,还有设置节奏的时钟信号。在不同的计算机上,输出的声音也因音源器不同而有差异。
MIDI演出控制协议是为MIDI而设的工业标准,由MIDI产业协会在1991年制定。它允许不同种类的媒体轮做控制设备在相互之间的通信,借助计算机可以现场进行演出控制的功能与娱乐应用。与音乐MIDI相同,MSC并不传输实际显示的媒体,它只是简单地传输有关多媒体性能的指令。
现在几乎所有的录音工程都将MIDI作为一项关键开放技术来纪录音乐。除此之外,MIDI也用来控制包括录音设备的硬件,如舞台灯、效果器踏板等高性能的设备。近十年,MIDI已经堂堂迈入移动电话领域。MIDI用来播放支持MIDI移动电话的铃声。MIDI还可为某些电子游戏、计算机游戏提供背景音乐。
MIDI使得计算机、合成器、声卡以及电子乐器(电子鼓、电子琴等)能互相控制、交换消息。现在计算机的声卡都是与MIDI兼容的,并能逼真地模拟乐器的声音。许多音乐的文件格式,都建构于MIDI档之上。这些格式可说就是电子乐器在看的电子乐谱,所以通常一个文件只需几十KB,就能够让电子乐器演奏出一首很完整的音乐。
扩展资料:
优点——
1、MIDI标准协议创建于1980年早期,对音乐家、录音乐手、音乐爱好者带来数个显著的优势。
2、共通语言及语法:键盘乐器,电子鼓,计算机,编曲机及其他为MIDI设计出来的特殊功能电子乐器之间可以轻易的相互链接
3、简化的链接:减少了音乐设备之间导线、信号线链接的复杂性(如音量控制)
4、更少的演出者:1980年代初期,音乐演出者可以仅靠一至两人进行现场演出,同时 *** 作数台MIDI设备,制造出像交响乐团般的演出效果
5、更低的获取门槛:用户可以以更少的花费创作、编辑、制作高质量的数字音乐。专业的音乐家可以在家里自己录音,宅录,不用花钱租录音室,也不用请一堆乐手来帮忙录音。同时更让没音乐基础的爱好者可以利用MIDI音乐软件高度扩展性进行高质量录音。
6、方便可携的电子音乐器材:大量减少了乐手巡回演出时所需携带的乐器、器材与线材的数量,在搬运、装载、架设器材也简易了许多,却仍可以制造出相当腊贺衡的音色与效果。
参考资料来源:百度百科-MIDI
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)