2026-10-15 17:11:17 -04:00
|
|
|
import { fmtCue, fmtDb, fmtPan } from '../protocol.js'
|
|
|
|
|
|
|
|
|
|
const ENTITY_VARS = {
|
|
|
|
|
input: ['name', 'fader', 'mute', 'pan'],
|
|
|
|
|
buss: ['name', 'mode', 'stereo', 'fader', 'mute'],
|
|
|
|
|
matrix: ['name', 'fader', 'mute'],
|
|
|
|
|
cg: ['name', 'fader', 'mute'],
|
2026-10-20 10:25:39 -04:00
|
|
|
minput: ['name'],
|
2026-10-15 17:11:17 -04:00
|
|
|
}
|
|
|
|
|
|
2026-10-20 10:25:39 -04:00
|
|
|
/** Variable id prefix per entity kind (matrix inputs are matrix_in_N_...). */
|
|
|
|
|
export const VAR_PREFIX = { input: 'input', buss: 'buss', matrix: 'matrix', cg: 'cg', minput: 'matrix_in' }
|
|
|
|
|
|
2026-10-15 17:11:17 -04:00
|
|
|
const VAR_LABEL = {
|
|
|
|
|
name: 'name',
|
|
|
|
|
fader: 'fader level (dB)',
|
|
|
|
|
mute: 'mute state',
|
|
|
|
|
pan: 'pan',
|
|
|
|
|
mode: 'mode (Aux/Group)',
|
|
|
|
|
stereo: 'Stereo/Mono',
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-20 10:25:39 -04:00
|
|
|
const ENT_LABEL = { input: 'Input', buss: 'Buss', matrix: 'Matrix output', cg: 'Control group', minput: 'Matrix input' }
|
2026-10-15 17:11:17 -04:00
|
|
|
|
|
|
|
|
/** Variables exist only for entities the console reported (all possible ones until the first load finishes). */
|
|
|
|
|
export function getVariableDefinitions(inst) {
|
|
|
|
|
const defs = {
|
|
|
|
|
console_name: { name: 'Console name' },
|
|
|
|
|
session_name: { name: 'Session file name' },
|
|
|
|
|
connected: { name: 'Console link alive (Yes/No)' },
|
|
|
|
|
relay_clients: { name: 'iPad apps connected through the relay' },
|
|
|
|
|
relay_client_ips: { name: 'iPad client IPs' },
|
|
|
|
|
last_change: { name: 'Last change reported by the console' },
|
|
|
|
|
snapshot_index: { name: 'Current snapshot index' },
|
|
|
|
|
snapshot_name: { name: 'Current snapshot name' },
|
|
|
|
|
snapshot_cue: { name: 'Current snapshot cue number' },
|
|
|
|
|
snapshot_count: { name: 'Number of snapshots' },
|
|
|
|
|
}
|
|
|
|
|
for (const ent of Object.keys(ENTITY_VARS)) {
|
|
|
|
|
for (const n of inst.state.numbers(ent)) {
|
2026-10-20 10:25:39 -04:00
|
|
|
for (const field of ENTITY_VARS[ent]) defs[`${VAR_PREFIX[ent]}_${n}_${field}`] = { name: `${ENT_LABEL[ent]} ${n} ${VAR_LABEL[field]}` }
|
2026-10-15 17:11:17 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return defs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const muteText = (m) => (m === undefined ? '' : m ? 'Muted' : 'Unmuted')
|
|
|
|
|
|
|
|
|
|
/** All current values of one entity, keyed by variable id. */
|
|
|
|
|
export function entityVariableValues(inst, ent, n) {
|
|
|
|
|
const s = inst.state
|
2026-10-20 10:25:39 -04:00
|
|
|
const p = `${VAR_PREFIX[ent]}_${n}_`
|
|
|
|
|
if (ent === 'minput') return { [`${p}name`]: s.displayName(ent, n) }
|
2026-10-15 17:11:17 -04:00
|
|
|
const out = { [`${p}name`]: s.displayName(ent, n), [`${p}fader`]: fmtDb(s.getFader(ent, n)), [`${p}mute`]: muteText(s.getMute(ent, n)) }
|
|
|
|
|
if (ent === 'input') out[`${p}pan`] = fmtPan(s.getPan(n))
|
|
|
|
|
if (ent === 'buss') {
|
|
|
|
|
out[`${p}mode`] = s.bussMode(n) === 'group' ? 'Group' : 'Aux'
|
|
|
|
|
const st = s.busses.get(n)?.stereo
|
|
|
|
|
out[`${p}stereo`] = st === undefined ? '' : st ? 'Stereo' : 'Mono'
|
|
|
|
|
}
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function snapshotVariableValues(inst) {
|
|
|
|
|
const s = inst.state.snapshots
|
|
|
|
|
const cur = s.list.get(s.current)
|
|
|
|
|
return {
|
|
|
|
|
snapshot_index: s.current ?? '',
|
|
|
|
|
snapshot_name: cur?.name ?? '',
|
|
|
|
|
snapshot_cue: cur ? fmtCue(cur.cue) : '',
|
|
|
|
|
snapshot_count: s.count ?? s.list.size,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Everything, after the definitions were rebuilt. */
|
|
|
|
|
export function getAllVariableValues(inst) {
|
|
|
|
|
const s = inst.state
|
|
|
|
|
const out = { console_name: s.console.name, session_name: s.console.session, connected: inst.connectedFlag ? 'Yes' : 'No', ...snapshotVariableValues(inst) }
|
|
|
|
|
for (const ent of Object.keys(ENTITY_VARS)) for (const n of s.numbers(ent)) Object.assign(out, entityVariableValues(inst, ent, n))
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Variable values affected by one event; {} when none. */
|
|
|
|
|
export function getEventVariableValues(inst, ev) {
|
|
|
|
|
switch (ev.kind) {
|
|
|
|
|
case 'consoleName':
|
|
|
|
|
return { console_name: ev.value }
|
|
|
|
|
case 'session':
|
|
|
|
|
return { session_name: ev.value }
|
|
|
|
|
case 'name':
|
|
|
|
|
case 'fader':
|
|
|
|
|
case 'mute':
|
|
|
|
|
case 'pan':
|
|
|
|
|
return entityVariableValues(inst, ev.ent, ev.n)
|
|
|
|
|
case 'snapCurrent':
|
|
|
|
|
case 'snapName':
|
|
|
|
|
case 'snapCount':
|
|
|
|
|
return snapshotVariableValues(inst)
|
|
|
|
|
case 'bussTypes':
|
|
|
|
|
case 'bussModes': {
|
|
|
|
|
// stereo / mono (and aux / group) for every buss; no definition rebuild for a stereo flag alone
|
|
|
|
|
const out = {}
|
|
|
|
|
for (const n of inst.state.existing('buss')) Object.assign(out, entityVariableValues(inst, 'buss', n))
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
return {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Short text for last_change, or '' when the event is not worth showing. */
|
|
|
|
|
export function describeChange(inst, ev) {
|
|
|
|
|
const s = inst.state
|
|
|
|
|
const who = (ent, n) => `${ENT_LABEL[ent]} ${n} (${s.displayName(ent, n)})`
|
|
|
|
|
switch (ev.kind) {
|
|
|
|
|
case 'fader':
|
|
|
|
|
return `${who(ev.ent, ev.n)} fader ${fmtDb(ev.value)}`
|
|
|
|
|
case 'mute':
|
|
|
|
|
return `${who(ev.ent, ev.n)} ${ev.value ? 'muted' : 'unmuted'}`
|
|
|
|
|
case 'solo':
|
|
|
|
|
return `${who(ev.ent, ev.n)} solo ${ev.value ? 'on' : 'off'}`
|
|
|
|
|
case 'pan':
|
|
|
|
|
return `${who(ev.ent, ev.n)} pan ${fmtPan(ev.value)}`
|
|
|
|
|
case 'send':
|
|
|
|
|
return `Input ${ev.ch} send ${ev.buss} ${ev.field} ${ev.field === 'level' ? fmtDb(ev.value) : ev.value}`
|
|
|
|
|
case 'group':
|
|
|
|
|
return `Input ${ev.ch} group ${ev.buss} ${ev.value ? 'assigned' : 'unassigned'}`
|
|
|
|
|
case 'snapCurrent':
|
|
|
|
|
return `Snapshot ${ev.value}`
|
|
|
|
|
default:
|
|
|
|
|
return ''
|
|
|
|
|
}
|
|
|
|
|
}
|