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
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值