Many knobs to control even more pitch modulators in a scalable fashion. How?
-
HiseSnippet 1711.3oc6as0SabDEdWfMM1IMpoJppONB0GLJDpM2ZknUXvXRsR.rvNWjPDz30ismxtyrc1wjXUk+K889SHOz7XqTdnOzeBsum+AsmYmcwqAiw3BI.ZsPHOWNm46bYNem0VtrfaS784BCyTU63QLLusUkNLYqBsvTlQo0LLui0FXeIQfzSsZGOruOotgo43OTMgYpILBd89kWE6fY1jtSYX7TN0l7XpKU1c1x4eD0wYcbcRUparcOe9R1bVAtCuMfmwsxZ3gs2G2jrIVsswrLLuQw5TIWTQhkDeXOqxq2oRK9KY58+TpOslCQMHmQEPQ5oMJzh5Tubjs5aXX9Ik6Z4iqs76YsAsN8v465A9rfEPckHtOvbrAAobmAHYFCRSngzcspXKndxtqnvysrJwf.RCL3piCE8dMF6ulvp.G1ASNiKdex5BXvgRjYwrYmFA+apkRm9q+ZjcKLqIAIaQ8QM3BD4.hnCxSv+QhsLMDO7knCvBT4RUK7C6UZy0J97hUPeOZmIwSNMZxZp+YO4tKgN1dqtx1OrX03hrStcmFsyrSilaZz7p2t.fjc2UCjpJD7RHw.0h6TGgQNTPc7FHLL09LdM+XmfGUZ25QpIU58jzvrq8.rPf6DoEIVzjH8QY74fAikv+HHJqN4UpcnFnNGjMlgpQPvow.e.oNRxQtscjTOGRjNl5nfoZnt6BmsXfNfisFjDqTgnsR7VDWEVRSYNTXCMZyrkTNCwYkiroL1bWONCheSC52oMYpz+b5TfFgCHFjaH3tACUNpzob3vggn0eE.gttmYB16VM5pSHtmJPa9f1h6Unr.soGp89pDB0bMoGPX5iMcJXxLR0tia26.G7tSkNUJ4LfdUYaLeprSFM9WJ8q6FgNzjCBU1BBbwQexujiBhW9n1PJcDfh7gGykQYTYl.eiBRTvtytDhh9tdyUmwgvZJaAqb+6C.D1cpXtGu19sxDcaALjBQtoLSFDO1aRz86Ue6P2cJkOLlVfoTVsRMBtSgP7lIVHMP.3OcPR1StRvBJKvSYw86ti5Hg8jJTNMnCJSqf7F75scvPInLSVPkShYREn8lJ5PiGmzxFkDCa30pPi1SBosoikOtIWR1hocvvlPGcoFM56ZgdAGhnuKqJ4KFjfYXscqQDwS8UaDpI1ag1aLbEZs0w1XajyJAl6VdjvwqCEKTEPUu+3kkMBSNfBziGhP3cxfxy2Ir7bEGZchvfBJIkkNsAaD.+Pxs29t282KabFDuVOhmO8yPu8rHtcOhqe8jRqgkXEOSnEAVoGQHoJmo4ZjC.hZMqSJq0H96K4dAlb38AfxbHL5W08HKkuS2AuHuKsdcGRYNTU.B2wQla7lHx7VWbLkjIuwYBA0THvx72AQ+Hb515S+ElmWm9w6H.5EI55d7FTTchEtf5Dh2Uvg0hi2o1Q6ZYhS9xT1XWlNkqJCIbuq1c0e7NVevKjzdQi2vd.+TqhMZ.j9cA6DVq+7A1v24NTtiFJ2xpBv1ETkO.HeQvXzyvGPPOjvHBkSM2.5G+OG19w8F59w2xVBGeUAl46w86QwUHtzpvME+3S9Den6SxOssJJGe9BbrnuK89kWGLx9JSErrsHHcYEWdalrmziwGTL4Detfdu0DKF1mtym3h5AF9fd06+ekhwGN3dJOeSpHLVg5BcUWjc.wAXiBv3mCzOMvP+1Qy1aR9FbF2qEmQsimArMQJnMaRDwwdeMnUjRn4rtybu7aSbH33YyeU9GCYgXA3mHinu3r+rd8Md8kVZ3hT2LQWOpvO9PUg+7w2ZoAYZqnNiCe.5ng4FHv9k27lec4UodbGrPQMctgwKSLOayaKorlafgKPp1W1rsaEnfuMAPB7.vN9pVZFSUzVONqZrthOqdvf+EdEtXN0XyvEyEsXby8lmvGyzsC9LKfQjARp89yeRsiRdbI7CU5JFGQR2jWM6lb1jtIS5l75d2jylzMYR2jWLcSN6fAl8e7O+VR2jmqcSdVX2lKgc6zY2xkvtcklcatD1sD1sQKO6zX2lKgc6RL617IraIraW2Y2lOgcKgc6hgca9D1sODraW991Fl8p521vMR3gR91FtB+sMrPRGqIcrdcui0ER5XMoi0KlNVW3zAVRGqez97XVLgcKgc65N61hIraIraWLraKlvtcc4yi4CwY3hsE78r0+DoT4Z2LXFv2xB9wCmxZC0XTtneYTVVYmIqgKvFrmssJj9.HFzeYlcDjYtQPl4GAYVXDjYwQPluYDj4aGnLJh3UZK4t5xPvDkKF7KTyzrHCC2VBtYY7e5yrqA.
// change this for every project const var PITCH_INDEXES = ["a", "b", "c"]; const var PITCH_TARGET_INDEXES = [[1], [2, 3, 4], [5, 6]]; // This will hold a list of all knobs const var pitchKnobs = []; // This will hold a 2D-array of all targets (so that the index of the knob can be connected to multiple targets) const var pitchTargets = []; // One callback to rule them all inline function onPitchKnob(component, value) { // get the index from the list local idx = pitchKnobs.indexOf(component); // set all targets in the target list for the given index for(t in pitchTargets[idx]) t.setIntensity(value); } // This function will create the two arrays used in the callback inline function init() { for(i = 0; i < PITCH_INDEXES.length; i++) { pitchKnobs.push(Content.getComponent("Pitch_" + PITCH_INDEXES[i])); pitchKnobs[i].setControlCallback(onPitchKnob); local targets = []; for(p in PITCH_TARGET_INDEXES[i]) targets.push(Synth.getModulator("Constant" + p)); pitchTargets.push(targets); } } init();
-
@Christoph-Hart I guess the difference is that in your example, all references are already made pre callback, and it will be faster? Is there a big difference in runtime?
-
@ulrik yes when you automate a control in the daw it will be called in the audio thread so going through the module tree and comparing strings to add to a array is absolutely out of the question.
If itโs not automated it still might clog the scripting thread more than necessary.
-
I usually try to create all references on init or when you load a preset or other singular events.
-
@Christoph-Hart good to know!
-
@Christoph-Hart Thanks, Christoph.
I do get why it is a much better idea to connect everything at initializing rather than doing it on the fly. However, I haven't come across any issue with the simpler script, as the intention is not to automate and change pitches while playing, but rather "set and forget."
I'll look into this more closely and run some tests.
My primary concern is "change this for every project."
Why did you write this line like this?
const var PITCH_TARGET_INDEXES = [[1], [2, 3, 4], [5, 6]];
And not like this?
const var PITCH_TARGET_INDEXES = [1, 2, 3, 4, 5, 6];
-
@gorangrooves this way you can define how many targets you want to control with each slider.
-
For reference, here is the scalable working script that doesn't mess up with Pro Tools' onNoteOn and timers.
It creates arrays onInit by pulling all components and synth modulators with matching names. Then, in the callback, it iterates through the arrays to match portions of names. It works like a charm.
const var PitchModules = Synth.getAllModulators("PitchModule"); const AllPitchTuneKnobs = Content.getAllComponents("PitchTuneKnob"); inline function onPitchKnobCallback(component, value) { local id = component.get("id"); local fxid = "PitchModule" + id.substring(id.length - 2, id.length); for (m in PitchModules) { // Check if the modulator's ID starts with the fxid if (m.getId().contains(fxid)) m.setIntensity(value); } } for (k in AllPitchTuneKnobs) k.setControlCallback(onPitchKnobCallback);
-
are you saying this doesnt work inProTools?
const var PitchModules = Synth.getAllModulators("PitchModule"); const AllPitchTuneKnobs = Content.getAllComponents("PitchTuneKnob"); inline function onPitchKnobCallback(component, value) { local pos = AllPitchTuneKnobs.indexOf(component); PitchModules[pos].setIntensity(value); } for (k in AllPitchTuneKnobs) k.setControlCallback(onPitchKnobCallback);
-
@Lindon This line was causing an issue in PT, when included within a knob callback:
local mods = Synth.getAllModulators(fxid);
Your code is fine, although it wouldn't work in my use case, as I have a single knob like PitchTuneKnob01 controlling several modulators like PitchModulator01a, PitchModulator01b, etc.
The line with the issue doesn't allow onNoteOn callback and timers to run until the GUI is closed and re-opened.
-
@gorangrooves said in Many knobs to control even more pitch modulators in a scalable fashion. How?:
local mods = Synth.getAllModulators(fxid);
You should get all module references in on init rather than doing it dynamically like this.
-
@d-healey Yes, I did. See the post above.