Lindon's interface has gone mad!....optimising a massive UI
-
Ok so I have a plugin with 12 "pads" (yep its a drum thing..) and in each pad there are 3 "voices"(sound sources to you and me), so a total of 36 "voices". Now each voice has controls to manage it, including envelopes, LFOs, velocity modulators etc.... so if I build out an "editor panel" for each pad, then I end up with (roughly) 3,000 UI controls, yeah really....each "voice" has 15 modules in the tree...
So I can either go that way, or....I could store each of the modules involved (modulators,FX etc.) in the presets for this instrument then, on opening a generic single editor panel, go read the values (.getAttribute) for each module and set up to edit these. So a quick count here means I'm saving 540+ modules in each preset..... eek! again that seems a lot, but Im saving about 2,000 UI components....but the "open the editor" code is now quite complex.....
Has anyone been up here in this rarefied air of "massive module counts and massive component count"?
Is there a preferred way? Are there any gotchas?
-
@Lindon
For the ui stuff:If you talk about pads and buttons, you could use a panel and its paint routine / mouse csllback to simulate the ui elements and store the actual data in one big sliderpack. So in the end you only have two ui components...
This does not work for sliders if you want to modulate them but it should work for buttons. -
@Oli-Ullmann said in Lindon's interface has gone mad!....optimising a massive UI:
@Lindon
For the ui stuff:If you talk about pads and buttons, you could use a panel and its paint routine / mouse csllback to simulate the ui elements and store the actual data in one big sliderpack. So in the end you only have two ui components...
This does not work for sliders if you want to modulate them but it should work for buttons.thanks,..sadly the UI is considerably more sophisticated than "just buttons"....

