No, as far as I know. See EDIT 2.
However, we can always light up a lamp, when we have a plugin in the slot:
// Opening/Closing insert slots of Selected track
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver("Test","Edit Inserts v2","m.c")
var midiInput = deviceDriver.mPorts.makeMidiInput("anInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("anOutput")
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectPortPair(midiInput, midiOutput)
.expectInputNameEquals("an input")
.expectOutputNameEquals("an output")
var page=deviceDriver.mMapping.makePage("page")
var SelectedTrackInsertsEditButtons=[]
var pseudoButtons=[]
for(var i=0;i<16;i++){
var button=deviceDriver.mSurface.makeButton(i,0,1,1)
button.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(8,1+i) //channel 9
SelectedTrackInsertsEditButtons.push(button)
var pseudoButton=deviceDriver.mSurface.makeLamp(i,1,1,0.5)
pseudoButtons.push(pseudoButton)
}
var lstOfNonEmptySlotsBeforeActivation=[]
for(var i=0;i<16;i++){
var insertSlot=page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.makeInsertEffectViewer("insertSlot"+i)
insertSlot.accessSlotAtIndex(i)
page.makeValueBinding(SelectedTrackInsertsEditButtons[i].mSurfaceValue,insertSlot.mEdit).setTypeToggle()
insertSlot.mOnChangePluginIdentity=function(activeDevice,activeMapping,pluginName,pluginVendor,pluginVersion,formatVersion){
if(pluginName==""){
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,0)
} else {
if(pageActivated==false){
lstOfNonEmptySlotsBeforeActivation.push(this.i)
} else {
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,1)
}
}
}.bind({i})
}
var pageActivated=false
page.mOnActivate=function(activeDevice,activeMapping){
pageActivated=true
//This is necessary since the mOnPluginChange will get triggered before the page activation at first start, but it will not alter the pseudoButton.mSurfaceValue
if(lstOfNonEmptySlotsBeforeActivation.length>0){
for(var i=0;i<lstOfNonEmptySlotsBeforeActivation.length;i++){
pseudoButtons[lstOfNonEmptySlotsBeforeActivation[i]].mSurfaceValue.setProcessValue(activeDevice,1)
}
lstOfNonEmptySlotsBeforeActivation=[]
}
}
EDIT:
We can even display the plugin Name per slot (and abandon the lamp idea if we want). This will make clear which slots contain what.
// Opening/Closing insert slots of Selected track
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver("Test","Edit Inserts v2","m.c")
var midiInput = deviceDriver.mPorts.makeMidiInput("anInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("anOutput")
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectPortPair(midiInput, midiOutput)
.expectInputNameEquals("an input")
.expectOutputNameEquals("an output")
var page=deviceDriver.mMapping.makePage("page")
var SelectedTrackInsertsEditButtons=[]
var pseudoButtons=[]
var labels=[]
for(var i=0;i<16;i++){
var button=deviceDriver.mSurface.makeButton(4*i,0,4,4)
button.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(8,1+i) //channel 9
SelectedTrackInsertsEditButtons.push(button)
var pseudoButton=deviceDriver.mSurface.makeLamp(4*i,4,4,2)
pseudoButtons.push(pseudoButton)
var label=deviceDriver.mSurface.makeLabelField(4*i,6,4,1)
labels.push(label)
}
var lstOfNonEmptySlotsBeforeActivation=[]
for(var i=0;i<16;i++){
var insertSlot=page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.makeInsertEffectViewer("insertSlot"+i)
insertSlot.accessSlotAtIndex(i)
page.makeValueBinding(SelectedTrackInsertsEditButtons[i].mSurfaceValue,insertSlot.mEdit).setTypeToggle()
page.setLabelFieldHostObject(labels[i],insertSlot.mParameterBankZone)
insertSlot.mOnChangePluginIdentity=function(activeDevice,activeMapping,pluginName,pluginVendor,pluginVersion,formatVersion){
if(pluginName==""){
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,0)
} else {
if(pageActivated==false){
lstOfNonEmptySlotsBeforeActivation.push(this.i)
} else {
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,1)
}
}
}.bind({i})
}
var pageActivated=false
page.mOnActivate=function(activeDevice,activeMapping){
pageActivated=true
//This is necessary since the mOnPluginChange will get triggered before the page activation at first start, but it will not alter the pseudoButton.mSurfaceValue
if(lstOfNonEmptySlotsBeforeActivation.length>0){
for(var i=0;i<lstOfNonEmptySlotsBeforeActivation.length;i++){
pseudoButtons[lstOfNonEmptySlotsBeforeActivation[i]].mSurfaceValue.setProcessValue(activeDevice,1)
}
lstOfNonEmptySlotsBeforeActivation=[]
}
}
EDIT 2:
Instead of directly assigning the midi messages to our buttons, we can assign them to custom variables, use the trigger event of these vars, and alter the “real” buttons values, only when a plugin exists in a specific slot. This way we can have some type of “disable”.
// Opening/Closing insert slots of Selected track
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver("Test","Edit Inserts v2","m.c")
var midiInput = deviceDriver.mPorts.makeMidiInput("anInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("anOutput")
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectPortPair(midiInput, midiOutput)
.expectInputNameEquals("an input")
.expectOutputNameEquals("an output")
var page=deviceDriver.mMapping.makePage("page")
var customVars=[]
var SelectedTrackInsertsEditButtons=[]
var pseudoButtons=[]
var labels=[]
for(var i=0;i<16;i++){
var customVar=deviceDriver.mSurface.makeCustomValueVariable("customVar"+i)
customVar.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(8,1+i)
customVars.push(customVar)
var button=deviceDriver.mSurface.makeButton(4*i,0,4,4)
SelectedTrackInsertsEditButtons.push(button)
var pseudoButton=deviceDriver.mSurface.makeLamp(4*i,4,4,2)
pseudoButtons.push(pseudoButton)
var label=deviceDriver.mSurface.makeLabelField(4*i,6,4,1)
labels.push(label)
}
var lstOfNonEmptySlotsBeforeActivation=[]
var mapOfPluginNames={}
for(var i=0;i<16;i++){
var insertSlot=page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.makeInsertEffectViewer("insertSlot"+i)
insertSlot.accessSlotAtIndex(i)
page.makeValueBinding(SelectedTrackInsertsEditButtons[i].mSurfaceValue,insertSlot.mEdit).setTypeToggle()
page.setLabelFieldHostObject(labels[i],insertSlot.mParameterBankZone)
customVars[i].mOnProcessValueChange=function(activeDevice,value,diff){
var pluginName=mapOfPluginNames[this.i]
if(pluginName!=""){
SelectedTrackInsertsEditButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,value)
}
}.bind({i})
insertSlot.mOnChangePluginIdentity=function(activeDevice,activeMapping,pluginName,pluginVendor,pluginVersion,formatVersion){
mapOfPluginNames[this.i]=pluginName
if(pluginName==""){
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,0)
} else {
if(pageActivated==false){
lstOfNonEmptySlotsBeforeActivation.push(this.i)
} else {
pseudoButtons[this.i].mSurfaceValue.setProcessValue(activeDevice,1)
}
}
}.bind({i})
}
var pageActivated=false
page.mOnActivate=function(activeDevice,activeMapping){
pageActivated=true
//This is necessary since the mOnPluginChange will get triggered before the page activation at first start, but it will not alter the pseudoButton.mSurfaceValue
if(lstOfNonEmptySlotsBeforeActivation.length>0){
for(var i=0;i<lstOfNonEmptySlotsBeforeActivation.length;i++){
pseudoButtons[lstOfNonEmptySlotsBeforeActivation[i]].mSurfaceValue.setProcessValue(activeDevice,1)
}
lstOfNonEmptySlotsBeforeActivation=[]
}
}