I’m developing a new module and in order to keep it small I would like to use the same set of 16 knobs for tuning two types of parameters in two modes called “RUN” and “PROG”.
In the RUN mode (the main mode) the knobs will control a sequence, in the “PROG” mode (used less often) the user can control the pitches of a scale.
The problem is that when the user switches from one mode to another, the knobs should reposition themselves to the new values; and I think that this can be done in VCV, but this makes the behaviour unreal (I think there are no real knobs that adjust themselves).
The solutions are:
implement the “unreal” behavior (magically when the mode changes, the knobs are repositioned)
when the mode changes, the knobs doesn’t “move”, but the underlaying value is changed only if the user moves the knob, and then the value is set according to the knob position (possibly distant from its previous value)
implements a sort of endless rotary encoder ( is there one already available in the standard components?)
Audible Instruments Macro Oscillator 2, as well as my own Algomorph modules, use a scheme where each “mode” of a multimode knob is actually an entirely separate Parameter on the back-end. When a user switches “knob modes”, in actuality Rack hides one knob and shows another.
This creates the illusion of Solution #1 which you described, but with an interesting benefit unique to the Rack environment: because the two “modes” of one knob are actually two separate knobs, both knobs can be separately mapped by parameter-mapping modules like VCV MIDI-MAP and thereby users can retain control over these knobs even while they aren’t visible.
In the (real physical) Plaits module, the solution is something like Solution #2 except the underlying value’s rate-of-change adjusts itself when the underlying value and the physical position are different, until the underlying value “catches up” to the knob’s actual position. This means you can actually just wiggle the knob back and forth a little to move that process along. Audible Instruments originally implemented this too, but in a recent version it changed to the new multi-Parameter method.
With that said, endless encoders (Solution #3) are possible as well though there don’t seem to be too many examples in the Rack library. In fact, I implemented one of these as a “knob mode” in Algomorph using the multi-Parameter method. Assuming I haven’t missed anything regarding how this should work, it’s done by simply setting the minimum and maximum values in configParam() to -INFINITY and INFINITY. Here’s the relevant line in my code.
If you’re going to implement magic (if you’re not committed to being hardware-like) another useful magic is having the knob’s label change when function changes. This version of plaits does it, and is very useful as a result.
I have real world modules that have knobs & sliders that can change function, and they follow the approach where the value changes but the knob obviously does not, but then when you change the knob the value gets overwritten. Which can sometimes cause confusion, but overall is the simplest implementation.
In VCV Rack I feel it is quite acceptable to have things work differently, my WAVULIKE module for example allows modulation of sliders and knobs, and I update the position of those controls accordingly. Which means if you give it audio rate modulation, the knobs and sliders move very fast in a non-real-world way, but I kinda like that.
Thanks to everyone, I’ll go with solution #2, adhering to a “real hardware” (though - at least in the first release - there will be no “small moves until catch up” tricks) … let’s see first if it will be a useful module for me and/or others