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

Posted

技术标签:

【中文标题】如何从音量级别创建 MIDI Sysex Master Volume 消息?【英文标题】:How to create MIDI Sysex Master Volume message from volume level? 【发布时间】:2014-10-16 00:49:24 【问题描述】:

如果音量级别表示为介于 0 和 1 之间的浮点值,如何创建 Universal SysEx Master Volume 消息的数据字节?

这是 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 bytes

【问题讨论】:

【参考方案1】:

对于这样的无符号类型,14 位的最小值为零,最大值为 214-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 ;

【讨论】:

以上是关于如何从音量级别创建 MIDI Sysex Master Volume 消息?的主要内容,如果未能解决你的问题,请参考以下文章