-
-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conditional activation (or banks/shift) for Controller Mapping #231
Comments
Initially I was thinking that contorller mappings should only be used for representing all control elements 1:1 - no lies, no surprises, just a pure representation of everything that is on your controller. That's why I didn't support conditional activation. However, for your use case I can see how it makes sense - because as I understand you, your goal is not to reflect your controller 1:1 but to create a standard set of control elements. And not all of the controllers have every control element that is necessary, so you need to simulate them in some way. Do I get that right? Let me see what I can do. |
Yes, exactly. The "standard set" is a sort of ideal. |
Actually, instead of conditional activation, the new "dynamic selection" syntax would be sufficient, if it could be used here. In the Analog Synth controller set, I already arranged the parameter numbers with this Bank Layout - at least for the most common "Banks of 8". |
Agreed, but let's face it, our brain automatically attaches to a button a certain function, and I think there will always be buttons which we would only use as shift/parameter modifiers. I agree on the point that from a design perspective it makes more sense tieing controllers to parameters at controller mapping rather than main mapping stage, particularly when using auto load to avoid #186. |
I think one challenge that would come up with this is how to decide which parameters to use. Imaginary scenario: You make a controller preset that uses parameter 1 for some control element switching. Someone else makes a main preset that uses parameter 1 for something else. BOOM. The two will interfere with each other. This kind of problems could be prevented by strictly following a convention, e.g. using parameters 1 - 50 for main mappings only and 51 - 100 for controller mappings. But what if not everybody does this in the presets? Big chaos. Actually, it's a problem with using conditional activation in presets in general. Do we maybe need a "Parameter mapping" feature? So that each preset creator can rely on virtual ReaLearn parameters but the actual mapping to real ReaLearn VST instrument parameters is done by the preset consumer. |
(see my comment in #241 ) |
I have to admit that I am really eager to see this issue implemented, because for me it is a prerequisite to starting with #205 . I suppose we cannot simply get rid of the numbers and replace them with names (like I suggested for the virtual sources/targets in #244 ), because this is just the standard protocol for VSTs, correct? Then, my favorite solution would be to define standard numbers for "Shift" and "Bank" (like in the MIDI CC world, 1 is Modulation Wheel etc. but not all numbers are defined). I think "Shift" and "Bank" are universal, stable concepts. Another solution (more like a side-effect) would be to put Controller Mappings and Main Mappings in separate ReaLearn instances - #243 . But I could also live with the suggested convention (1-50 for main, 51-100 for controller). Couldn't this be supported or even enforced in the GUI? |
Okay, I've put this on my high-prio list.
Unfortunately not. There are named parameters in REAPER (#241 (comment)) but they have severe limitations. Even if we would find a solution for the fact that you cannot list them, I think getting notified about changes (a prerequisite for feedback) wouldn't be working.
Okay, I'll think about it.
You are right, it could be. Would be a possible solution. |
I think I have a viable solution to the problem. Basically a combination of #186, #209, X and above quoted suggestions:
@vonglan Please let me know what you think about that. I will start with some of the things already. |
That sounds like a great concept! Seems all the puzzle pieces fit together nicely! Concerning the default FX parameter names: Even though I argued that "Bank" and "Shift" for example are stable concepts and are good candidates for "fixed" parameters, I also see a danger that users might think there is some implied logic. This needs to be pointed out in the User's Guide. |
You are right, that's a danger. Especially because users don't read user guides (as I had to find out recently). Maybe we should skip point 6 then and rather add a section in the user guide that says "If you care about your presets to be easily reusable by other users, please consider sticking to the following conventions: bla, bla, bla". |
I am not yet sure about point 6. |
Haha, I think I confused virtual sources/targets and ReaLearn FX Parameters again in the previous comment. I only thought about communication Controller Mapping --> Main Mapping via virtual targets/sources. Bank/Shift/Make-Relative might after all be interesting to be set or read from ReaScript. --> Candidates for default parameters And "Track Index Offset" - how would that be communicated from Controller Knob to Main Mapping target? "Zoom factor" (#204 ) might be another candidate (set in Controller Mapping, and then used in Main Mapping formulas). |
Yes, for these things parameters would be probably the right choice because they hold state.
By "FX parameter" target. See below.
Exactly, virtual sources/targets are never usable in dynamic formulas because they don't hold state. Only ReaLearn FX parameters hold state (= have the concept of a current value).
That wouldn't be good. Just to avoid misunderstanding: The expressions/formulas can only access the parameters in their respective compartment (otherwise too much abuse possible). BUT each mapping (no matter in which compartment) can have a FX parameter target that changes parameters 1 - 200 of the current (or really any) ReaLearn instance. You can do this already now BTW, even via "By Name". Therefore the way controller mappings should communicate state changes to main mappings is by changing main compartment parameters (1 - 100) as a result of button presses etc. Hence, this isn't a use case for conditional activation in controller mappings. The use case for conditional activation in controller mappings is if you want to simulate some buttons or other control elements that don't even exist on the controller. |
How about 50 Controller-internal, 50 Shared, and 50 Main Mapping parameters?
I don't understand this at the moment. I had some more thoughts about point 6 (default parameter names): And another thought:
This could also lead to confusion. Maybe show and use them all with their real (technical) number, but in the UI only offering those that are actually meant to be accessible in that compartment. |
Why would you need shared parameters? I don't see any need for them. As mentioned, you can always use non-virtual targets (with REAPER "FX Parameter target") to trigger a value change of an FX parameter in the other compartment. The only thing you can't do is accessing the value of an FX parameter of the other compartment in formulas Update and in the conditional activation parameter dropdowns. Compartments are designed in a way to be rather indepent from each other and meant to be freely combined on a mix and match basis. From this perspective, it makes sense that each compartment has its own private set of parameters. If you allow leaking of parameters from one compartment into the other one, it's like begging for interference issues. If we really need shared parameters (for a reason that I don't know yet), then I would probably make all parameters shared parameters.
Yes, this is the use case for conditional activation for controller mappings. That's what I meant.
Yes, sounds good. What do you suggest to solve the problem that users could think there's implied logic? I guess "RTFM".
I think if we want to emphasize that each compartment has its own private set of parameters that goes from 1 to 100 (which I prefer because of above explained reasons), requiring controller mapping formulas to use p101 to p200 and main mapping formulas to use p1 to p100 would be confusing and implementation detail leakage. Yes, at the end each private parameter (controller p1 to p100 and main p1 to p100) will be mapped to 200 real VST parameters because VST parameters don't support grouping. But I could make ReaLearn include the compartment and even the |
Seems right.
No idea for that. All FX parameters that are not used might be grayed out. But that would be hard to implement (and access logic from a ReaScript would be impossible to detect), and might still not help.
Yes, that would solve the problem for parameter access from Reaper (where I was worrying about confusion). |
I think I will have it finished by tomorrow. Playing around with it a bit already and it feels somehow right. BTW. #244 is already implemented. Check it out. |
@vonglan This will be in 2.8.0-pre5, available within the next hour. Would appreciate if you could make some tests of all the mentioned things. This required quite some changes/additions to work this way but I think it was worth it. No set of default parameter names yet. This still needs some input. |
Found a bug myself already. Group updates work either only in main or in controller compartment. Fixing. |
Great work! This works very nice. Thanks! |
As described in #205 , I would like to define a standard set of virtual parameters, to control typical analog-style synth VSTs.
I then want to control this with different controllers, for example an OB6, or an APC20 if I sit at my digital piano.
To be able to address for example a third oscillator in a minimoog VST with the OB6, I need a "shift" function. For this, I want to use the "Arp on/off" button on the OB6. If this is switched on, the VCO2 controls should go to the Oscillator 3 Virtual Parameters (and the LFO controls to LFO2 parameters).
Similarly, I want to use the APC20's 8 faders in 8 or 9 banks.
In a main mapping, this can be nicely achieved with conditional activation.
But for my use case (and if I want to keep a clean "mapping set design" to decouple controllers from VSTs), I need it in the Controller Mapping.
The text was updated successfully, but these errors were encountered: