iOS 关于MIDI开发、蓝牙MIDI、硬件链接MIDI设备

2,138 阅读6分钟

什么是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插孔

传统接口

image.png

Type-B接口

image.png

以上只列举两种常见的接口

MIDI数据解析

头部数据

image.png

音轨块

image.png

MIDI事件

image.png

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 位来表示,从0F共有16个。下表为通道消息的同类,其中X为016.
状态字节功能描述数据字节描述
8X松开音符1字节:音符号(007F) / 2字节:力度(007F)
9X按下音符1字节:音符号(007F) / 2字节:力度(007F)
AX触后音符1字节:音符号(007F) / 2字节:力度(007F)
BX控制器变化1字节:控制器号码(0079) / 2字节:控制器参数(007F)
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中)+ 中音源,这样的才能做音色切换

Midi

Midi 连接测试工具 MIDI Wrench

IMG_4F3DF50EAD79-1.jpeg

下章:iOS设备上开发一个MIDI文件播放器,切换音源,并且做响应的操作