Cubase 12.0.50 MIDI Remote "Parameter Bank" controls

it seems that the first 8 parameters of the “remote control editor” coincide with the 8 Quick Controls, so it is better to set it from 9 onwards.

bye

2 Likes

Yeah, this is exactly my reaction too!

Really awesome to see the new additions, and I’ve been waiting for them to do the insert slots, but that you have to shuffle through the slots to edit or bypass seems a little odd compared to have just for each of the slots (or at least the option of it).
But looking at the scripting Programmers API guide it does look like it’s available through scripting, if I read the code correctly. Haven’t tried it yet :slight_smile:

Still, I do not understand what is the use of introducing a new function like the parameter command, instead of adding the previus-next (etc.) commands to the focus quick control menu. Now we have 3 different menus controlling parameters, instead of 2. AFAIK the new par function must be focus to listen (like FQC). It’s like canceling FQC. Is there a way to combine these two that I’m missing?

There’s two reasons really, The instrument “slot” is not in the same control target as the insert slots. So firstly, That’s why you have a set of controls for instruments and set of controls for inserts.

MCU and all previous “deeper” mapping protocols all follow a similar rule, so most DAW’s built with MCU as the main control protocol (i.e. Logic) operates in the same manner too.

Secondly, “Focused” quick controls are just as they say on the tin, they’re controls tied entirely to what is in focus on your screen with the optional ability to lock them or not. It’s a super easy method of changing what’s in your face at any time.

These new set of parameters are not related to such focus, like MCU, you can select an instrument, or scroll through the inserts slots and adjust parameters across any of those pluigin instances, and never have to open a plugin window. It’s up to the user if they want to roll with it on a selected track basis, or you can even target specific tracks.

So yes, it’s two different target types (inserts vs instruments), and two different concepts (focused vs MCU style).

Luckily the MIDI remote gives you pages, so it’s very easy to have a button that either toggles between FQC, Instrument or Insert pages. Or create 3 distinct buttons on your hardware if available.

Why there’s not paging on FQC, I don’t know the answer to that - All I can presume is that behind the scenes these new parameter controls are piggy backing on the existing MCU controls that has most of these functions pre-defined.

It’s a bit of a mess, in honesty as like you say, functions appear to undermining /cancel others… However, if you’ve played with remote mappings with Cubase for a number of years it’s more straight forward and understandable.

Most users will be happy with FQC and never need or see these other options, I guess that’s the general consensus?

Or there will be some kind of massive tidy up at the end and everything is moved to FQC? Who knows! :slight_smile:

2 Likes

Thanks for spending the time answering.

It is very clear to me the reason of the existence of these two different functions. Quick Control, Focus Quick Control and the 2 submenus of the new Parameter functions were on my mind when I was speaking of 3 controller set.

Exaclty as you said…

Oh goodness, @saxmand, you found another “accidentally slipped” thing here. I’m afraid you have to ignore the SimpleExample entirely. I must have committed that file without checking it. But it gives an interesting insight of my thinking process ;-).

Sorry for the mess :exploding_head:

Thanks for confirming this @Jochen_Trappe.

Yeah I’ve been sitting with it scratching my head as I couldn’t make anything work really. Seemed to be a lot of functions that are also named different now.

Is it possible to assign parameters for the channelstrip section via script, or is it only available in the MIDI Remote Mapping Assistant?

yes, of cause!

Example code:

var page = deviceDriver.mMapping.makePage('Default')

var stripEffects = page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.mStripEffects
var compressor = stripEffects.mCompressor
var comprParam1 = compressor.mParameterBankZone.makeParameterValue()
var comprParam2 = compressor.mParameterBankZone.makeParameterValue()
var comprParam3 = compressor.mParameterBankZone.makeParameterValue()

page.makeValueBinding(knob1.mSurfaceValue, comprParam1)
page.makeValueBinding(knob2.mSurfaceValue, comprParam2)
page.makeValueBinding(knob3.mSurfaceValue, comprParam3)
page.makeActionBinding(button1.mSurfaceValue, compressor.mParameterBankZone.mAction.mPrevBank)
page.makeActionBinding(button2.mSurfaceValue, compressor.mParameterBankZone.mAction.mNextBank)

