Choose your core controls, lets say for example ' attack' and 'release' x 12 samplers. Just make 1 attack knob and 1 release and trigger which envelope its assigned to via 'last note triggered'. So if that note is detected by piano press or a UI button, it will change its processor connection to the corresponding module. You can add some visual changes to let the user know which row its triggering. I have a 'core parameters' section thats all dynamically changed by piano press and/or UI button controls changing a variable flag 'last note played = note'. I change processor connection and call updateValueFromProcessor...something like that on all the core parameter control components.

These are my controls for 12 samplers all neatly tucked into a few tabs. You could def have more tabs, and maybe tabs within those tabs for your 3 different layers. A few different panels and a few radio buttons is the best way I could figure out how to minimize my interface when I want alot of controls but not want to show them all at the same time.
This is just how I figured I'd approach it. 
btw, all individual parameters are obviously still read/write on preset loads so you do those in the background and on load you just restore the knobs visually for what trigger you want to show on launch.



