在midi文件中,如果我想改变,比如说,我会写一下
<delta_time> <176(ch1 control change)> <10(pan control)> <value>
这会将平移值设置为0到127(msb)之间的数字。为了更精细调整,我还可以使用控制消息42来设置用于平移的lsb。我的问题是,要设置一个精确的调整,我是否必须重复整个消息,如:
<delta_time> <176(ch1 control change)> <10(pan control msb)> <value>
<delta_time(0)> <176(ch1 control change)> <42(pan control lsb)> <value>
或者我可以发送
<delta_time> <176(ch1 control change)> <10(pan control)> <value(msb)> <value(lsb)>
另外,如果我发送lsb会发生什么?它会将msb假设为0吗?
由于
答案 0 :(得分:2)
每个控制更改事件都是一个独立事件,因此它需要自己的增量时间,自己的状态字节和自己的参数字节。 (如果状态字节与前一个字节具有相同的值,则可省略该状态字节,但这仅取决于状态字节的值,而不取决于事件是否实际相关。)
如果没有明确指定发送没有LSB消息的MSB消息会发生什么情况,即使是这样,您也无法确定设备是否能正确实现它。
为安全起见,要更改具有14位值的控件,请按顺序发送MSB和LSB消息。
答案 1 :(得分:2)
我自己就是在研究这个问题。在我看来,上面的答案是不正确的。如果您参考官方MIDI规格... (通常你必须支付规格,但这里是免费重印:) http://oktopus.hu/uploaded/Tudastar/MIDI%201.0%20Detailed%20Specification.pdf
在第12页,讨论了这种MSB / LSB方案。它说发送LSB值是可选的。我认为如果没有指定LSB将为零是安全的。此外,它明确指出仅在LSB改变时重新发送MSB也是可选的。唯一需要的是,如果您使用LSB并更改MSB,则还必须更新LSB。