Clean up data layout and add stereo LR meters

This commit is contained in:
2022-02-19 13:04:41 -06:00
parent c0f179a018
commit b1bb0da2a1
2 changed files with 131 additions and 69 deletions
+100 -46
View File
@@ -14,20 +14,7 @@ exports.defaultPort = 10023;
exports.ready = function ready(device) {
const d = device;
d.data.channelFaders = new Array(32).fill(0);
d.data.channelFadersDB = new Array(32).fill(0);
d.data.channelMutes = new Array(32).fill(0);
d.data.channelNames = new Array(32).fill('end');
d.data.channelColors = new Array(32);
// this is all the data from the meters/0 group so more than needed but
d.data.meters = new Array(70).fill(-90);
d.data.stereoFader = 0;
d.data.stereoFaderDB = 0;
d.data.stereoMute = 0;
d.data.stereoName = 'LR';
d.data.stereoColor = 7;
d.data.X32 = new Console();
d.send(Buffer.from('/xinfo'));
@@ -40,19 +27,6 @@ function parseAddress(msg) {
return addr;
}
function convertToDBTheBehringerWay(f) {
if (f >= 0.5) {
return f * 40 - 30;
}
if (f >= 0.25) {
return f * 80 - 50;
}
if (f >= 0.0625) {
return f * 160 - 70;
}
return f * 480 - 90;
}
exports.data = function data(device, buf) {
this.deviceInfoUpdate(device, 'status', 'ok');
@@ -62,11 +36,12 @@ exports.data = function data(device, buf) {
const d = device;
if (msg[0] === '/xinfo') {
this.deviceInfoUpdate(device, 'defaultName', msg[3]);
d.data.name = msg[3];
d.data.ip = msg[2];
d.data.firmware = msg[5];
d.data.model = msg[4];
d.data.X32.info.name = msg[3];
d.data.X32.info.ip = msg[2];
d.data.X32.info.firmware = msg[5];
d.data.X32.info.model = msg[4];
this.deviceInfoUpdate(device, 'defaultName', d.data.X32.info.name);
d.send(Buffer.from('/main/st/config/name\x00\x00\x00\x00'));
@@ -80,23 +55,48 @@ exports.data = function data(device, buf) {
d.draw();
} else if (msg[0].includes('meters/0')) {
let offset = 24;
for (let i = 0; i < d.data.meters.length; i++) {
d.data.meters[i] = convertToDBTheBehringerWay(buf.readFloatLE(offset));
for (let i = 0; i < 70; i++) {
if (i >= 0 && i < 32) {
// These are channel meters
d.data.X32.inputs.channels[i].meter = Console.getBehringerDB(
buf.readFloatLE(offset)
);
}
offset += 4;
}
d.draw();
} else if (msg[0].includes('meters/2')) {
let offset = 24;
for (let i = 0; i < 49; i++) {
if (i === 22) {
// STEREO LEFT METER
d.data.X32.main.stereo.meter[0] = Console.getBehringerDB(
buf.readFloatLE(offset)
);
} else if (i === 23) {
// STEREO RIGHT METER
d.data.X32.main.stereo.meter[1] = Console.getBehringerDB(
buf.readFloatLE(offset)
);
}
offset += 4;
}
} else if (msg[0].indexOf('/mix/fader') >= 0) {
const addr = parseAddress(msg[0]);
const channel = Number(addr[1]);
if (addr[0] === 'ch') {
d.data.channelFaders[channel - 1] = buf.readFloatBE(24);
d.data.channelFadersDB[channel - 1] = convertToDBTheBehringerWay(
d.data.X32.inputs.channels[channel - 1].fader = buf.readFloatBE(24);
d.data.X32.inputs.channels[channel - 1].faderDB = Console.getBehringerDB(
buf.readFloatBE(24)
);
} else if (addr[0] === 'main') {
d.data.stereoFader = buf.readFloatBE(24);
d.data.stereoFaderDB = convertToDBTheBehringerWay(buf.readFloatBE(24));
d.data.X32.main.stereo.fader = buf.readFloatBE(24);
d.data.X32.main.stereo.faderDB = Console.getBehringerDB(
buf.readFloatBE(24)
);
}
d.draw();
@@ -105,10 +105,10 @@ exports.data = function data(device, buf) {
const channel = Number(addr[1]);
if (addr[0] === 'ch') {
d.data.channelMutes[channel - 1] = buf[23];
d.data.X32.inputs.channels[channel - 1].mute = buf[23];
d.send(Buffer.from(`/ch/${addr[1]}/mix/fader\x00\x00\x00\x00`));
} else if (addr[0] === 'main') {
d.data.stereoMute = buf.slice(-1)[0];
d.data.X32.main.stereo.mute = buf.slice(-1)[0];
d.send(Buffer.from(`/main/${addr[1]}/mix/fader\x00\x00\x00\x00`));
}
d.draw();
@@ -116,26 +116,26 @@ exports.data = function data(device, buf) {
const addr = parseAddress(msg[0]);
if (addr[0] === 'main') {
if (addr[1] === 'st') {
d.data.stereoName = msg[2];
if (d.data.stereoName === '') {
d.data.stereoName = 'LR';
d.data.X32.main.stereo.name = msg[2];
if (d.data.X32.main.stereo.name === '') {
d.data.X32.main.stereo.name = 'LR';
}
d.send(Buffer.from(`/main/${addr[1]}/config/color\x00\x00\x00\x00`));
}
} else if (addr[0] === 'ch') {
const channel = Number(addr[1]);
d.data.channelNames[channel - 1] = msg[2];
d.data.X32.inputs.channels[channel - 1].name = msg[2];
d.send(Buffer.from(`/ch/${addr[1]}/config/color\x00\x00\x00\x00`));
}
d.draw();
} else if (msg[0].indexOf('/config/color') > 0) {
const addr = parseAddress(msg[0]);
if (addr[0] === 'main') {
d.data.stereoColor = Buffer.from(msg[2]).readInt8();
d.data.X32.main.stereo.color = Buffer.from(msg[2]).readInt8();
d.send(Buffer.from(`/main/${addr[1]}/mix/on\x00\x00\x00\x00`));
} else if (addr[0] === 'ch') {
const channel = Number(addr[1]);
d.data.channelColors[channel - 1] = buf.readInt8(27);
d.data.X32.inputs.channels[channel - 1].color = buf.readInt8(27);
d.send(Buffer.from(`/ch/${addr[1]}/mix/on\x00\x00\x00\x00`));
}
d.draw();
@@ -147,9 +147,63 @@ exports.data = function data(device, buf) {
exports.heartbeat = function heartbeat(device) {
device.send(Buffer.from('/xremote'));
// subscribe to meter groups
device.send(
Buffer.from(
'/batchsubscribe\x00,ssiii\x00\x00meters/0\x00\x00\x00\x00/meters/0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
)
);
device.send(
Buffer.from(
'/batchsubscribe\x00,ssiii\x00\x00meters/2\x00\x00\x00\x00/meters/2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
)
);
};
class Console {
constructor() {
this.inputs = {
channels: new Array(32).fill(0).map(() => ({
fader: 0,
faderDB: 0,
mute: 0,
name: 'end',
color: undefined,
meter: -90,
})),
};
this.main = {
stereo: {
fader: 0,
faderDB: 0,
mute: 0,
name: 'LR',
color: 7,
meter: new Array(2).fill(-90),
},
};
this.info = {
name: '',
ip: '',
firmware: '',
model: '',
};
}
static getBehringerDB(level) {
const f = level;
if (f >= 0.5) {
return f * 40 - 30;
}
if (f >= 0.25) {
return f * 80 - 50;
}
if (f >= 0.0625) {
return f * 160 - 70;
}
return f * 480 - 90;
}
}
+31 -23
View File
@@ -13,30 +13,15 @@
</tr>
<tr>
<td width="40px">LR</td>
<td width="100px"><div class="color color-<%= data.stereoColor %>"><%- data.stereoName%></div></td>
<td><div class="fader-mute mute-<%=data.stereoMute%>">M</div></td>
<td><%= formatAsDB(data.stereoFaderDB) %></td>
<td width="100px"><div class="color color-<%= data.X32.main.stereo.color %>"><%- data.X32.main.stereo.name%></div></td>
<td><div class="fader-mute mute-<%=data.X32.main.stereo.mute%>">M</div></td>
<td><%= formatAsDB(data.X32.main.stereo.faderDB) %></td>
<td>
<input
type="range"
min="0"
max="100"
value="<%= data.stereoFader*100 %>"
disabled />
</td>
</tr>
<% for(var i=0; i<32; i++){ %> <% if(data.channelNames[i]=="end"){break;} %>
<tr>
<td><%= i+1 %></td>
<td>
<div class="color color-<%= data.channelColors[i] %>">
<%- data.channelNames[i] || i+1 %>
<% let style = `style=width:${Math.abs(data.X32.main.stereo.meter[0] - 10)}%`; %>
<div class="meter">
<div class="meter-cover" <%= style %>></div>
</div>
</td>
<td><div class="fader-mute mute-<%=data.channelMutes[i]%>">M</div></td>
<td><%= formatAsDB(data.channelFadersDB[i]) %></td>
<td>
<% let style = `style=width:${Math.abs(data.meters[i] - 10)}%`; %>
<% style = `style=width:${Math.abs(data.X32.main.stereo.meter[1] - 10)}%`; %>
<div class="meter">
<div class="meter-cover" <%= style %>></div>
</div>
@@ -44,7 +29,30 @@
type="range"
min="0"
max="100"
value="<%= data.channelFaders[i]*100 %>"
value="<%= data.X32.main.stereo.fader*100 %>"
disabled />
</td>
</tr>
<% for(var i=0; i<32; i++){ %> <% if(data.X32.inputs.channels[i].name == "end"){break;} %>
<tr>
<td><%= i+1 %></td>
<td>
<div class="color color-<%= data.X32.inputs.channels[i].color %>">
<%- data.X32.inputs.channels[i].name || i+1 %>
</div>
</td>
<td><div class="fader-mute mute-<%=data.X32.inputs.channels[i].mute%>">M</div></td>
<td><%= formatAsDB(data.X32.inputs.channels[i].faderDB) %></td>
<td>
<% let style = `style=width:${Math.abs(data.X32.inputs.channels[i].meter - 10)}%`; %>
<div class="meter">
<div class="meter-cover" <%= style %>></div>
</div>
<input
type="range"
min="0"
max="100"
value="<%= data.X32.inputs.channels[i].fader*100 %>"
disabled />
</td>
</tr>