Controlling multiple modulators
-
The more I play with HISE the more I think you're a genius. Just started playing with the Modulator Connection Wizard, very helpful! I'm working on an instrument with 3 samplers, each has an ADSR, I've put a set of 4 knobs on the container's interface to control the ADSRs of each of the samplers. Currently I'm entering one line for each parameter of each sampler's envelope:
if(number == sliA) normalPluckedADSR.setAttribute(normalPluckedADSR.Attack, value); ```but I wondered is there a better way to do this? is it possible to run a loop through all of the envelopes? Something like this pseudo code
foreach sampler
{
foreach envelopes
{
sampler.envelope.attack = attack_knob
sampler.envelope.decay = decay_knob
sampler.envelope.sustain = sustain_knob
sampler.envelope.release = release_knob
}
} -
I'd recommend using a switch statement (funnily I changed the module connector to use switch statements yesterday). I had to add switch support to Javascript myself (and I wrote the Module connector before that). Having a switch statement is faster and more readable.
You could store all modulators in an array and then use a for loop to iterate over them.
Check out this patch:
HiseSnippet 1423.3oc6X01aaaCDlJNZaVstXcXaXejveoNnYN1NYsEMXq4kU2k0lWVUV2.JJZoknhIpDoFEURcKx22+j8uX+E1.1ej9OX6ndwRNUMINqcCnMBNFg2wGxm63w6NqcjBGZTjPhLtvtiBoHiKZZOhqFt9PBii13aQFW17178o9hP55BtRJ7QqMJjDEQcQFF0tidZF0mEk77xasFwmvcnEhPnGHXNz6wBXpBoOYk6x786Sbo6xBJM6kVYCGAecguHFnTMyNnPhySI6Q2hnm1Lln8YzChPFcLWrWa4S6N34q1Fdru51O+Gtw0osauy2A+cmNitJH2yQto8nm0es1sQNwRIkqd..GYXZ72vig4scYJgzVQTTXMmcMg6H6ghC3oa8CXQrA9T8ftHafSoh6K7c0Fu9+QqOj46tStWLBgL9fcJ7o0R8oep4lLW1X4E91ONQAt.QYWqwLGG85dFomQI5MaJ8trosijEpJzn41mjI80vtTknY9CSSK3HKRg2mHwDkBNutKWL.+0Xc7B3xaSbc0RZ0rPay4wcWZd70laYqEV.+vu2d6sJg8QV4PinZVERkJFMpuTDnm4QVnWzvBiaFPdVyah60AdlOUfvkBRZpCvZlJJRQCsYOWKtaljXOOlFXSbPTyFVGlQnENJiZXUxJkTeJIh95LyRpA50qyhGwPKo+DszIWq2dlZYN0vpgVy5RpNvCS.kdT3xiCEqDX0PJF1vXeBDaF0njaIOOQWvojjDo8dT0l4SsUyb83tMma4p.16j.1KAXB6rAM.4zrYL8hvLNl.ejRxHPEQgcfgCnXlhJAiws7tRyV0HXWe3XtOeAadDrWdwbGESvwB9VBEcadq4rdgUcqCeEMddUoJKmoOUVkV8Al7Xf0hGGLfJmG3qeLMYdQGvTNCyTLWCq5PLQ85NvYWov0apkknnt1UQUG4TC6xjTGk+HbK0PF31hvdDHjIYAqWO4qwdDcn4pJkjMHVQaUHd0jsKmaKOAndUCpWkfF.AZOcYLvTWA+JJrmPtWFkSTgizY.CfaI3aNG.3vwVbon1IM4MROuwh8oPRIe+RG1PHhdkexXIOIMdIG5tYNDBd.Sgi7EG.Kw.pCIF1PgWBXegHrDqz6xPJwMeIhD3MthKvNGQ.LA2DLdLID3QBCkBhyPbL2GRphGIhwCI6SweCtamItWkeN.diV4bUS9w7N8rJ0jqmKcR+9Xo2O0QM1uqwbXImu1qZAeNzBJbLYYGqSWYm76GaGR4SHwyqrnh6CkklbOnhoUHxIMMYopyB9FblJeFcqnVGJK2JT0al7dWLpoRp4corpa19LWpDwb0c9TbABk3mF2Wxu+aqfNEqPCyRAjGYI90+ZEzqV5EZ.H+HubWA5tpxT.4Clnt6FZSJhoFUtqqonUgNU1pPktuSIcur4N5TRUy2Ypfu5yi2x7MqwqFl21yCRzUP1YM6+ym0trNaT4RoT4Bl1LNMo5VBQ9rjw3eRe2+NTtNc0Q5vZxVq+y27sVusiB18ckDdTnHZhE1lFv1Uv0NjBg+XDsuj9K2WeHWV95BhrRUu7V8AarRL1DUrLIZY0.QLWMQzQsyTe4SdoozQXEcAO6+CMo+l+l2+9DE0NcI2OgeGwGlyQaVPnOMuZeBGunYQaemL+RaOnbd2rJWkyidOHnhHAyl912zNN2+WXlRWr9hF9ci700d+Le88EwJFeuMIPmSOCYXtUbfMjmzgBLgyo9Q52YvL5bcoi6nGmlnj61I+EJjorqdrQlxt4JOE0D97ppIz67hBmWT3c2hB8Nunv4EEd+snv+E6Q.wQJdrS5ueUGK+QIR.6lm7V0qatodLzeV1OYU6aBfzaO1wQ6r+Rv6TMhdSMhEmZDKM0H9poFw0lZDWepQbiiAgtVxpwJQP5UOD5e.kD1C9.
It contains of two sine generators with one envelope each and a switch statement in the control callback. The attack is controlled by directly calling each Modulator and the release is controlled using a loop statement. For your case I'd strongly recommend using the direct method.
Also, did you check out the global modulator system? It doesn't work for envelope types (way too complicated to explain here), but voice start modulators and time variant modulators can be added once as global modulator and send their modulation value to its receivers which can be placed anywhere. Then you'll need to only control one modulator, which is incredibly useful for stuff like global velocity curves etc.
-
I was thinking an array would be the way to go. I didn't know switch statements had been implemented. I remember you wrote in the manual about these not being part of JUCE, I'm glad you've added them though, very useful.
-
I noticed a little (possible) bug with the envelope. When I set the release time to 0ms via a control on the interface the actual release knob of the envelope only goes down to 1ms