如果音量级别表示为0到1之间的浮点值,如何创建Universal SysEx 主音量消息的数据字节?
这是Sysex消息构造函数,具有给定的Sysex消息状态字节(0xF0)和数据字节:
new SysexMessage(0xF0, data, data.length)
根据MIDI规范,Master Volume消息中有2个状态字节和6个数据字节(没有状态字节),最后两个数据字节指定音量级别:
0xF0 SysEx(状态)
0x7F通用实时
0x7F忽略频道
0x04子ID - 设备控制
0x01 Sub-ID2 - 主音量
0xLL 14位卷的0到6位
0xMM 14位卷的7到13位
0xF7 SysEx结束(状态)
所以,如果我没错,数据字节应如下所示:
data = new byte[] { 0x7F, 0x7F, 0x04, 0x01, LL, MM }
我的问题是如何从0到1之间的 float 音量级别获取LL和MM 字节?
答案 0 :(得分:3)
对于这样的无符号类型,小的14位值为零,最大值为2 14 -1 = 16383。 所以要将1.0转换为16383,只需乘以:
int value_14bits = (int)(float_value * 16383);
如果您是偏执狂,请检查范围:
value_14bits = Math.max(Math.min(value_14bits, 16383), 0);
然后提取低位和高位七位字段:
data = new byte[] {
0x7F, 0x7F, 0x04, 0x01,
value_14bits & 0x7f,
value_14bits >> 7 };