Lindon's interface has gone mad!....optimising a massive UI
-
@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 -
@Lindon For tables, shapes and consort, they can be saved as array values into the object.
table data points, even paths as string...