Workaround: Midi Remote-> Integration of "Listen" function (just like Solo, Mute etc)

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)
    
    }

}
1 Like