diff --git a/plugins/x32/main.js b/plugins/x32/main.js index 475208a..81b4a8c 100644 --- a/plugins/x32/main.js +++ b/plugins/x32/main.js @@ -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; + } +} diff --git a/plugins/x32/template.ejs b/plugins/x32/template.ejs index 2ff2db3..cd6baf8 100644 --- a/plugins/x32/template.ejs +++ b/plugins/x32/template.ejs @@ -13,30 +13,15 @@