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

什么是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中)+ 中音源,这样的才能做音色切换

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享