-
@Lindon is each one the same set of controls repeated? And how many sets of controls need to be visible at the same time?
I've worked on projects in the past with a seemingly massive amount of controls, but only a fraction of the total needs to be displayed at any one time. What I've done is reused the same controls for each page/tab and stored the values in hidden slider packs.
-
@Lindon this surely can be optimised with a "still big" factory to save the component count.
A per pad object could save all controls for this pad
One set of waveforms, ahdsr, etc recalled from the pad control obj -
@d-healey said in Lindon's interface has gone mad!....optimising a massive UI:
@Lindon is each one the same set of controls repeated?
yes
And how many sets of controls need to be visible at the same time?
Just the one...
I've worked on projects in the past with a seemingly massive amount of controls, but only a fraction of the total needs to be displayed at any one time. What I've done is reused the same controls for each page/tab and stored the values in hidden slider packs.
..and how did you manage preset loading? Using a UserPresetHandler?
-
@Lindon said in Lindon's interface has gone mad!....optimising a massive UI:
..and how did you manage preset loading? Using a UserPresetHandler?
The sliderpacks are set to saveInPreset. When you change page you load the values from the sliderpacks. So as long as your change page mechanism is stored/restored with the preset then it will work automatically.
-
@d-healey said in Lindon's interface has gone mad!....optimising a massive UI:
've worked on projects in the past with a seemingly massive amount of controls, but only a fraction of the total needs to be displayed at any one time. What I've done is reused the same controls for each page/tab and stored the values in hidden slider packs.
I did that too, and it works great.
@Lindon for example, you can put all the components in an array and then use indexOf to assign the appropriate slider in the slider pack.
-
@d-healey said in [Lindon's interface has gone mad!....optimising a massive UI].
So as long as your change page mechanism is stored/restored with the preset then it will work automatically.
err, ? what do you mean? - theres a button on each pad(not saved in the preset) that opens the editor...
-
@Lindon I'll make a snippet, one moment
-
HiseSnippet 1453.3ocsXssaaTDFd1zro0tsHJhK3xkJQkSSw01wMNnPKNwNgZfDahSi.QQQi2c13QY8LV6NNMAnR8RtiWAdT3cfWDdCf+4f8N9TNIpuHZ+m+Se+Gl+YlzJl6SRR3wHmrGbdeBx4dtsOmI5VqKlxPMpCq61GeLoNoGGs048wIIj.jiys9ZIemLKhT+9muZKbDl4SRWBgNjS8IeGsGUjtZqpeKMJZGb.4.ZOKoKWsgOmUiGwG.X4VtEP8w9m.NdOrTrEbQuDmzE47X2UqrFNrTkJDR3ZE9hJUBWqhOtDgTd0xk6Df6TZ808W+YUVG4rz1ATAOts.KHIfQ2hGbd6t72vzN3PZBsSDQRTD0F7rdYTstznfVCSLIHjyhsRSS2Rml9X2coAzQqmlt9PECuTMrSZNKbQPp30.RNVPZQMjdfaa+XZeQJGIdtqaClfDGhgZiMTzxhV3I21sFGjfIx2CeBYmXfXjF4VqPgm3A+Y4MxlEpOIBu8d0tGsc8FGzb+ip0b2VM2a68Nns2y8JAR7zm9odcDrCHIBizFJf+PmbLQTi2qOmAD4dng+CA6a9LehT.lHlGUCGE0A5BxwYFlFFRzPYQTFwKb.yWP4LuIkIm+Pu7DuSwQCHKm8WylIAR9j5XANWggKuQ12pQ9IrNxdRCxMTyE4F9Rja9b1H2v7BQ93xbYHu3XHWi19rHcm0bw6HIjHdDQ9Dn4aneCwQIRqNrNpEIsRNKOrYTzHmjnpmZod8qCjNJaHnPty7nrTCnBmyjYqCkgQNYykldl0csRo4u2NmZ+XxM6bXD2GGAXIfbFDEizIuZklgoJIQTlrYlI3yXicvNO2ajZdO5QiJMR8mcZdjDQbbfphp7eZiXRTe4xlDugZtEVC+GNrvsiIqjLUZRp2f3XPKMpxoRJpfjBluvFdTuuzJsDQXGK5BqtxJPXChlgF5kaD+eh9yRnnSDKKSLYhIhAwLOJDbuMKj.LzedwYV1RaoUIfoqT91nEP3zA.DyJPMgjOGboDPZ+KERavjHZ.ItgoAXbkd7bFsshtgYCY7Xx0x5eako1TnLVNKCO1tyIC4IJ4uGBUYemcv1LLDP6UMZ05aMJVWcGF2GOLtUKuoH2X9XEuBKK6qslGd8Tu3x5rl0F683BRSltSEX4MIqvvYxyrWKhDOS1R3EeQJliMnWGRrcKoTP3r1wO.eoq1A395ctVBxYMXTQy9DC8N7n.4Ayxum93djYqu7feCBAnHTG6+Qli80Y1VvbSDELTFWSVGoBgzaZcmpAxUc9L2RkyC+BWIe9Wle+5vmq1Le902emMyq9wnQeOB8pFJiXbLfA.W8IwBpL7cpSNEtim99GYbqSRNQv6ibbGMeB9VCyOv.ysFHDblBh2yczrjBnyRQ3Kpdt8ECSvmRZvZESflD4MWPWWiWzx3uK7+YiWxx3+o3pa7aqM98GdoMLiDor8ccGcrgMtwVl9cGV8Mz.AbcXWmuwAg5RnG2UBXmp.0oC6Ak22zxiKM2vIiqYGucUnrcr7hp8wxoGVlyFmWTfd2wcqtM03VyjBa29iVt8u5b8baOd.3okbU1rGN0p+9eWMQP52l9KD62rjLHLjBR4550KA0iFDDQZwSnxYAR4VPJV0+nJZ5r3ktqaNYRueqpdn2l83CXVOL5SpNAfQSeCe3sE7fAQXw3O3P9TLCCIvsuku7l7LHfN2NruFuBovE9JjqJDefaKpvu6rw3By.iv3l2GXz71s66tcXHwWjBvEc24GtoOT6Rb+97ABJ63cwhXUq1dC50FdiqOA7NC1ymH21JazLzEjzxLPaBKPQ7uvOCyhRZGCyhCYBs59w7i70GLHec3cTq.Xhod8bF2ckzdEm7r.jromdju+3lZJEKcSUb0aphkuoJ9raphqcSUrxMUw0ubEk+uD1bff2SusAg1s01pwKNNayvPGnpaE8e.m6PJ2CYou need to set the sliderpack to have the number of sliders that matches the total number of editable controls. And the range should cover the lowest to highest range of those controls. Graphically the sliderpack will go weird, but it will be hidden anyway so it doesn't matter.
In my snippet I'm organising the data so that the first slider is the button's value, the second slider is for the knob's value, and this repeats for all 6 sliders. However you might not want to do this if you think you will be adding more controls in the future, because then you will mess up old presets. A solution I've used in the past is to have multiple sliderpacks for different groups of controls. So adapt as needed.
I'm not quite sure how you are showing/hiding the controls, so I've just added 3 buttons, only one is active at a time, and when a button is active the controls are visible. By default the editor is hidden and all controls are inactive.
One extra thing which I'd forgotten about is you'll need to set the values of connected modules from the sliderpack's callback, at least during
onInitso that the preset is restored correctly. -
@d-healey To this nice solution I prefer object stored in a panel. JSON are nicer to read when needed. And you can store other types than just values
-
@ustk Yeah that's a good solution too, can it be extended easily if you add new controls in the future?
-
@d-healey To me it seems even easier to extend because controls are either in an array inside the json or better, with a named property. So at checking time the property is either existing or not in the preset, so you have a safe control on value recall
-
@ustk Yes you've convinced me :) feel free to modify the snippet... hint hint
-
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.
-
@d-healey said in Lindon's interface has gone mad!....optimising a massive UI:
One extra thing which I'd forgotten about is you'll need to set the values of connected modules from the sliderpack's callback, at least during onInit so that the preset is restored correctly.
Yes thisis the thing I think was missing from your described approach, so I was at a loss as to how it would process presets, but yeah this is an approach....
-
@Lindon The problem is of course, this fails to capture the Velocity Modulator shapes, which would have to be stored in the presets anyway...
-
@Lindon Yeah for tables there isn't much you can do to reduce the number of components. In the project I worked on we just had to use lots of tables. It might be possible to convert them to encoded strings and store them in json or something but I haven't looked into it.
-
@d-healey said in Lindon's interface has gone mad!....optimising a massive UI:
@ustk Yes you've convinced me :) feel free to modify the snippet... hint hint
Here ya go!
HiseSnippet 2204.3oc6Y0zbaabFFPxv0DNoIYlbnW5La3gLT0pz7CYIU4HaRJQ1vFSJNhTtoihFOKAVJtwfXY.VHKUWO0G6s1i8X5efNS+Gzdq2yef9Sn25Q22cwWKHgrk03jSgGD.12udd+X28cWMviYQ78YdZ5litXNQS+8LFdgKe5dSwTWst6qo+yMFhOirGyk6wb76v75E3voycHCIbesVWLG66Sr0z0W8WKDQuvMzj+9uOrE1A6ZQRGRS6wLpE4QzYTd5nCZ7ETGmNXaxH5LEt2nQWKl6dLGV..uUMpnMGa8T7oj9XAaqXn84X+oZ5+Bi5asIdRss1hPlrYke0VaMYysrv0HjMpuwFiswiqs81Vaeus1VS+lssobl2PNlS70zuQKl8ECmxdlanAdL0mN1gH9np1PvxgC2g4XKbQwnZ6Mk5XOHNt4qAZYPZTb0vn3GaziZSSFOMZ9gRBnTITCf5qjEdqlAdUUgWEE3kCjzUfzMBgzGYLzxiNmmRQfmaaz0kS7lfg7jJTB4Uak+pogH0Sb4kmgeJoiG7QhDk1rRk0QaWoxZ22D3xm4PJa4PvdkfALgjmOGcF1CYSbvW3i1Ecrr1p7oDd6ISHV7RE2WPpZw0V2rf3W9zq8FnWu3ZmjXvwb2vnHXuXnCBzzwYO1r4LW3a+RES35q9J6h.ZCkctqSdxlHXohIbjJDnpQD34kIRD8TAdp6XQk9kJPDcg.IlqrOTFDMIrzDriOIaH1JjzAi+ZPsOOxj6.YmHksSkxUdw8UDn+Q8dxv1iFBrWGzjG4TDVDhBmlKxUhPpo4cu6mfntTtI00g5RPSBbs3TlqbvRqY9byBSf3UI5tUtOh9YwpEd+N2YMHoonzxyC7mVJEoPsB3wkVC7jBlEnSPk3PkJaRZZPDXdL1I.XB8I6hJxF+0PVunPuJQlXdTLEnxWXFhvDuHJnXF8THWD66ARNFVaoDyMhXDAP3Ec6EYA7mnD25PbEfgLjn.kiEI2.OOfiP.WZsSJmVyHkQF..7zJfyYt8X1ANjRKKWrEDNmzkhRtlQOy2khH95borrb8bozp5LtjbB5UyiRRSgTMk0UmCEZoiIQx4oobwJOgemapLTnTOGLRt4yL7ku66vrvNHvPfClHQYpqM47CljJRXsbtHufJvOGs6tnDoPe5mlDH.wyeVeBCdD.JNG0MNcTBzpZDLQ7bb1DZW0bcl7ozufIgBOSc1lYAPnkJfUm5GGn.ggjN723o.BGZw5jWufQEZRAu6cQXaavuHHomNmH1swmScwBG1rvKDvdo.1xEhh3WlkayqhZwfmbsE.B6cX6liZiNneaTmi5u2ntGzGMn8gnAMOrYu1if21u8vQc62TPYojxhgMoGqlMh2ZctGUr8vCPc2+KQ6TDcGjjU3YQze.0ZTezHvL6fDTTlVki8TC1WSy8E8agF0sW6rlqP3V8GK47DQTrIm6QGGvIkxRRBAQd7QjI7EVFHrLtSDf8WxCVN8ktMDTuJ1HB8YJyRcHtmxmFukjnTUrYSB8iomnrQiXhJTwvC7f83teREj76eY0HDtHhxcJo.TBCIWzXWPXgpC0jb1jxFQKsA1wvfmnNGQYI9KgYk4EQSKNpabeA9noDORbz8s3mxRG8YbxAtgwZPSnEIMYRtzh.oCwKWxBH685DrjavrwDO0JTAiPesYaV13xaVVsWdqvVtTXj41EZT3f4D2KqCesn9zDMVGgJfUtrs52OtsZrKwQiZKZoNYcBMIl0z+FieyvC5e7yS5EbGDzZVRid6fpVeSn+r0QpbTsbVdpUay5KwzBpo1lacOfmSzzNp69XNNFw.3AGBVcjSEwJ88ImAGDK7fAEL1m3+TNaNDCS5BEdOz+9oQ9W3RTRG78LRl5TQ67zCr8fFWnd5Me3XiccG3QfpSwQJzdaUdUEk+xIuiUdMEk+s7qtxu0UIsqfarhpe4ia7LpMeppgmRnmNU4zv7Es9JmEWHKNfnBRt4k5lELhJPTyNan5iOnwbrX8SE0oh+WW.31YM6PGpMwKxrQUhpl82oX1+432NyNiYCV5lFRcNCmp0+z20vmSlOj96IpW3fevjITfKCCzLesYTaaGx.lOUrfRBeM9yMxwc93H2oiCC5bv8zQTHhKbpOvPcnpWVDsweLN0ZnWYEMs3zpg9OSOY8iv4aefQnG1xi8LeHzM9z363nvMAM8+DpixIyRG8e7p+xqxNZsHlk+jSzW4aWw34lHTQwJaharIrd.VTf6EPVOlR6ymic8E6p1zGTUvLAGxySlvh71N7xWbwB89KoSH6ExdFRoCCaM.9qX8oJIB0z1NeSbHwEO6RPOzz.geIzFRvdVSag8TIzAeFyCBahaRJAEofPkbFwBbbFf4Sio6mIHE4qcg3nMoEyChVYn2OXVXnUHVM4Pge+aEUHGJ5LEHbLLNBUo78VO9E34IRteD0m2zifSPbDuqm2iDoBswgrmM.16GpWupxkD3ZwBbsEX93PB8XdQw5EojVesHk3H1RTMegl1xWJ0GZH6BEyydGYhaRLhfXpq5ESIt7IHvyuPch+6rKN6pBwOxX.kaMMeLtRNXD1H96CLFcciuuQ38gkBvaXz4K+d5tEWUw92Nz9+DCY67RKeqv2qlw5Y51OMpfajP3PksAQZZWznCgXKN2khDMpW+6dX73pBHI7HQkuueGOx2ntQwmSWZTs8aziprP9+4giHvFBCuv0JSFa0qbHq5qOicHKPrCROLbVHw9SvJDCgUwsHPByEZfPz9p9JhFMC+th3aADFRbske7J3WDwphu0iHVMln1UJqT6JjU96+seLq7CaVo9aNq7x+0+9GyJuyxJ+PXiYXKO1ShO+MDgtkbDvuck++qJXzS7MpZ7gDSClPmqzmXYkUUKIXsqqf0utBtw0Uv6ccEbyqqfaccEb62rfh+CdMC3rYg67qo0aPaYO355scwPUtbZr1+G3cS9YJ