SOLVED: Access desired insert slot of selected track and control its parameters with MR

Dear community,

what I´m trying to achieve using midi remote script is:

  1. Access the desired insert slots of a selected track
  2. Control its parameters with for example knobs 1-8
  3. Choose another insert slot and control its parameters with the same knobs 1-8

This is a starting point but I cannot adapt it to my needs:

https://forums.steinberg.net/t/where-im-still-using-the-generic-remote/999096/4?u=emre_akca

My approach uses one subpage for each insert slot. When activating the subpage the knobs get bind to the insertViewer of the according slot but the parameters are not controlled though Cubase indicates midi coming in and going out.

This is a condensed excerpt of my code just using two subpages and two knobs:

var subPagesInsertSlots = [];
  var buttons = [];
  var knobs = [];

  for (var i = 0; i < 2; i++) {
    // create subPages and buttons for activation
    subPagesInsertSlots[i] = subPageAreaB.makeSubPage("insertSlot" + i);
    buttons[i] = surface.makeCustomValueVariable("button for subpage insertSlot" + i);
    buttons[i].mMidiBinding
      .setInputPort(midiInput)
      .setOutputPort(midiOutput)
      .bindToNote(2, 32 + i);
    page.makeActionBinding(buttons[i], subPagesInsertSlots[i].mAction.mActivate);

    // create knobs for controlling insert parameters
    var knob = surface.makeCustomValueVariable("knob" + i);
    knob.mMidiBinding
      .setInputPort(midiInput)
      .setOutputPort(midiOutput)
      .bindToControlChange(1, 81 + i);
    knobs[i] = knob;
  }

  // create insertViewers for each slot
  var insertViewers = [];
  for (var insertSlot = 0; insertSlot < 16; insertSlot++) {
    var insertViewer = selectedTrackChannel.mInsertAndStripEffects.makeInsertEffectViewer("Slot " + insertSlot);
    insertViewer.accessSlotAtIndex(insertSlot);
    insertViewers[insertSlot] = insertViewer;
  }
  // when activating subpages bind knobs to according slots insert params
  for (var insertSlot = 0; insertSlot < subPagesInsertSlots.length; insertSlot++) {
    subPagesInsertSlots[insertSlot].mOnActivate = function () {
      console.log("insert" + this.insertSlot);
      for (var paramIdx = 0; paramIdx < 2; paramIdx++) {
        var param = insertViewers[this.insertSlot].mParameterBankZone.makeParameterValue();
        page.makeValueBinding(knobs[paramIdx], param);
      }
    }.bind({insertSlot});
  }

It would be great if someone could help out, thanks in advance!

Cheers, Emre

This is wrong. You should never use an activation event for dynamically binding. Binding is static.

Correct:

var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver("Test","Insert Slots","m.c")

var midiInput = deviceDriver.mPorts.makeMidiInput("anInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("anOutput")

var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectPortPair(midiInput,midiOutput)
    .expectInputNameEquals("Bome MIDI Translator 1")
    .expectOutputNameEquals("Bome MIDI Translator 1")

//It's a good practice to not mix surface creation with mappings
//First create the surface
var surface=deviceDriver.mSurface

var buttons=[]
var knobs=[]

var numOfSlotsToControl=2
var numOfParamsToControl=2

for (var i=0;i<numOfSlotsToControl;i++){

    buttons[i]=surface.makeCustomValueVariable("button for subpage insertSlot"+i)

    buttons[i].mMidiBinding
      .setInputPort(midiInput)
      .setOutputPort(midiOutput)
      .bindToNote(2,32+i)

}

for(var i=0;i<numOfParamsToControl;i++){

   var knob=surface.makeCustomValueVariable("knob" + i)
    knob.mMidiBinding
      .setInputPort(midiInput)
      .setOutputPort(midiOutput)
      .bindToControlChange(1,81+i)

    knobs[i]=knob

}

//Create mappings
var mapping=deviceDriver.mMapping

var page=mapping.makePage("Default")
var selectedTrackChannel=page.mHostAccess.mTrackSelection.mMixerChannel 

var subPageAreaB=page.makeSubPageArea("subPageAreaB")

var subPagesInsertSlots=[]
var insertViewers=[]

for (var i=0;i<numOfSlotsToControl;i++){

    // create subPages
    subPagesInsertSlots[i]=subPageAreaB.makeSubPage("insertSlot"+i)
    
    page.makeActionBinding(buttons[i],subPagesInsertSlots[i].mAction.mActivate)  

    var insertViewer=selectedTrackChannel.mInsertAndStripEffects.makeInsertEffectViewer("Slot "+i)

    insertViewer.accessSlotAtIndex(i)

    insertViewers[i]=insertViewer

    for(var paramIdx=0;paramIdx<numOfParamsToControl;paramIdx++){

        var param=insertViewers[i].mParameterBankZone.makeParameterValue()
    
        page.makeValueBinding(knobs[paramIdx],param).setSubPage(subPagesInsertSlots[i])

    }

}

1 Like

Oh I see, thank you so much! I spent two full days to solve this, but couldn´t. Your help is much appreciated!

1 Like