The snippet I posted there was just for handling the combined panner, without getting into sending feebdack. However it is totally doable.
Here’s for example a snippet for controlling the “Listen” state for a mixer zone of 8 tracks, where we also send the current listen state to the controller.
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver('Test', 'Listen Binding', 'mc')
var midiInput = deviceDriver.mPorts.makeMidiInput("input")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("output")
var detect = deviceDriver.makeDetectionUnit()
detect.detectPortPair(midiInput, midiOutput)
.expectInputNameEquals("input port name")
.expectOutputNameEquals("output port name")
var surface=deviceDriver.mSurface
var mapping=deviceDriver.mMapping
var buttons=[]
var labels=[]
var leds=[]
for(var i=0;i<8;i++){
var button=surface.makeButton(4*i,1,4,1)
button.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(0,8+i)
buttons.push(button)
var label=surface.makeLabelField(4*i,1,4,1)
labels.push(label)
var led=surface.makeLamp(4*i+2,0,1,1)
leds.push(led)
}
var pageDefault=mapping.makePage("Default")
var mixZone=pageDefault.mHostAccess.mMixConsole.makeMixerBankZone("mixZone")
mixZone.excludeInputChannels()
mixZone.excludeOutputChannels()
var daChannels=[]
var daListenTag=4111
for(var i=0;i<8;i++){
var channel=mixZone.makeMixerBankChannel()
var daChannel=pageDefault.mHostAccess.makeDirectAccess(channel)
daChannels.push(daChannel)
pageDefault.setLabelFieldText(labels[i],"Listen "+i)
buttons[i].mSurfaceValue.mOnProcessValueChange=function(activeDevice,value,diff){
//toggling
if(value==1){
var baseObjectID=daChannels[this.i].getBaseObjectID(currentMapping)
var prevListenValue=daChannels[this.i].getParameterProcessValue(currentMapping,baseObjectID,daListenTag)
var newListenValue=1-prevListenValue
daChannels[this.i].setParameterProcessValue(currentMapping,baseObjectID,daListenTag,newListenValue)
}
}.bind({i})
daChannels[i].mOnParameterChange=function(activeDevice,activeMapping,objectID,paramTag){
if(paramTag==daListenTag){
var listenValue=daChannels[this.i].getParameterProcessValue(activeMapping,objectID,daListenTag)
leds[this.i].mSurfaceValue.setProcessValue(activeDevice,listenValue)
//send feedback - example
midiOutput.sendMidi(activeDevice,[0xb0,this.i,127*listenValue])
}
}.bind({i})
}
var currentMapping
pageDefault.mOnActivate=function(activeDevice,activeMapping){
currentMapping=activeMapping
for(var i=0;i<8;i++){
daChannels[i].activate(activeMapping)
var initListenState=daChannels[i].getParameterProcessValue(activeMapping,daChannels[i].getBaseObjectID(activeMapping),daListenTag)
leds[i].mSurfaceValue.setProcessValue(activeDevice,initListenState)
//send feedback here too
midiOutput.sendMidi(activeDevice,[0xb0,i,127*initListenState])
}
}
pageDefault.mOnDeactivate=function(activeDevice,activeMapping){
for(var i=0;i<8;i++){
daChannels[i].deactivate(activeMapping)
}
}