Remote Editor Instrument Plugins Mappings

Hahaha! Aren’t we all!

1 Like

If it is of any help, I’m thinking to follow the assignments of a hardware synth.
There are so many out there, I should choose one, or maybe combine the “best” of more than one.

Do plug-ins know what type of control each of their parameters is?

Hi,

The plug-in developer sets the order of the parameters. Then you can see the order at Mackie device or if you switch the plug-in to the Genetic Controls view.

1 Like

Yes, ok. But do parameters know what “type of control” they are? Does a parameter that resembles a fader in the GUI “know” that it’s a fader? Or a knob? Or a switch?

For example, Helix Native. I was demo-ing that plug-in about a week ago. The parameter list was Knob1, Knob2, Knob3…Knob16. Switch1, Switch2, Switch3…and then a loooong list of CCs. And then the user decides from within the plug-in to connect a parameter in the GUI, e.g. Wah, or amp Gain, to a RCE parameter, e.g. Knob 1 or Knob 2. This is a breeze to setup with a controller. Knobs go to knobs, switches go to switches, use some CCs for faders, all done!

But in other plug-ins, the parameter list is just a list of parameters (Llfreq,Lhfreq,Llgain…etc etc). I need to see which parameter resembles what control, and decide that “the most important parameters resembling a knob will go to encoders 1-8. The most important parameters resembling a fader will go to faders 1-8”. If I have free space, I could assign a knob to a fader, if that could save me a page-turn and only if it is an intuitive mapping.

So, if we knew that “parameter 1 is a knob”, and “parameter 2 is a fader”, couldn’t we somehow sort the parameters in such a way so that “Knob parameters are assigned to knob pages, fader parameters to fader pages, and switch parameters to button pages.” Then we could shift those parameters around if we wanted, to bring those of “higher priority” to the first pages of each control, but it would be an easier task to do this for each control instead for the entirety of the parameter list.

Pff, that’s too confusing to read.

1 Like

I’m sure that the plugin knows the type, because I can see it inside the remote editor.

Anyway, I have set a feature request for this, if I understand you correctly.
https://forums.steinberg.net/t/mparameterbankzone-additional-property/831806

However, lately I tend to think that even this way,I couldn’t “automatically” do the assignments the way that I want as described in this thread here. I could obviously search the parameters’ names and do something, but it wouldn’t be stable enough.

After all, I think that it should be a 5-10minutes (an hour? ok, an hour) for a user to map in a “standard” way one plugin. And then we could have a big lib with all these mappings :slight_smile:

1 Like

Steinberg could learn a lot from Automap , Automap does precisely this , you have an empty controller template , press learn to what ever you want knob/fader/switch/ and move the parameter ,unlearn . save template , open new plugin and do the same with all your plugins , once they are done they are saved as one big template and automatically switch to what ever you have in focus . How can Novation get it right 12 years ago and Steinberg can’t even get half of the job done in thier own Daw

No searching through lists , just click and learn

1 Like

Does we can not use the remote device editor for exactly these things? It was said we could and I assumed this. If we can’t use it, I would suggest to follow user mchantzi: using a good synth template with at least two OSCs. A good example would be a Roland JD-800 setup or a Novation Peak.

PS@Martin.Jirsak: please answer my PMs :wink: .

1 Like

This is the one I actually think to follow :slight_smile:

1 Like

Sure. The remote editor will be used, it’s just that I’m searching for an “ideal” mapping.

Hi @Highly-Controversial,
I most probably didn’t explain the scope of this thread good enough. It is not about how to make our life easier when we midi-learn (I know about automap and the fact that it makes things easier, and after all I own a Nektar Panorama P6 which comes with many many plugins pre-mapped), but on what would seem as an optimal mapping.
I mean, before even we decide to midi-learn, how our layer should look in order to stay inside a universal context. Say, for example, you have 2 plugins, which both share a 80-90% of the same properties, envADSR, LFOs, other OSCs and so on. My idea (and quite sure I’m not the first to had this one) is that we should have a layout which would fit with both plugins so that our muscle memory will always guide us towards the control we need without too much thinking.
Now, the way to midi-learn these, comes afterwards, and I do agree that things could be easier on this side, however the mapping system of Cubase (with pages) is very suitable for implementations as mine. After all, I see many many plugins having the midi-learn functionality without the need for Cubase to be in the middle. But I would prefer to stay in the pages context. If they make mapping easier would be a big plus, no question about that, I agree :slight_smile:

