Separation of design and function
-
For example, in my application I have found that a random function with a running arpeggiator
is only executed if you click several times or the arp stops.I have read here several times in the last weeks how useful it is to separate the graphical part (GUI) from the realtime functions.
The concept makes sense to me.
My question is how do I implement this practically in HISE?
Are there any examples here?
-
Use two scripts, defer the callbacks in the ui script.
-
@d-healey
An example please David.
I need to see this - I don't understand it otherwise. -
HiseSnippet 1024.3oc0V0saaaCElzIJa1qIXcqO.D8JWfrT4s1tATTz1XmDXzkTi4jhsqJnknhILEo.IUZbK5c6AXOI6UXOK6MXWt61NjRxRcPHK0aEXyWXHd9g7iG98cHmnUQLiQoQ3tmtLigv2HX5Roc9v4TtDMdDBuSvwTikoIEl1eYF0XXwHLdiibFvc2D4+8aOdepfJiX0lPnWn3Qrukmxs0Vm7jmwEhCowrS4oMh9dOYbjRNTIT4.d1HHDkQiVPOmcB0EVm.DdqCh4VkdpkZYFDdy8UwKmNW8JYQ7ufa3yDL2fAnovDUX9PkH1gX22ngy4h3IU6aCBlkI0UgMJpB2J3XdLek85pwm5cPpynY8.24pf2f0DdcZ.uMKf2MClFo4Y1ZONr8IAikvAUBENBZBqhXQc9IbvPEDgztWJcA6PMLXUF8ePX3tj6GFdmGtcus64IA6EyRX5gTgXFbPX5a04rB228tjSmyMDiepIvWIJMYIbvQNaLwXySRVEFirPplQTRh0kB3G9WvkKXwDqBLVF.WR7Y3Lnf+zUy9EbJIipARfiFNdjOpePkShnRBUXT9YykWJ7mVke9bhgYep0p4yxsrjbYjkCquRdhxxdtr+c58ldc681dj+pqjjV84JaZkPvzs51Qi0WUh8k4oyX5cIWPEPIrJP377cILac8HLQEmhMBTIGK41mmwJGWSoFzBkBURC.xEtDgPnVO0ZmRp0TAOloQbXR9nfmAmOCPdv2TbiNa7HpkVMMvLBqRFSa4tMCdD6BP7WvX6FLhYVXUY9XSyTR25i24ucQuDgCvbXsV593H3CicoqjrkO.TJONVvlnLbWIuQ2neAZZkMk+ZOheys94i90W+iONsYCKDJkdYy9WFf1xuz2oIgKRM.+IabJz.Bg+rfyLLBnGn4BKwr.lmBJ7oJe7YUk2w.1+7xsScahAnUDXW.8BVHmABH44P2vqo5tsIsEUN92CZWbpYTgEHp0pys6ADIikTgExiHU8Gnwwtpa+aW4616Rf1CPyg++Hl58ukXpZmVYIDsZC1zT89poU+1okvpM8OVe1fM8APhdiqy55UonJUJ5+ppzVDavE5p3bA09t2x6dZSoCGfaJzbWYJgMxxlf583p+vVu5u09zWS3dyfIbaz71wamVvq6UEefwa4Co1N3fjDVjsFraFb32utuZ58.JemJ2BLyio.8vwNOIOcJ77jHFfDojILNhZGmVqXbXEwcJSF6G7GvuRmCbiwkNGT4DHlQZ0KiJTntmp8wdK.lj9Wr1Ed5LLlr5pyffv8BchA9KihbkhuX.B0dNe4ZjyWsF4bu0Hm6uF47f0HmudMx4atxbbOd+o4VUZgLALL4.e+QL9.IEXYdFI5OA8YdlOC
-
Here's another example that shows how to use a non-deferred timer to repaint a deferred panel on the main interface.
HiseSnippet 1038.3ocuV0saaaCElxIbnVadXc+bOQtRAHyUZsMa.ACywNICFaI0XNqn2UvHQYSDIRAJpzYTDf8frGl8HsGfMrcnnjkbfyO0ac5Jc9i7imy4i7LQICY44RExo64KxXHmOBOcgPOezbJWfFeDx4SwuJMYhhkyzCogWVjkiFtHilmyhPNNa88F+b5tMp76O9tgzDpHj0nBgdojGx9QdJW2ncxfefmjbBMhcNOsk2Oav3PoXjLQV.XZKrOJC1T5L1YTiacvHmO33HtVplpoZVNxY6gxnESmKeiv5+K447KRXFg.zTXgrpOQlDYPrQKZzbdRzj5ydNBVkIMYhsrYhOGeJOhuTeSF4SJMPZhnc9voycAuf6Gd9qCdcZAussv6w3ogJdltwhAaeHdrPyTwTnDzFVVeQc9hN3QRvCgteJ8R1IJPXYDd666uG44996dPO2dtkMB8iXwL0HZRxEPgH2SqJXVyPcJWSthpHSnBVR.4aI0K8LldjLMSJ.Aucrl2wFEWjvELRbgHTykBhTXMaBUIS7BqiaOXoSf8pm6a641co59JVFTHzdlk65xk7t2094F0kKd8ov6FapEYVUF2mX1feRVnAj5UiTuYVnPHjY8igl2CSR7NkBYHEUDA4Puflu8H629a2cOv85cOn0g9Lol8Bg2ttu0sq60tjaZJNds1p.bBSsVyFtj5tBzSTjdASUmaqcDZpVsqE+v5ZCsY9VNJEiEb8KxXhaipgpJWve+73inZJzd6ToC7KiozbCDbNhcEbugsYuK9HV9kZYVouU0X3p.co0d0TASEDwgF9GgsUSzur7pkee5fEKE90oCdCOROGNoN+lCBMmwmMWaj9qxamdfrsOqRaycAAqk08mN3m7Dx4y44jba.vewREQwnIZnnQx0EwwqxpVRKAhkkJBM3qbkj2NK84VYWCKzZo3dnWPOMgGS7pU00nvtm4ZpRa6q76GX1ktrjb1M7QlU05cOjxJzbarxUA6+uDlkoRCzNTqU7KJzLuF01Np8HAFx7+Fxk6+Ujq5rRsFezxjQaUM4f1ZKO5qwsFUue4tXK28iqnP1ReI4sKtpOnE6EcVK1Kp+fb5UrwB6XIFl1ZnrvyzxnhDpd02tMCrTY.pdqPWM0ZQNWun8.MuCOn6+fm23gB2Gimv0gyWOd6rF7ZlU38LdqFOpG933XVntAraiO4Ua5rPuCPw9v7L3oWEGZPvmUjNElVLjAHQ.TTyyWNcLMqVYeirIyLkIhJE9a3qxXfQ1oxXPsQTJMTIecnkQXF.6QkZ.LIJmCsK9TiLI.Ux0g3v988QovsyuNLzjJ9R.6qOluZCh4oaPLOaCh44aPL6uAw70aPLeycFi4gwCKzxTKMATL43xanbbNVPgtrxNRz+.P3Vpj
-
@d-healey Like this?
See the comment in the Gui and in the ScriptProcessor!HiseSnippet 1944.3oc4Ys0baiaElzxX6Jkpr1IoWdDSl9f7VuJRMW51ISajsjch13KbrbtL8kcfIAkvZJ.tjfNQyNYl9Snu0W6Oj9v9Sn+Tx+f1CH3UaFszZS2NSKePiOGfy47gCN3CWrUfvlFFJBLLad5Bepg4OGMYAWNa3LBiaLdjg4sPudtmU.MjJ2kXedjenwtK7IggTGCSyFOU0OylqaD+89mrKwivso4pLLdofYSOfMmIy0ZM34LOu8INzSYyKz6GLXrsfOT3Ih.L0.0yvGBJYJ8HhpaqgLL+j8bXRQvDIQRCMLWeWgyhIyDugq6+KYgry7nJg9FS.GoUuuvyQgX0eaLbFyywJcrGZXXhrxyDMzYh6fNj4vxzmmQ1HtAbtEEyGlqsL30eEgWiBvacM71DMwNf4KyaQgsafFykz.WBLETDV59Zr1uXMzPAzCtr6bx4z8C.gLK57nd81F+vd815wsa0tUbgPWGpKMXHwy6LXhHriLHhpaFlmBk3KHAXKBm50G+GwotdJUNTL2WvAgN2U27c0Vw3dLNE6FwskLAGK35lUlFH75XmZ21fq8fX0t020tUyL0cCn9vDgrixcuK1kKOpcCUpicd5nnykBpFYZUptaoBvIhHIfzNoHsyTMTvX7zttPw6NddcNj.Yn.B2Axgc5m+sM9QE+1ZqG25ca83BC5iDR5w7Na056Z0r06ZgubSttU1VBf8nAU1rZsTvxLrCOZ9YzfzbaZGghpxUsn5U0Zqy7E5nfOlyjG6SSjuZsrQxzETUalfJnqx3Z5alTSuajTJ3FLnzsIRKz2HFxE4ULdw3QDII0QfOg33SCjL0PvbD8Bf2QuXoIZDM7bovGBUVMBPknCa6zkRpJf3n9oHc0fwayB32OYvhLg+xjAug4Hmk25hAynroyxo396hAFWMTKcDlGL72THXe+aG3ml.GCFb6Dejy.0GXIC.BRXc73RdrHB9YkGrGPNKavF+2Ei+6iJD++5aFHouE7vAnSmwBwmE6bLSUWgkyn3m9hwXXM.9BFIGS3wivugImE2CMdv8wPECmZKARoj7Gx7e.gHM2gL+Sw6NTS1tpxDUw582VCcu6giAen1.3ubALFPIdRXQCNTF45VlUKiVDH1zTg.ASosD5b2r97AY2RlIVN8FvofYt3NopZpTniYnjDH0qq60suJJModgzK0GgexR+e.RwDz7gXEKCV8Ppcq6846XaKBbX7oXo.u.1ZF6P0IRXPtMlfOmKNClnIR0Drx1PPYVMIV3h2IvmNcJi.jL8wgyDQdN3oB7LZ.cabKU0CTmvyqOTQJwuLcU1zHF9KvApBkm7426mRtzrYYUVaGoLfAKAncxUqIK1F2Wwy+ig2s0GKd2zrRpldFYIihpxyAE0FOzqna4pVFs9pQKaVfoBcs3JMNp.WkQ2AgjKni45SrpHALt5Q6ZiJTNFyjbyhZJShX1n7bTi5MGszc9tcM146lHMJRTc0s+pgOZiNI9f6kbAxbolOwi4PChM+yPGEMehj5mn6RX3ACpiStAR4gXbbMFDEbvFwNXx4rKACjoYMSCfGDAxmSWb8SlkGH9TpyyANobHbipLdiDigZ5yD6Jdar42BMg9sQT3xQYpq2.o.DZiN1VB02mP3SoW+4ylnIyf847nqV0zMP6wIPo9oL5GB5qqM9VkhsEr6RrCtCjBlyNEVlWngLOsI3HGEygoO5K60s72yrfe3c2A9c3H3miTx2WI6tqR99Gq5zNC610ZuCf+7UW.+bpRtarrkR1pqRt6nT+k9cMF.uj5IrYxEUM.t8kG.t+1cA.dvXHfbNDP2uQI+GdNH+Zekrel7Ep16NQI69LP1kpje3Nf7EOU0tqRdrp8.U6Vrr9u+WMp1CfagNfxmJmUO3etx8u7qTgyMCNVJ33RhmOTxudeU97Oak1eWU6VSyjigqKKSlmC+Woju+3Q0bEzlH3R3v4C7lP8fCIH9gXBpzI+JzwQR+H4GAWsI5Pq8lnNfVhyxcxZ01IelxI6wcthK1nlqJ+DzyDdNUrh9pmhdCzgBmHO0dbEeNC0a3jz.bpkRa9oNiCODp2K9FOWi23nWkuwQk2KrlvcSjESZOqZ7tVE3E1t8+z3M6XE645BUS4fccz9udUednUCJ2TCEXuJ3hHwWOHFH+xXY7qf8NvOkxoAW8bNkeIu+YceIO+Z+Rd5stNMfvC8Egkbb51BgEU9hP59Azu8D0rbQ8CEjfJa58OYeXPVoMSHxnf3xkclKh3xRkGMVomrq7plB8uh2ua8+K77he7W58imonQ8faEYPSqq7T0.cJatuGcO9EvlxfF8yUOh5Rh7joZKWjenfK7mI3L6hU.mPg6zMcJMnH1qb.A29SsmYll6L3DXCDRwp4eyfCfpPR.jmnqXtne8yEKa95WizvEqVYh+eCF9F++ICu90nmdHAJTgq9FeuLfXEtKg9XCgoG5HQtW50BlP4NwB+K3Kow9oGyQ0X+zF+IIFyI1AhuN8QhfItOMVCLt4w+CdZhNTIiydtWDpW2dFyAFwu11Vkt+BH+TsM+tUvl6uB17fUvlGtB17nUvle+JXyWtTaTaFsSjTLWuTDTXsW766XZpuMXbUuw+FAS5qR
-
@MikeB If that's what you want then yes...
-
@d-healey Now that's a diplomatic answer - isn't it? :winking_face:
I want my PlugIn to work smoothly in the end.
And the many graphic elements of the GUi do not disturb the audio flow.
I end up with four arpeggiators that control four AudioLoopPlayers.
Like a small drum machine.Since this seems to be a larger topic, wouldn't one of your videos be a good idea?
-
There is some good advice here - https://forum.hise.audio/topic/79/scripting-best-practices
Basically if you are updating the UI from one of the realtime callbacks (on note on, on note off, on timer) then you should defer the script - it's a good practice to always defer your main interface script.
-
According to this, everything should fit - I only have one NoteOn call, and it is in the ScriptProcessor before the arpeggiator.
function onNoteOn() { if (Message.getNoteNumber() == 60) Message.setVelocity(5); else Message.ignoreEvent(true) }
No timer, no control.
and now additionally Synth.deferCallbacks(true); in the init script -
@MikeB I don't think setVelocity will work in a deferred script, but I might be wrong.
-
That's funny, that doesn't belong in there at all - good thing we talked about it. :beaming_face_with_smiling_eyes:
It was still there for testing.
I was wondering when the arpeggiator was off that the note was played so quietly - no wonder with velocity 5.You can already have fun with the thing here
-
@d-healey said in Separation of design and function:
Hey David. In your snippet I see a line in the midi processor timer that goes:
Interface.setAttribute(Interface.Panel1, 1);
How exactly does this work?? It changes the color of the panel on compile. In my case, I want to pass it a reg variable called count. I do this with
Interface.setAttribute(Interface.Panel1, count);
But how do I get it to repaint the panel on the interface right after passing the count variable in that (midi processor) synth timer?
Edit: I can, of course run a panel timer (for the repaint) in the interface… but that always misses the first beat of my custom arp graph. I’d like repaint it immediately after setting its value to count in the synth timer.
thx!
-
@UrsBollhalder The panel's control callback is triggered by the
setAttribute
call. If you callcomponent.repaint()
in the callback it will update the panel. -
@d-healey I’ll try that! Thanks a ton!! Thx for the continued sharing of wisdom and knowledge!
-
@d-healey It works in sync as long as the notes stay below 8th notes. But as soon as the arp is faster, somehow that communication between the synth timer of the midi processor and the panel (which paints my arp), gets scrambled up and it only draws an occasional beat here and there… if I set up a panel timer to repaint, but works. But I’d rather avoid that.
Also, for the love of god, I can’t seem the get it to work that when I press a note, it starts drawing the first line. It always leaves the first note a blank and paints from the 2nd on. Although I reset my variable to -1 onNoteOff… -
@UrsBollhalder said in Separation of design and function:
somehow that communication between the synth timer of the midi processor and the panel
Probably because one is realtime and one isn't.
if I set up a panel timer to repaint, but works. But I’d rather avoid that.
Panel timer sounds like the right solution for this, is there a reason you don't want to use it?
-
@d-healey Too many timers… trying to keep everything performant. With panels full of paint routines and shaders…
-
@UrsBollhalder Why so many timers? Do they all have different intervals?
-
@d-healey No. it’s not that many. One for the granular, 2 for lfo’s, one for the shader and one for the panel of the paint routine so far… Just trying to avoid too much expansion in general and doing more with less whenever possible… But deferring the UI script is a priority…