Remap multiple MIDI CC values in realtime

The transformer does what I need but I need to map a lot more MIDI CC values in realtime. I need something like the MIDI transformer just with 50 transformations instead of one. Is that possible? It is possible in Apple’s Logic.

Hi,

In the MIDI Input Transform, you can use up to 4 Modules. No more.

What is your use case, please?

Map a hardware synth to a software plugin.

Hi,

Isn’t it better to use the Quick Controls?

My synth has more than 8 buttons. So you are probably speaking about the VST quick controls. I can use it to map CCs to plugin buttons but I can’t change the values like in Transform. For example the saw wave has a MIDI CC57 value of 72 in the hardware and 54 in the plugin. In the VST quick controls I can map the MIDI-CC but not it’s values.

The new MIDI Remote can do scripting. So it could probably do this, right? I’m a bit afraid to read the more than 100 pages in the manual. :wink: It would be so much easier to just use multiple Transform rules.

Perhaps a 3rd party tool such as Bome MIDI Translator Pro could be an option?

Yeah, something like this, just as VST3 for macOS perhaps? :grin:

Can you please name the synth and the plugin?

Also,do you want to control just this one plugin or many others as well? Martin’s suggestion is the best approach when it comes to controlling all vsts.

If your synth sends unique midi cc for each of its controls, normally you won’t even have problems with assigning them to many quick controls (you can even alter the number of quick controls per bank if you have many hardware knobs/buttons/faders etc).

If, however, its controls are sending the same ccs (per group) with different values, then, yes you can go for scripting.

This applies to nearly all synths and plugins. There is no MIDI definition for which number is a saw tooth, square, sine or which number is mono/poly/arp or whatever. Binary switches are normally 0 and 127, but switches with multiple values are problematic.

Even better! Yes, why not?

OK, I probably need to take a look at the 110 manual pages of the MIDI remote. Shiver… :cold_face:

Exactly. The reason I asked for the synth model was to have a look at its midi implementation, so that I can further suggest using the midi remote assistant or build a snippet to use for this device which most probably wouldn’t take long.

You can start with a small script given by the manual inside the Public folder, it will help :slight_smile:

Korg Minilogue XD

I’ve programmed in JavaScript before. So that’s not the problem.

Cool! You have to build a script now that I saw its MIDI implementation or use an external utility as suggested by mlindeb.

Great!

OK, I have created the MIDI Remote interface in Cubase. But I can only assign Cubase functions. Where can I change the MIDI messages? Or where can I build a script?

I don’t want to interfere too much here, you are probably better off writing a script. But just for the records, when Martin said Quick Controls I think he meant the whole Remote Control Editor. It allows for far more than 8 assignments. You can access it by right clicking in the Cubase generated plugin head bar…

It allows for more than just 8 assignments. Any parameter can be mapped. However, not something like CC57 value 13 = saw tooth

Yes, the Remote Control Editor for the VST Quick Controls can’t change MIDI CC values, just map MIDI CC to a knob.

I’ve also looked at the API for scripting over here, but I can’t see any MIDI changes. It only allows color changes etc. of the remote interface.

So, I guess, a MIDI mapping plugin is the last possibility.

… or if I’m lucky Steinberg implements multiple Transformer rules in Cubase 13. :stuck_out_tongue: There was already a leak suggesting that they changed the “UI” of the MIDI plugins. That hopefully includes this new functionality. :wink:

Unfortunately, this is not the way to go, I mean, you don’t first design a surface using the assistant. The whole design and assignments have to be done inside a script.

You have to follow the instructions in the API’s html file in order to create the necessary subfolders and then create a file, give it a .js extension and put it there. You can have a look at the midi remote’s public folder, in order to get an idea of how the structure is, and how the js is constructed.

The API holds a special element, customProcessVariable. You can receive any MIDI messages and then based on filtering the value received, you can trigger customProcessVariables. These variables have to be assigned to whichever control element you need, in our case, the qc controls.

Exactly. The idea is to use the controls of the Minilogue to access the quick controls as setup using the remote control editor.

Wow! Now we are getting really deep! :grinning: Thank you!

There is no customProcessVariable in the API. And when I google it, only your forum comments pop up. So it’s either undocumented or Steinberg changed it.

Maybe it works with this???

faderStrip.fader.mSurfaceValue.mOnProcessValueChange = function (context, newValue, oldValue){
let plugin_value = 0;
if(newValue == 72) {
plugin_value = 54;
}
// then send this to the VST quick control somehow?
// or bind the quick control to the fader and change the fader to 54?
}

I’m getting in over my head. :cowboy_hat_face:

Sure, my bad. It’s customValueVariable.

It could for very specific actions, but not in the case you want.

Please forget all about translating to midi CCs. What you need, and the API can do is to translate into different customValueVariables which will then be assigned to the hostValues (API terminology) we want, in our case here, instrument quick controls, but you can follow the same for inserts quick controls.

Here’s a snippet for “translating” values 72 and 73, and then bind them to quick controls 1 and 2:

var aCustomValueVariable1=surface.makeCustomValueVariable("aCustomValueVariable1")

var aCustomValueVariable2=surface.makeCustomValueVariable("aCustomValueVariable2")

faderStrip.fader.mSurfaceValue.mOnProcessValueChange = function (activeDevice,value,diff){

    //value is in the range [0,1]
    //We'll translate it here to [0,127]

    var value127=Math.round(127*value)
   
    switch(value127){

        case 72:
            //trigger the first custom var, let's make it toggle
            aCustomValueVariable1.setProcessValue(activeDevice,1-aCustomValueVariable1.getProcessValue(activeDevice))
            break 
        
         case 73:
            //now let's trigger the second custom var 
            aCustomValueVariable2.setProcessValue(activeDevice,1-aCustomValueVariable2.getProcessValue(activeDevice))
            break 
        
         //add more if needed here
    
    }

}

var instrumentPluginSlotBankZone=page.mHostAccess.mTrackSelection.mMixerChannel.mInstrumentPluginSlot.mParameterBankZone

var qc1=instrumentPluginSlotBankZone.makeParameterValue()
var qc2=instrumentPluginSlotBankZone.makeParameterValue()
//in our example, both the above should be of button type in order to properly function, and since we want the same cc to be translated to different "ccs", I have to suppose that we indeed talk about buttons
//This means that inside the remote editor we should take care off parameters and place the ones of button type to the slots that we plan to trigger using our remote
//In this example, the very first two slots of the quick controls should be assigned to button-like params

page.makeValueBinding(aCustomValueVariable1,qc1)
page.makeValueBinding(aCustomValueVariable2,qc2)

1 Like

Thanks, I have to look at it when I have time.