Hello mchantzi,

I think I can understand the idea and philosophy but …
The strong point of MIDI Remote is just that is customizable at individual user level.

Even if you would invent today your own ‘Standard’ I predict it would not stand the test of time.

I read about the envelope (ADSR) and LFO’s. That’s pretty much focused on Synths. But other people use libraries from Native Instruments or SpitfireAudio - just to name a few, that do not benefit from ADSR or Filter alterations. (or standard mappings)
I never came up with a ‘Standard’ for myself, let alone a more global (Universal as you called it) ‘ideal’ standard. Nevertheless, I bookmark this thread for further reading.
Cheers!

1 Like

Well spotted! Actually I should really make my intentions clear. I’m mostly concerned about synths!

Very true! On the other hand, when it comes to synths as you obviously know, we tend to place our fingers where we think they’ll touch an Attack or a Resonance for example. And being able to do this for many synth plugins, at least for me, would get us out of the “trouble” to look at the screen, or try to guess where something is mapped :slight_smile:

1 Like

I quite like the way Nektar tried to standardise their mappings for instruments, i.e. first four faders for Env1/Filter, second set for Env2/Amp. Then the 8 rotaries for macro style controls, which normally would be Cutoff/Filter etc.

I do like working in 8s because it can scale across more devices… Trouble comes when you get hardware with 9 faders, do you break the mold or do you leave the 9th out of it and leave it for selected track volume outside of this scope? It’s more a problem when dealing with organ instruments where a 9th fader is nice to have.

For most synths I have an initial macro page of most useful params, then I’ll have a page for each oscilator, then envelopes, and then effects. I think to pair them out into 2x8 blocks as best as possible to allow for rotary-only or rotary+fader hardware in the same mapping would be relevant for the most amount of users.

As a side issue, I don’t think you can pick which RCE (Remote Control Editor) mapping the MR script uses can you? I think it’s fixed to the default/MCU one isn’t it?

There’s still quite a few loose threads in the new MR, just hope it keeps progressing and we can be more confident in helping each other out. Last thing you want to do is create a load of mappings and something changes that throws it on the floor.

In addition to this, I know back on the Logic forum we’d build automator scripts to scroll through plugins and save presets into the native Logic library - which provides you prev/next parameter control for third party plugins via remote. (Ref)

Cubase has the media bay and the similar options, yet another area where there’s no community activity.

2 Likes

Thank you for your insightful post @skijumptoes !

I find the remote editor pretty mature to expect changes to this, but, sure, you never know!

I have another, alternative approach instead of changing the template using the remote editor.
We can actually remap it inside the script, and I’ve already experimented with it on the channel strip’s stock effects (compressors, limiters etc). This approach however has two weaknesses: 1) If a user changes the remote mapping, it won’t work, and 2) if a manufacturer changes the default layout, by adding new parameters, again it won’t work and will need an update.
Anyway, this is how it works: I have a small script just for sniffing the default mappings. It spits out for every parameter, its index/bank ( I do too use the 8-params/bank approach). Then we create an array of the form: [ourKnobIndex1->paramIndexN1, ourKnobIndex2->paramIndexN2…].
So, when our plugin is loaded, we translate the original knob to another one and we have everything correctly mapped. I’ve abandoned this approach (at least for now).

Back to the original, using the remote editor. My new way of thinking is to create banks based on the parameter’s type.
My Keylab has 8 faders, knobs and buttons (I don’t count the 9th column, because I want it to be used in another way). So, using the remote editor, I’ve arranged parameters I like to be connected with faders to, say, bank1, the ones to knobs in bank2, and for buttons in bank3. And so on, for all parameters/bank. This way, the script knows at which type of control to assign what, making understanding the layout easier.

