如何从音量级别创建 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 消息?的主要内容,如果未能解决你的问题,请参考以下文章

Alesis QS MIDI Sysex 数据转换

MIDI 蓝牙 LE、SYSEX 消息不完整

发送和接收 Java Midi Sysex 消息

使用 Arduino 发送 MIDI SysEx 消息?

如何检测 MidiInProc 中丢失的 SysEx 数据?

如何将 sysex 数据添加到 MusicTrack? (音频工具箱)