1 Like

Awesome Thanks @Jochen_Trappe. That worked. Surprisingly easy.
I didn’t realised that they are just assigned one after the other.

So I’d like to try and have all strip effects on on page. And then trying to figure out how to assign specific subpages (various inserts) to a specific button on my mixer.

Right now I can only go to the prev page, next page or reset page.

Is there a way to do this. This is how my script looks right now:
(also there could be a much better way of doing this then what I’m currently doing)


function makePageChannelStrip() {
    var page = makePageWithDefaults('Channelstrip')

    var strip = page.makeSubPageArea('strip')
    var gatePage = makeSubPage(strip, 'Gate')
    var compressorPage = makeSubPage(strip, 'Compressor')
    var toolsPage = makeSubPage(strip, 'Tools')
    var saturatorPage = makeSubPage(strip, 'Saturator')
    var limiterPage = makeSubPage(strip, 'Limiter')

    var selectedTrackChannel = page.mHostAccess.mTrackSelection.mMixerChannel

    page.makeActionBinding(surfaceElements.channelControls[0].sel_button.mSurfaceValue, strip.mAction.mPrev)
    page.makeActionBinding(surfaceElements.channelControls[1].sel_button.mSurfaceValue, strip.mAction.mNext)

    var stripEffects = selectedTrackChannel.mInsertAndStripEffects.mStripEffects


    for (var idx = 0; idx < surfaceElements.numStrips; ++idx) {
        var faderSurfaceValue = surfaceElements.channelControls[idx].fader.mSurfaceValue;

        page.makeValueBinding(faderSurfaceValue, stripEffects.mGate.mParameterBankZone.makeParameterValue()).setSubPage(gatePage).setValueTakeOverModeJump()
        page.makeValueBinding(faderSurfaceValue, stripEffects.mCompressor.mParameterBankZone.makeParameterValue()).setSubPage(compressorPage).setValueTakeOverModeJump()
        page.makeValueBinding(faderSurfaceValue, stripEffects.mTools.mParameterBankZone.makeParameterValue()).setSubPage(toolsPage).setValueTakeOverModeJump()
        page.makeValueBinding(faderSurfaceValue, stripEffects.mSaturator.mParameterBankZone.makeParameterValue()).setSubPage(saturatorPage).setValueTakeOverModeJump()
        page.makeValueBinding(faderSurfaceValue, stripEffects.mLimiter.mParameterBankZone.makeParameterValue()).setSubPage(limiterPage).setValueTakeOverModeJump()
    }


    return page
}

as ‘jump’ is the default you can remove it, makes the code cleaner :wink:

gatePage.mAction.mActivate // should be available to be bound via "makeActionBinding"

Really nice @Jochen_Trappe. That worked smoothly.

I guess I’m only really missing one thing now, which is to be able to enable as well as change between the different fx from the midi controller?

Skærmbillede 2022-11-13 kl. 23.02.21

My guess is that maybe it would be using .mEdit as it’s the only available parameter left, but I haven’t managed to had luck making it do anything.

There’s also mOnChangePluginIdentity which I haven’t figured out what is doing. I don’t get anything when I try to do this:

    stripEffects.mCompressor.mOnChangePluginIdentity = function (activeDevice, arg1, arg2, arg3, arg4, arg5) {
        console.log(arg2 + '')
        console.log(arg3 + '')
        console.log(arg4 + '')
        console.log(arg5 + '')
    }

Thanks again.

Also, I was also wondering, I have this page structure:
(example code)

var sendsPage = makePageSends()
var channelStripPage = makePageChannelStrip()
var insertsPage = makePageInserts()


function makePageSends() {
    var page = makePageWithDefaults('Sends')
   ... etc
    return page
}

function makePageChannelStrip() {
    var page = makePageWithDefaults('ChannelStrip')
   ... etc
    return page
}
...etc

function makePageWithDefaults(name) {
    var page = deviceDriver.mMapping.makePage(name)
    ...etc    
    return page
}