Anyway, just thoughts :slight_smile:

1 Like

True, and hardly understandable :slight_smile:

Ohhhh, nice idea. So you step through the params on track change and place them in a JS object which can then be used directly for MR value binds?

You could achieve that even if it’s not default mappings couldn’t you? By parsing the instrument slot banks into objects. God knows what performance would be like and what page you stop at though! :slight_smile:

When you say bank, do you mean pages (in RCE)?
Sorry, Just trying to get my head around this approach! …I think it’s what I do, too, but the term banks has me curious if I’ve missed something :slight_smile:

2 Likes

I’m loading all available parameters in just one bank! It usually takes somewhere between 1 and 2 seconds to load. No big deal, but not desired too.

Exactly!

2 Likes

For anyone who would find it useful to extract data from the VST XML files (such as “Generic 8 Cells.xml”), I put together a small AutoHotKey script that parses the xml and outputs each parameter name into Clipboard. (If the script is compiled into an exe, you can drop the xml file on top of it.)
I use it as a tool for adding FX and Instrument parameters to my MIDI Remote scripts. Perhaps someone else will also find it useful.

The ahk script
#NoEnv
SetWorkingDir %A_ScriptDir%
#SingleInstance force
;;; COMPILER DIRECTIVES ;;;
codeVersion := "1.0.0", name := "VST XML to Clipboard", description := "Populates the Clipboard with parameter names from a VST XML file"
;@Ahk2Exe-Let U_version = %A_PriorLine~U)^(.+"){1}(.+)".*$~$2%
;@Ahk2Exe-Let U_name = %A_PriorLine~U)^(.+"){3}(.+)".*$~$2%
;@Ahk2Exe-Let U_descr = %A_PriorLine~U)^(.+"){5}(.+)".*$~$2%
;@Ahk2Exe-ExeName %U_name%.exe
;@Ahk2Exe-SetVersion %U_version%
;@Ahk2Exe-SetDescription %U_descr%
;@Ahk2Exe-SetName %U_name%
;@Ahk2Exe-SetProductName %U_name%
;@Ahk2Exe-SetInternalName %U_name%


; This prefix and suffix may optionally be used around each parameter name
PREFIX := ""
SUFFIX := ",`n"

; Check for a command line parameter (from dropping a file onto a compiled exe e.g.)
; If there is none, open a Select File dialog
if (A_Args[1] == "") {
    FileSelectFile, fPath, 3, , "Open XML File", XML (*.xml)
    if (fPath == "")
        return  ;End program if user cancels
} else {
    fPath := A_Args[1]
}
rawFile := FileOpen(fPath, "r")

; If something went wrong with opening the file
if !IsObject(rawFile) {
    MsgBox Can't open "%fPath%" for reading.
    return
}

; Read the file into a variable and close it
xmlData := rawFile.Read()
file.Close()

; The XML parser does not seem to like the DOCTYPE declarations row in these files
; And since we don't need it, we will simply remove it
Word:="<!DOCTYPE"
xmlData := RegExReplace(xmlData,"`aim)^.*" Word ".*`n?")

; Create a DOM object from raw text
doc :=	loadXML(xmlData)
; Reference the "page" nodes
pages := doc.selectSingleNode("/vstXML/representation").childNodes

; Get all names in all pages
names := []
for page in pages
{
    pageOfNames := getNames(page.childNodes)
    names.Push(pageOfNames*)
}

; Add prefix and suffix
for index, name in names
    formatedNames .= PREFIX . name . SUFFIX

; Pass the formated names to Clipboard and end the program
Clipboard := formatedNames
return


; FUNCTIONS -------------
getNames(nodes) {
    t := []
	for node in nodes
	{
        tmp := node.childNodes(0).selectSingleNode("titleDisplay/name").text
        t.Push(tmp)
	}
	return	t
}

loadXML(ByRef data) {
	obj := ComObjCreate("MSXML2.DOMDocument.6.0")
	obj.async := false
	obj.loadXML(data)
	return	obj
}

2 Likes

Cool!

Mind sharing some details on this?