如何从音量级别创建MIDI Sysex Master Volume消息?

时间:2014-10-16 00:49:25

标签: java midi javax.sound.midi

如果音量级别表示为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 字节

1 个答案:

答案 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 };