midi接口和midi time code(MTC)

Midi的硬件接口

    MIDI 协议是一种特殊的串行通讯协议,是专门为数字音乐传输制订的,因此,它 有着自己的特点:每一条线路允许连接16个MIDI 设备,每个设备有各自的通道号,数据流是单向的,不进行应答,演奏设备只管发出MIDI命令而不检测接收设备是否准确收到,由于音乐自身的特点,接收设备判断收到正确的信号则响应,而错误的信号将被忽略-音乐演奏时,允许丢掉音符,但不能搞乱节奏。 
    MIDI协议规定, MIDI信号以波特率31.25K的串行异步信号传输,每字节数据包 括10 位,一个起始位,8位数据, 一个停止位,无校验位。每个音符的开(或关)命令有3个字节,经计算,不到1mS即可传输一个音符的开关命令,一条MIDI命令一般为1-3字节,连续发送。 
    在MIDI协议中, 规定了包括按键的压下/释放,力度,触后压力,各种MIDI控制 器等命令和一些系统信息。实际上,存在数种不同的MIDI协议,1991年制订了 通用MIDI协议(GM)后 ,经实践检验, 并不能解决所有的问题,于是Roland和Yamaha两个公司分别开发了自己的协议称为GS和XG, 试图更好的解决问题,但这两个协议不完全兼容。这几种协议中不兼容部分, 主要是针对比较高级的MIDI 应用,一般性的键盘和控制命令是兼容的。
    与RS232口不同的是,MIDI信号用电流的差异代表不同的逻辑,MIDI设备的输出与另一台接收设备的输入连成一个回路,在这条回路里,5mA的电流代表逻辑“0”,0mA代表逻辑“1”,标准的MIDI设备之间,采用光隔离连接,设备之间没有握手信号。 
     按照MIDI协议,MIDI信号的输入输出均采用5针的DIN插头,每个设备的输出接另一个设备的输入,在多个设备接入的系统里,每个中间设备要负责转发接在其输入口的MIDI信号。

MIDI Time Code(MTC)是MIDI中的一个子协议。在MTC的协议数据中包含了SMPTE的时间信息。
MTC协议由几条MIDI Message组成,并且另外还有几条SysEx Message。

MTC协议中最重要的几个消息叫做Quarter Frame(不包括SysEx Message)。它的状态码为0xF1,接着1个字节为数据字节。Quarter Frame的是根据正在运行的SMPTE来发送的,并且发送的频率是SMPTE的1/4;也就是1个SMPTE Frame的时间内,发送4个Quarter Frame。一个完整的MTC时间帧需要8条Quarter Frame组成,也就是MTC时间帧的更新频率只有SMPTE的1/2;那么对于30fps的SMPTE来说,对应的MTC时间帧只有15fps。

MTC中Quarter Frame的组成格式(2个字节组成):Status Byte(固定为0xF1) + Data Byte 
对于Quarter Frame中的Date Byte对应的二级制表示为:nnnn dddd,对应下表中:
nnnn            dddd
0000            当前Frames的低4bit(bit0-bit3)
0001            当前Frames的高4bit(bit4-bit7)
0010            当前Seconds的低4bit(bit0-bit3)
0011            当前Seconds的高4bit(bit4-bit7)
0100            当前Minutes的低4bit(bit0-bit3)
0101            当前Minutes的高4bit(bit4-bit7)
0110            当前Hours的低4bit(bit0-bit3)
0111            当前Hours的第5bit(bit4)+当前SMPTE的类型
当nnnn=0111时,将Date Byte的二级制重新定义格式为:nnnn xyyd
x——为不使用的bit,并且置成0
yy——当前使用的SMPTE的类型:
            00——24fps
            01——25fps
            10——30fps(Drop Frame)
            11——30fps
d——当前Hours的第5bit(bit4)
例如:连续接收到的数据流为
0xF1 0x01    0xF1 0x12    0xF1 0x23    0xF1 0x34    0xF1 0x45    0xF1 0x56    0xF1 0x67    0xF1 0x77
表示当前的同步时间为:Frames:0x21;    Seconds:0x43;    Minutes:0x65;    Hours:0x17;    SMPTE Type:30fps

    自我理解:当上述的数据流接收完毕并且解析,当前的时间帧对应的SMPTE应该已经到了0x23。(因为1个完整的MTC时间信息占用的时间对应2帧SMPTE信息)

