Imagine each voice on your synth has 4 tones
All tones have the same sysex address structure, and their address values are exactly 512 apart for the same parameter.
Now imagine there are too many controls to show all tones at once on the Electra One, but we’ve managed to parse all tone parameters in a virtual parameter map starting at 8192 until 10239:
the parameters for tone 1 then start at 8192 until 8703
The parameters for tone 2 then start at 8704 (= 8192+512) and run until 9215
Tone 3 starts at 9216
Tone 4 starts at 9728.
What if I now want to add one “select tone” control to the E1, with which I select the tone to change:
When tone 1 is chosen, the parameters to control should be the ones between 8192 and 8703.
When tone 2 is chosen, the parameters to control in exactly the same slots as tone 1 should be the ones between 8704 and 9215.
I’m working on the same Problem right now. My Plan to implement it (Just a plan, did not test it yet )
Creating the “Frontend Controls” for the User
Creating a VT Control “Param1” 7192
Creating a VT Control “Param2” 7193
…
Creating a Control “Tone” Range 0-3
Crating the Backend Controls for the effective Parameters
Creating A VT Control “Tone1Param1” ID 8192
Creating A VT Control “Tone1Param2” ID 8193
…
Creating A VT Control “Tone2Param1” ID 8704
Creating A VT Control “Tone2Param1” ID 8705
…
Creating A VT Control “Tone3Param1” ID 9728
…
then Adding Code (Pseudo only, but you should get the idea):
# If the Frontend Control for Paramterer X is changing,
# then updating the corresponding Tone-Parameter Control by using
# - ID of the Changed Parameter to Identify the ToneParameter (ParamX.getID() + 1000)
# - Tone * ToneOffset(512) to identify the ToneParameter Offset
On ParamX-Change do
Set Value of Control ID (ParamX.getID() + 1000 +(Tone.Value*512)) to ParamX.Value
done
# If the Tone Control Changes
# Iterating over all the frontend Controls and update the values
# to reflect the Parameter Values of the selected Tone
On Tone-Change do
for i from 0 to numberOfParametersPerTone do
Set Value of control ID (7192 + i) to Value of Control ID (8192 + i + (Tone.Value*512))
done
done
I think that could work - will try it myself as soon as i find some time
I ripped part of one of my presets and adjusted that to the Tone parameter group idea. The preset is meant to suggest one of many possible ways of doing such thing. I did not have a chance to test it on mk1, I guess it will work just fine.
Thanks, that was my idea as well, just needed a nudge in the right direction.
With separate visual controls we can do even more, for instance use it to offset the values of multiple tones at once, and why not even in opposite directions.
The trick to find is to avoid loops between visual controls and their tone parameters. If the visual control changes trigger a tone parameter change, then this tone change should not in turn change the visual control.
Here’s how I think to deal with this:
Any SysEx change from outside the E1 should be flagged as a 'parsing’state. This should set the tone parameter, and also the visual control in case it relates to the tone in question. The visual control should not change the tone parameter as long as the parsing state is ‘on’.
Any CC change from outside that coincides with a predefined tone SysEx, should be treated as a parsing event, as the above.
Only when the parsing state is 'off", a change to a visual control should then be applied to all related tone parameters.
For tone parameters, there should be no other controls on the E1, except for those visual controls.
Have you tried my example preset? It is set up so that messages are safely processed - I mean changes made by the user as well as data coming over MIDI.