gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:39:38 26 4
gpt4 key购买 nike

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

这是 Sysex 消息构造函数,具有给定的 Sysex 消息状态字节 (0xF0) 和数据字节:

new SysexMessage(0xF0, data, data.length)

根据 MIDI 规范,Master Volume 消息中有 2 个状态字节和 6 个数据字节(不含状态字节),最后两个数据字节指定音量级别:

0xF0 SysEx(状态)
0x7F 通用实时
0x7F 忽略 channel
0x04 子 ID -- 设备控制
0x01 子 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 字节

最佳答案

对于像这样的无符号类型,最小的 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 };

关于java - 如何从音量级别创建 MIDI Sysex Master Volume 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com