|
发表于 2004-11-14
|
|阅读模式
连续状态(Running Status)
在典型的MIDI讯息流中有一定量的冗余。既定通道上的音符开(Note On)发送时,其后不久跟有对应的音符关(Note Off)讯息。而操作弯音轮会产生大量乃至上百的弯音讯息。因为每个字节都连续发送,而音乐人也会说,时间是非常本质的事情,而“压榨”出冗余数据这显然是有一定帮助的。幸运的是,MIDI协议提供了一种简单而又有效的方法来处理即:连续状态[running status]。
拿三个音符开(Note On)讯息的例子来说,跟有三个或更多的力度为0的音符——以此替代音符关(Note Off)讯息。为了简化起见,所有这些字节都以十六进制显示,均在通道1上。
请注意在通道1上的音符开的状态为0x90。这种简单的序列需要18个字节。
90 3C 40 90 3B 62 90 39 27 ... 90 3C 00 90 3B 00 90 39 00
因为每个事件的状态字节相同(均为通道1上的音符开),在本例中就有“冗余”的状态字节。而连续状态实际上则是一种压缩数据的形式,这样我们便可以忽略冗余状态字节。
而在状态字节改变,新讯息类型改变,或是相同类型但换了一个通道时,则必须发送新的状态字节。实际上周期性地更新状态直接是个不错的主意,即使这并不是非常严格地需要。如果接收设备丢失状态字节,则会拒绝产生任何声音,直到状态更新。因此每16或32个事件就更新一次是适当的。
通过对序列应用运行状态,我们可以将其缩短为13个字节:
90 3C 40 3B 62 39 27 ... 3C 00 3B 00 39 00
连续状态只能在通道讯息上使用,在状态字节改变时终止。请注意系统实时讯息对运行状态是视而不见的。
|
|