Question about MIDI CC control in FX plug-ins

VST, AU, AAX, CLAP, etc. Plugin Virtual Effects Discussion
RELATED
PRODUCTS

Post

Since I'm going to offer MIDI CC control in the next generation of Voxengo plug-ins, I would like to offer something really usable.

I have bought a simple MIDI keyboard with several MIDI knobs that send MIDI CC events.

However, after I have hooked these knobs to an existing plug-in they worked in 1-to-1 positioning fashion. So, if my plug-in setting had Gain knob at maximum and I've loaded a new preset with the default Gain value at minimum, and touched the MIDI knob a bit, the Gain value would immediately jump to the maximum causing overload.

Is it working that way with all MIDI knobs? (in that case, MIDI knobs are barely usable) Maybe I'm missing something?

So far I have come with a pretty simple (and elegant) solution. I'm perceiving MIDI knob as a controller like mouse. Instead of reading an absolute MIDI knob position I'm reading its delta position. And so, if I rotate the MIDI knob with a moderate velocity, Gain value changes moderately as well. However, if I do a very swift rotation of the MIDI knob, Gain value does not change. This is pretty the same as repositioning your mouse if it went off the pad. Such logic should also allow for much more precise adjustments (when rotating MIDI knob slowly). The only problem is when you 'jump' with MIDI knob, the actual value will be changed a bit, so you'll have to compensate a bit as well after that 'jump'.

For bounce, however, it would be necessary to issue 'preset change' command first, to set the initial state for controls so that MIDI CC events add and substract deltas from the correct starting points then.

How does that sound? (I have not checked that approach out, but I'm about to implement it).
Image

Post

I think a very good approach is like I had on a Roland SH-32 synth.

The values did not change at all, until the physical knob on controller was passing it's set position(from the current preset).

In that way you will never get spurious values, but change when you pass a certain value.

8)

Post

There are endless rotaries which send +1/-1 in one way or another. For example Behringer BCR2000 has 3 different endless modes, I think the one I use sends 65/63 for +1/-1 (that is what Reaktor expects, so...).

Those are my preference. When I am stuck with normal pots, the best behavior depends on the application. I think it is ideal to have the choice between jump (just set the control to the hardware knob value) or takeover (no change until the value of the hardware knob passes the current value of the parameter).

For endless rotary knobs, the best interface is on the Waldorf Q (and maybe other Waldorf hardware?). If you turn the knob slowly, you get a simple +1 or -1. But if you tweak the knob quickly, it scales and changes the value much faster, so you can go all the way to the maximum value with perhaps only a third or half turn. Not only that, it also stops at sensible values (for example 0 if the control range is -63 to 63 or so). So a very fast turn to the right will always get you to 0 even if you are at -63, -48, -30, whatever, then you wait a very brief moment and you can increase it again... It is seems very natural and easy when you use it, the user doesn't have to think about what it is doing, it just seems like the right thing.

I've made this post much too long, but anyway, that is what I would want: endless rotary support like on the Waldorf Q, and jump/takover for normal pots.

Post

Thanks for the replies.

Of course, 'endless rotary knobs' with built-in delta support is the best thing one can have (from both user and plug-in interface perspective).

Seems like this problem was already fixed by using 'takeover' you've mentioned. Not very convenient, but at least param value won't jump unexpectedly.

What can you say about MIDI CC programming? Is it a good practice to map MIDI CC event numbers to some 'internal' set of numbers shared among the full plug-in range? So that mapping is shared between all plug-ins of the same vendor, without the need to reprogram each new plug-in. I can even add small numbers near the GUI parameters representing controller numbers. Do MIDI keyboards and controllers always come with MIDI CC knobs numbered 1..to the max? (my keyboard numbers them from 1 to 16). I could optionally number FX plug-in's parameters (knobs, switches and sliders) in a similar way.
Image

Post

The standard spec is that MIDI CC numbers range from 0-127, and the values for those range from 0-127. You scale, map and hopefully parameter smooth that to your choice of internal ranges for whatever you're controlling at a particular time.