...etc

Is there a way to script it, so I can assign a midi button to change to a specific of those pages.
I figured out to do it “manually” via the mapping assistant, but doesn’t seem optimal, as I experienced when working with the script that it lost those manual settings. Also cause I have 6 different ones.

So basically how you showed me for the subPage, but for the mapping pages…

Thanks in advance

Thanks for all the explanation above, this works brilliantly with the channel strip effects.

I tried to set up the control of insert effects in a similar fashion, but I can’t seem to make it work using the script. Can someone point me in the right direction?

There doesn’t seem to be a makeParameterValue() function for the insert effects viewer.
I assume it should be done using makeInsertEffectsViewer() function but I can’t figure out right the way to do it.

Here we go, answering my own question for reference :slight_smile:

Happy days!

var HostInsertViewer = page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.makeInsertEffectViewer('')
    .excludeEmptySlots()

var PrevInsert = HostInsertViewer.mAction.mPrev
var NextInsert = HostInsertViewer.mAction.mNext

for(var r = 0; r < 16; ++r) {
    var ChannelInsertParameter = HostInsertViewer.mParameterBankZone.makeParameterValue()
    page.makeValueBinding(knobs[r].mSurfaceValue, ChannelInsertParameter)

}

page.makeActionBinding(buttons[3].mSurfaceValue, PrevInsert)
page.makeActionBinding(buttons[7].mSurfaceValue, NextInsert)

4 Likes

I’ll answer myself on this one too, as I just found a way around to do it. Probably not the best way but works great so far.
Basically what I did is add the pages as blank ones as one of the first things in the script. This way they are available when the scripts creates action bindings.
To fill it in on my pseudo script from above.

// This is the added code to make them available
var sendsPage = deviceDriver.mMapping.makePage('Sends')
var sendsPage = deviceDriver.mMapping.makePage('ChannelStrip')
etc...

var sendsPage = makePageSends()
var channelStripPage = makePageChannelStrip()
var insertsPage = makePageInserts()


function makePageSends() {
    var page = makePageWithDefaults('Sends')
   ... etc
    return page
}

function makePageChannelStrip() {
    var page = makePageWithDefaults('ChannelStrip')
   ... etc
    return page
}
...etc

function makePageWithDefaults(name) {
    var page = deviceDriver.mMapping.makePage(name)
    ...etc    
    return page
}

...etc

And I can change to the page with this command as an example:

page.makeActionBinding(surfaceElements.channelControls[0].page_button.mSurfaceValue, eqPage.mAction.mActivate)

Starting to enjoy all the functionality.
I have another question I was hoping to clear up, maybe @Jochen_Trappe knows.

When hoovering over a surface element that has been mapped as an ActionBinding, is there a way to get that information/title/name (so I can send it to the MIDI controller display):
Here’s are two examples:

Skærmbillede 2022-11-21 kl. 23.25.06

And also there’s more info when hoovering over a surface elements that has been ValueBind. In the picture below I can only get “HiPass” and “H-Delay Stereo”, using mOnTitleChange

It would be really awesome and helpful if we could get more of those infos available in our script somehow, to get better overview of what the MIDI device is doing.

Thanks as always in advance

Hi Thomas,
may I ask how you exactly send parameter names and values to external displays?
Thanks in advance,
Emre

Using following code I am able to control the first parameter of a plugin which is assigned in the Remote Editor. How can I control the rest of my assigned parameters?

var knob1 = deviceDriver.mSurface.makeKnob(0, 0, 1, 1.5)

knob1.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.setOutputPort(midiOutput)
.bindToControlChange (0, 21) // channel 0, cc 21

var HostInsertViewer = page.mHostAccess.mTrackSelection.mMixerChannel.mInsertAndStripEffects.makeInsertEffectViewer(‘’)
.followPluginWindowInFocus ()

var ChannelInsertParameter = HostInsertViewer.mParameterBankZone.makeParameterValue()
page.makeValueBinding(knob1.mSurfaceValue, ChannelInsertParameter)

If I recall correctly, make another call to the …makeParameterValue() and it will give you the next one