什么是MIDI?
关于MIDI的定义
MIDI(Musical Instrument Digital Interface)乐器数字接口 ,是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,怎么做, 如演奏哪个音符、多大音量等。它们被统一表示成MIDI 消息(MIDI Message) 。传输时采用异步串行通信, 标准通信波特率为31.25×( 1±0.01) KBaud。 --来自百度百科
MIDI常用的标准协议GM、GS、XG
- GS:MIDI这种播放指令序列文件是乐器数字化接口的简写,是由日本和美国几家著名电子乐器厂商于1983年共同制定的数字音乐/电子合成器的统一国际标准,它的出现解决了各个不同厂商之间的数字音乐乐器的兼容问题!日本罗兰公司于1984年提出了GS标准,大大增强了音乐的表现力。
- GM:为了更有利于音乐家广泛地使用不同的合成器设备和促进MIDI文件的交流,国际MIDI生产者协会(MMA)在1991年制定了通用MIDI标准——GM,该标准是以日本Roland公司的通用合成器GS标准为基础而制订的
- XG:YAMAHA公司在GM标准上于1994年推出了自己的XG的MIDI格式,增加了更多数量的乐器组,扩大了MIDI标准定义范围,在专业音乐范围内得到广泛的应用!
General MIDI 标准
钢琴
Acoustic Grand Piano | 大钢琴 |
---|---|
Bright Acoustic Piano | 亮音大钢琴 |
MIDI插孔
传统接口
Type-B接口
以上只列举两种常见的接口
MIDI数据解析
头部数据
音轨块
MIDI事件
MIDI文件组成
<文件头块> + <音轨块数据>
1. 文件头块
<标志符串>(4字节) + <头块数据区长度>(4字节) + <头块数据区>(6字节)
-
标志符串,指的是"MThd"或"MTrk",MThd是头块类型,MTrk是音轨类型。所以头块标志就是MThd的ASCII码,用十六进制表示就是4d 54 68 64。
-
头块数据区长度,指的是后面接着的头块数据区长度,因为长度是6字节,所以固定显示为00 00 00 06。
-
头块数据区,共有6字节,分别为ff ff nn nn dd dd。
- 前两个字节ff ff 指定midi文件格式
00 00 表示只含一个音轨 00 01 表示含有多个同步音轨 00 10 表示含有多个独立音轨
- nn nn 指定轨道数,一般都会大于1,因为除了演播主音轨外,还会有全局音轨。
- dd dd 指定基本时间格式
dd dd 的最高位为标记位, 0为采用ticks计时,后面的数据为一个4分音符的ticks; 1为SMPTE格式计时,后面的数值则是定义每秒中SMTPE帧的数量及每个SMTPE帧的tick。 用我们举例的midi来看看,dd dd 的数据为01 E0,表示采用ticks计时,1E0转十进制为480,也就是每个4分音符,包含480ticks。后面事件时间都是以ticks为单位。
2. 音轨块
<标志符串>(4字节) + <音轨块数据区长度>(4字节) + <音轨块数据区>(多个MIDI事件构成)
-
上面说过,音轨块的标志符串为"MTrk",也是记录ASCII码,用十六进制表示就是4d 54 72 6b。音轨块数据区长度也为固定4字节,指定后面的数据区长度。
-
MIDI事件的构成
<delta time> + <MIDI 消息>
- 其中delta time 就是采用动态字节来表示,单位就是tick。
- MIDI 消息,由一个状态字节 + 多个数据字节 构成。状态字节可以理解为
方法
,数据字节可以理解为这个方法的参数
。 - 状态字节的最高位永远为1,因为它的范围介于128~ 255之间,而数据字节最高位永远为0,所以的它的范围介于0 ~ 127 之间。
- 消息根据性质可分成通道消息和系统消息两大类。
通道消息是对单一的MIDI Channel起作用,其Channel是利用状态字节的低 4 位来表示,从0
F共有16个。下表为通道消息的同类,其中X为016.
状态字节 | 功能描述 | 数据字节描述 |
---|---|---|
8X | 松开音符 | 1字节:音符号(00 |
9X | 按下音符 | 1字节:音符号(00 |
AX | 触后音符 | 1字节:音符号(00 |
BX | 控制器变化 | 1字节:控制器号码(00 |
CX | 改变乐器 | 1字节:乐器号码(00~7F) |
DX | 通道触动压力 | 1字节:压力(00~7F) |
EX | 弯音轮变换 | 1字节:弯音轮变换值的低字节 / 2字节:弯音轮变换值的高字节 |
-
还有一种特殊的状态字节
FF
,表示非MIDI事件(Non- MIDI events),也叫meta-event(元事件)。元事件的语法定于如下:FF + <种类字节>(1字节) + <数据字节长度> + <数据字节>
FF
的部分功能,其他如果数据字节数不是固定,而是有前面的动态字节制定,则用--
表示种类 功能描述 数据字节长度 数据字节描述 00 设置轨道音序 2 音序号 00 00-FF FF 01 文字事件 -- 文本信息 02 版权公告 -- 版权信息 03 指定歌曲/音轨的名称 -- 歌曲名称(用于全局音轨时)/音轨的名称 04 指定乐器 -- 乐器名称 05 歌词 -- 歌词 06 标记 -- 标记(通常在一个格式0的音轨,或在格式1的第一个音轨。) 07 注释 -- 描述一些在这一点上发生的动作或事件 2F 音轨终止 -- 音轨结束标志(必须有的) 51 指定速度 -- 设定速度,以微妙为单位,是四分音符的时值 58 指定节拍 -- 略
软音源
iOS支持的数据格式
iOS支持的数据格式为sf2 (SoundFont v2.0)
音色库
SoundFont 声音字体即 音色库,也叫做软音源
音色的组成
Samples(单音) -> Instruments(组音) -> Presents (预设)
检测音色库的音源种类
有一个叫 Polyphone 的软件可以打开软音源,可以检测里面的单音数量 有的sf2文件只有一个单音,钢琴的,有的包含 128中(标准MIDI ,GM规定的128中)+ 中音源,这样的才能做音色切换