MTC同步时间信息流,正常播放时是有顺序发送的,对应的nnnn是不断的从0000-0111循环发送;Frames,Seconds,Minutes,Hours的低bit先于高bit发送。但是MTC有倒播的功能,那么就刚好跟正常是相反,对应的高bit先于低bit发送。

在MTC中,0xF1 0x0n 和 0xF1 0x4n 这2个数据帧作为分界点,总是按照实时的SMPTE数据来发送。也就是1个完整的MTC数据包刚好处于2个SMPTE数据帧交界处,那么这个MTC数据包的前半部分是上个SMPTE帧的数据,MTC的后半部分是当前SMPTE的数据。解析的时候特别要注意。

Full Frame
Full Frame是SysEx Message,一个Full Frame包含了1帧SMPTE的时间信息。
数据流格式:(十六进制)
F0 7F cc 01 01 hr mn sc fr F7
cc——SysEx channel(0-127)对应的126个通道设备。如果为0x7F(127)是指所有MIDI链上的设备都需要识别当前Full Frame Message
hr——当前Hours
mn——当前Minutes
sc——当前Seconds
fr——当前Frames

Full Frame只是作为对SMPTE的识别和准备,所有MIDI链上的设备都不会真正工作,除非接到了Quarter Frame Message。主MIDI设备,在发送Full Frame转到发送Quarter Frame之前,必须有个停顿,以满足Slave MIDI设备对SMPTE时间有个预测。

在快进和倒带的时候,主MDI设备应该停止发送Quarter Frame Message,而是应该用Full Frame对应替换。


参考:
http://home.roadrunner.com/~jgglatt/tech/mtc.htm
基于Arduino Micro或Leonardo的简单USB转MIDI适配器,可以过滤MIDI数据(可选)。 硬件部件: Arduino Micro × 1个 6n137光耦合器× 1个 1N4148 –通用快速开关 × 1个 电容100 nF × 1个 电阻220欧姆 × 3 电阻10k欧姆 × 1个 通孔电阻,470欧姆 × 1个 LED(通用) × 1个 LED支架× 1个 DIN音频/视频连接器,5触点 × 2个 一块通用PCB× 1个 PCB安装座× 1个 软件应用程序在线服务: Arduino IDE 我在网上搜索了如何使用Arduino构建USB转MIDI适配器的方法,但不幸的是,我只找到了效果不佳的解决方案(不良的MIDI软件或硬件实现)。因此,我决定自己构建一个并将结果放在hackster.io上。 我使用带有面包板的Arduino Leonardo构建了第一个原型。一切正常后,我改用Arduino Micro构建了焊接版本。两者均基于ATmega32u4,后者具有本地USB,可将其作为USB MIDI接口呈现给您所连接的PC。 MIDI使用光耦合器一些电阻器来创建完全隔离的电流环路。该电路是非常标准的电路,我使用了6n137,因为它的速度很快且广泛可用。如电路图所示,只有MIDI OUT连接器的引脚2接地,这是MIDI的标准配置。 最终结果的一些照片: 在软件方面,我决定使用出色的Control Surface库。与某些其他库或手动编码的实现不同,Control Surface可以正确处理稍微复杂的MIDI协议的所有不同方面。 Control Surface还允许您添加各种附加功能。例如,您可以添加一些电位计,踏板或连接到模拟/数字输入的按钮,以添加额外的MIDI控件。只需在Control Surface网站上查看更多信息,它就很容易做到! 您还可以注册回调,以便可以在从MIDI传递到USB或其他方向之前处理数据。就我而言,我使用它来修复Roland D50合成器的MIDI实施损坏。每次按下最后一个键时,D50都会发送“关闭所有音符”命令。现代实现(例如我使用的大多数VST乐器)都将其解释为所有运行中音符延音的立即硬性中断。通过过滤掉“所有音符”,D50可以再次用作主键盘。 我在Control Surface库中遇到的一个问题是,它不能很好地处理大型SysEx软件包。尝试使用D50编辑器/图书管理员时,这会导致错误,因为它发送了相当大的SysEx软件包。我在源代码的注释标题中添加了有关如何解决此问题的说明。编写该库的人表示,一旦2.x版本问世,此问题将得到解决。 我提供了基本的USB到MIDI接口的源代码,以及带有“所有音符已关闭”过滤功能的版本。 当然,您也可以使用其他库或编写自己的MIDI实现,该硬件应与任何具有USB MIDI串行MIDI支持的MIDI库一起使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值