You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助解析Behringer X32混音器的4路返回仪表浮点数据

解析Behringer X32混音器4路仪表值(32位小端浮点数)

需求说明

  • 目标:获取Behringer X32混音器的4路仪表值,分别为post gain/trim、gate、dyn gain reduction、post-fade,这些值为32位小端编码的浮点数
  • 请求方式:发送OSC命令 /meters/6 <channel_id> 获取指定通道的仪表数据

OSC手册相关摘录

X32/M32服务器返回的/meters数据是OSC二进制块(OSC-blob),即一组任意二进制数据。
因此,其格式与X32/M32通常返回的数据格式不同,这主要是出于效率/性能考虑。返回的二进制块格式如下:

<仪表ID> ,b~~<int1><int2><原生浮点数>…<原生浮点数>

<仪表ID>: 参见下方可选值(以空字节填充)
,b~~: 表示二进制块格式,以空字节填充
<int1>: 二进制块的字节长度,32位大端编码
<int2>: 原生浮点数的数量,32位小端编码
<原生浮点数>: 数据或仪表值,32位浮点数,小端编码

/meters/6 <channel_id>
返回通道条仪表值(post gain/trim、gate、dyn gain reduction、post-fade):
支持4个通道条仪表,通道ID范围为0…71
返回包含4个浮点值的单个OSC二进制块

已完成的预处理步骤

  1. 切片处理:在Node-RED中用以下代码截取有效数据(去掉前4个字节)
const bytes = msg.payload;
msg.payload = bytes.slice(4);
return msg;
  • 原始返回示例:4,0,0,0,230,123,133,57,128,2,165,58,32,250,127,63,111,187,213,52
  • 切片后结果:230,123,133,57,128,2,165,58,32,250,127,63,111,187,213,52
  1. 拆分数组:用以下代码将切片后的字节拆分为数组
const bytes = msg.payload;
const chunkSize = msg.chunkSize || 16; // 默认块大小

const chunks = [];
for (let i = 0; i < bytes.length; i += chunkSize) {
    const chunk = bytes.slice(i, i + chunkSize);
    chunks.push(chunk);
}

msg.payload = chunks;
return msg;
  • 拆分后数组示例:
[{"0":230,"1":123,"2":133,"3":57,"4":128,"5":2,"6":165,"7":58,"8":32,"9":250,"10":127,"11":63,"12":111,"13":187,"14":213,"15":52}]

解决方案:解析为4路仪表值

在Node-RED中添加函数节点,使用以下代码将处理后的字节数组解析为目标浮点数:

const bytes = msg.payload[0]; // 取拆分后的第一个块(对应4个浮点数的16字节)
const meters = [];

// 每4个字节对应一个32位小端浮点数,循环解析4次
for (let i = 0; i < 16; i += 4) {
    // 创建DataView处理小端编码
    const view = new DataView(new ArrayBuffer(4));
    // 按小端顺序写入字节
    view.setUint8(0, bytes[i]);
    view.setUint8(1, bytes[i+1]);
    view.setUint8(2, bytes[i+2]);
    view.setUint8(3, bytes[i+3]);
    // 读取小端浮点数并加入结果数组
    meters.push(view.getFloat32(0, true));
}

// 将结果映射为对应的仪表名称
msg.payload = {
    "post_gain_trim": meters[0],
    "gate": meters[1],
    "dyn_gain_reduction": meters[2],
    "post_fade": meters[3]
};

return msg;

代码说明

  • 使用DataView处理二进制数据,通过getFloat32的第二个参数true指定小端编码
  • 每4字节解析一个浮点数,共解析4次,对应4路仪表值
  • 最终结果以键值对形式返回,方便后续节点调用

内容的提问来源于stack exchange,提问作者Ossama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:27:24