There there are standard practises with, say sustain pedal, for 0-63 to represent off, and 64-127 on, and you can of course apply that to any MIDI CC you want.

My preference (and pretty much the standard practise as well) is that any midi control allows instant control of the knob/slider, instead of only passing past a certain value (the take over method). You can take care of spurious moves and possible resulting glitching with plugins internal parameter smoothing.

the mouse style "delta" method will only work with endless rotary knobs (and even then depending what the controller is actually sending), and not with fixed range ones by the way (which I would say most of MIDI CC controls are).

Post

personal preference here is to have no MIDI control implemented by the VST itself. I prefer to let my host handle mapping my controllers to plugin parameters, and I find it really obnoxious when plugs start responding without me expecting it.

Since it sounds like you've already decided to implement MIDI CCs anyways, I would recommend having a switch to turn them off. Just my $.02

oh and the waldorf-Q style endless rotaries sound awesome :)

Post

Kingston wrote:the mouse style "delta" method will only work with endless rotary knobs (and even then depending what the controller is actually sending), and not with fixed range ones by the way (which I would say most of MIDI CC controls are).
That 'delta' idea I've posted in the first place is exactly designed for 'hard 0-127' controls. If all MIDI controls were endless rotaries such idea would not be necessary at all.
Image

Post

I see. I read it a bit wrong. It somehow seems more inaccurate, having to compensate based on the speed you move the knob. I would say a more straight forward implemention is just to use absolute MIDI CC values scaled to plugins internal parameter range, whatever that may be, and just do parameter smoothing. You can get pretty clever with adaptive parameter smoothing solutions so there shouldn't be any glitching or other oddness.

Anything else would be a tad confusing.

Post

i agree with kingston; while the delta mode 'workaround' for linear pots is interesting, it would ultimately be very confusing. it would totally break the physical perception of where you're setting the control to [normally, i KNOW that if i turn the knob all the way left til it stops it will set to zero].

just to perhaps help illustrate this - if the knob was already near 0, at say 3, and i change to a preset where it's higher.. scarily high, i would immediately try to turn it down. it would go a tiny bit down, and then physically stop, then i'd panic and need to turn it up quick just to turn it down..

it's interesting but totally unintuitive.
Kick, punch, it's all in the mind.

Post

OK, but I think I'll try to implement such approach anyway. If it does not work, I'll remove it.
Image

Post

If it's feasible, I *think* it can be said that "midi learn" is generally preferred over hardcoded CC numbers, or at least offers a nice option.
It (can) work like that:

- "arm" a control
<- send in midi ->
- register number, "disarm"

Post

Hello Alex,
I was just about to suggest plastique's idea about the MIDI "learn" function, but he beat me to it. I also think that that is the best idea for implementing CC. Some controllers allow you to program what CC numbers they send.

Another possible idea for you is to take some of the functions that are common to a number of your own particular plug-ins and make them a number that would be a common CC number. These might be parameters such as feedback, high frequency damping, wet/dry ratios, etcetera. You could also post your CC number's implementation as a downloadable thing on your site so that users could print it out as a reference sheet for using your plug-ins.

rockmachine

Post

MIDI "Learn" is not in the question. What is in the question is how much 'omni' should be the MIDI learning - should it affect only a single plug-in, or should other plug-ins 'import' learned CC numbers.
Image

Post

Keep it for single plugins, I'd say. IMO having as little interference between different plugins as possible is recommended , unless it's within the design of the plugin of course (by design I mean as "usually functioning in a group of plugins in parallel") - it's an interesting thought though.
In a global scope you'd also limit the number of possible uses (E.g. if you want control A of plugin 1 to react on CC0 and control A of plugin 2 to react on CC1) .

In any case you could give an option to toggle between global or local learning mode.

Post

it should also be taken into consideration wether there actually are that many interleaving parameters in those future midi controllable plugins. If there's only a few things here and there like gain, dry/wet and bypass on all plugins, the global midi learn approach might be useless.

Post Reply

Return to “Effects”