How do you change the 'SaveInPreset' by using code
-
@d-healey Yeah I'm struggling to control the 'saveInPreset' value on the fly but really like the solution that you've come up with. Would never have looked at it that way!
How do you check the status of the lock button when the user loads a preset?
Is there an 'engine' function that can be used or something.
Thanks again
-
@LeeC Put
if (lockbutton.getValue() == 1);
in the control callback of one of the controls that has saveInPreset set to true. -
@d-healey I've had a go at this but I've hit a dead end trying to figure this out
Was excited to try the 'duplicate controls' method that you mentioned but couldn't get the two slider pack arpeggiator controls to work independently using a 'lock button' as the slider pack that has savedInPreset disabled will always reflect the current state of the arp.
If you could take a quick look at this code snippet I would be eternally grateful. You've helped out this community massively and we always appreciate you time.
Thanks
HiseSnippet 1639.3oc4XsraabCEkikYPjRThcPPetYfQQgMZhfjyi9HHHRxRNP0uTsbbypFLZFJIBOhbxLbbrZP.5GPWzOg9Kz+frua5eP+E7xhtw8RNijnrdjwpMAEsyBAMWx68b3kWd3PV2maSBB39HizGzyifLtJtQOlnyFcrnLTsJHiqfK46sM29Hy0Qk64YEDPbPFFodrrCFoWDodN8QksbsX1jglPnC4Tax1ztTwPq0KtE00cSKGxAztZ89tEqYyYavc4g.YRgyi7rrOxpMYWKY2V.iLtTUGpf62PXIHAHiEKyc50nC+Ern9eHMf1zkHeo.pADnHyaxccjLVZEsQGpqS89C5.Dx.WeXJHUTJ3l3cnNzA1GlJVR0f4POzyGFKLK5UPmd4SN8VPidKFQukwMr8odhgsDMMUiIH9srfo.cZE0WzB+tAdCNzClHWWqiHa5CuLviUue972x7d4yu1CxlIaFXhHPXdrkuYCWpCwuNLSTv7gl8CPahXCdWONCdY0Uz5yJR+G5sKT0zLTH3ro57vtrxZYxPYtTFwrUHyVPAu3LsfKCfO2cUVX2lD+aAH3FRVKyKylwDdnsLWcXvjnbnr8UWy7gOzrvZOP0I0Op+7pLYzBct.IoTgeCKW2lfsUmD1q8.MpsKWP1isJvfLog3Yd9lZ0ZhsEGJWh+DaVtpveVNN13OpiP4wn0e3oW+ou7vNZZQqibVMFUrmGgMspRT7bor9LlU.7BU04MhqNGl7PTnPLKVKahTTWW7vwRXgL9Xbg6mCdNtzF4x0pbE3ueSc3GQoRQXp.JUDPWKFnxpIbEHWEOrB37X.OOoVEILvphX9CiIOhufJSWFUHGCpUQKwRiqPBNRv8.QmAEqvZLQr9PDxa5xsDTV6CnPZUh+0w5lJfNY.7+v1E6oykXBDg10AMHBTAV1m+h.hOpY69xfouDz2+P5.UP5Nz5ub1Oc1nVWWZ9We8YJypgowOiUKMVQN01v5XRThZkuxT3GRt0flTBP9SoQYgbvXVkEZQNLdaaZcL2G3kTMejF2MTR0vtJetS1LuB8BpinCTnZ7mFHTGBscGg7MrgJAMHqiu.EVCy3nc0x3u1qnW+52ZNxZGXOMR61TKXASgQP6RIFs00meOVCskd9LQK.lKpwhlxkJzSXrlMF8ssZRbU.eYr5+pQH136.T5I+yOB4JA4DvyOD2nzgUqTa256WsQ0CLusY0cKUd6pUPWj3qOlL+dswzomTLBmOZLbpTqwTA5MsHcHZ48zmudYLZYwpu7H1cz36UmUO2p1H7bY6Q1hN0nRjoRlD4LE.WNA5RWCGwhxSSYJAwHKdekFwEMDQ0qwxSvZvFBhWrsyEjkJljfbErLBJtLerXIU.ZbDcJz3zGkjzADEtuXKRuf+NYDXv3QHNaw3MOe.9zwyFKEG.nLuIuL+DUH.gBxyCIvW9NvbxGPZTIKdOaAnLruEqMY9FMowM5D1pk6Lce1aSCasQ5RO.VDq0vXQ6hra8aBuCIfb.UzKw305yJWJWtubK.u6DVO58Di2MvaSXsEcRNZGIQ6vuFP6o75QuiRVkwxX3jCLFwsAwkXKkmdyEFSLPuOduPgWn3envsLdm5UAIP+9AbrTPBK8utLPUYNSIL4KhF+vKvQn3NgtRsY8yUIOLYbCvG6Nhns7PJr.nBQej9V4vVIktKiqSE1clLeWXB7U9cxuk46fsCq1pETcLjrKh27ou8OmpNUtVDU.sU3rbpKSPQj2S8t42BZblOlvH9iu+7nWovukzqTvKwWoPjD6A9Vr.OdvHAtutWftwmD.GTl778kyxi946V9SroSezlvfbh9zvRD5qJWJ0kGxDiTdjJwyIWfq1Xw+Ue0Fu6DGRkL5NgLnQ8wteLPIj10ykTkcLryEXQxwa.mWrkUnqnu0Qqq2gy3dc3Lps9j99DgOscahuN2m3.pjPH2oZfkaVbeXO.K8B3Oo31PgmkOjmHyYtnPxyEyZ95CvQz0TtXz7+Fh5o9+on997P4kYriETnJO2o73CfVJ7otQ63KukIiEj5gQumGEc3cPLk4nd4L3ItwBx2MharP+FemfQWKae9yri9lFYs7kUVfwMSc4xow6He2bvESgw4ykG0ETDelssLceaH+LYeVeN74NygO2cN74dygO2eN74ymCe9hY5ibynRgBd2nkhfg5UitUKipLKnRVU0i9KGaimXA
-
I've probably misinterpreted your method to be honest.... Would be ace if you could steer me in the right direction.
Assuming this is all possible to do in HISE that is
-
Ok I played around with it and had to make a few changes to my initial idea, but it works.
Firstly the lock button needs to have saveInPreset disabled, otherwise it will reset to however the preset was saved and then it's not going to work.
I've never used the arpeggiator before so I didn't realise the sliderpack connected to it via processor ID. A control can't have both a callback function and be connect by processor ID, it's one or the other. So I removed the processor ID on sliderpack2 but kept it on sliderpack1.
So now sliderpack1 controls the arpeggiator and sliderpack2 controls sliderpack1. This means we can hide sliderpack1 all the time, we never need to see it.
When you make a change to sliderpack2 it will be passed on to sliderpack1 through the control callback.
Now the last piece of the puzzle. We need a control that has saveInPreset enabled so that when the preset is changed we can check the lock status and update sliderpack1 or sliderpack2 as needed. For this I added a new button called btnTrigger. You don't have to do it with this control, if you have another control that is more suitable you can use that, you could also do it in a timer but I prefer using control callbacks.
HiseSnippet 1907.3oc4YszbabbDdWBNxBvFRjpbE+HWlhUpT.kjAAnrUjeUBfjf1HhjBEAMku4ZwtC.lh6NypcmkOrhq3eB4mfuje.4efpbMWxOEcLWRI2yLK.F7fPKgeUUxd.E2dlt+9lt6omYa1Nh6Rhi4QV14O9xPhk8ag5bISLXmANTlUqcsreSTinv84tmh2xZ6KCchiIdV1149B4Dryupkk02+ee5e+Qa636vbIohTOmvotj8oATwXosq+Xpu+dNdjioAFy9Cq2xky1g6yS.xjCU0Jzw8Tm9jCcjSaEjk8MZ5QE7nNBGAI1xd0s4dW1Y.+bld9mPioc8IxWpY0ALjV7dbeOIikRs1Y.02q8vEcrkkMp8XWPNsK3sQGP8nijO1UrlZ.7XML8G1qrH5U60SupyidqXPuU0zacTG2HZnX7H5vTKlfD0yABAlzROWqU9mqh1gCyfIpD3bJYuH3kQZT5AUqdO7GUsZ4OsXghEf.Qr.elSDtiO0iD0FhD0veNdnA5SD6vCB4L3kRaXLmMj5OOs2JCZu0TZ6C4bcSDBN6JUd7T1nLvaJymxH3dILWAETiyLrtzBQb+RtCU+d.J9IjxEK77hEvvSOdDtDE.q5mho3OCOZlRTOLIPar3Rkggu6cKqUJUW4iginRLQnesA3k8HWThduIsmdzSjLngnDsrbsKMx2Urv2oBBYvcIQIcYsiiueWPZo4sl0Q0hE1byiin86Sh.pnF.KF3HvmCaHwQIL74CHLbXDALKlFicG3v5S7lmesqfkZpE6VyS6gKMNJIWLpkboxkwatYqdpfrDKByA1b.XkeRO4VURYgzqu4llYTfVhADbWdbLnFwOlLoI8nwo1bp3zlad.rC.GqrUnxVANB2AFRpMd1SmUXxsEjWLElSuplW9gY9yBxPTYIYIWYbP5pRUlILJwvHLeHWPdBqT4BOuP9B.lSOTudycrTi4Shl6vxB+QKRwRrjftjngYRCmHTAbxRrnrUh0U6cLlHm0hQEOIjvtpyErRcoxRvorBfWnJ.emzBviiWVTnVaQjQ.zRQciCCq64Hbrr+8nZOnh7owNvOM2G9431vOeYiczXp.JmFnakBz1pMOJPdKz3X1LXXY8Us1UBCT3Ok+vZJjDInR2k8tjyfCj0mhjGsKI9TAOzx9MFky.GiHROBTi7d9bGAk0+XJ3Vk3eajonZVWLB9ue+5WZxkTBnQ61vwrxxJaGwOOFXd29COoO+Mf49ejJPEjfwR+Gu5u8pIktkT7+5EuRIVsLs+AjZK1FxPaGmyHZG0FeBVDkPt2ngTmwFcECJSjimQpLQSqvrismyY7HfWxKrLwfPs.fpIAJctOr4z5bpmXvHuxO7WqOfP6OX70gZGV2xv6eiqQB1XOu0gFd9WDVObXdbKOYNDb8MR+9TGXiCjVNbKhcNSfuYlAdKyP9YF.u1ypGCgfVLcjVhftdZi.dBy3FfqUOXzMGgmG9h.Gi0xCmvgfz7pXJu12oKwWQoahT+8DIfO0zMbQcA4BvBuGpSiSZtaqCaeTyNMOF+A3lG1X68atq00AGyUM9aMv4kCw48mAmca0YVftwB1YO9bRCzpFZtpddJZEQpajmp9z9cS.WMakRLh.erAfs+K0sl8BxEMyoT29bprrItWbtIKZmKaEsWXI40yPkxagzrHUzr0JyfMJhNRU055ZB81kzBlxaHHHgoxlxHqUOKF4MQRKn3xxwh0TFnyozqfFu7QYwc.VgGIdL4x3eJdDXwDRHdOlw6NsA9iy5MVK0.PJcW917KTl.pSQdVBA9byQhy9BxfJEQOwU.adNRdEyka0jG0YPRud9KT8EewA3vVR.8XXCqw.yXsqy8Gdc3cBAp0PEWlY75c2saToxG+3cqT49Is0umY7tCZeBquXP1Q6TIZm7mAz9Zda86VYKyXcD745LFwuCwm3JKO85SLlqgdGzSRDgIhelL25nCZ2DJAFMzfydAwrYnaKMTSl2UXlpSTuNsiAqgNf6k3KqMa1LCYGbRG.t98DEskcFfECYHlqzqQGNpl4FvjU5tNpME9Fs4y2UlCek2b+WX9N53vl85AYGiI6pn895ks4PKGUtklJPsU3K0UcvSQjem5c7SgZb3ufvHQyd9rQe7fm+cV6iWXl6imtD6wQNr3Pd7DFdXcuXSgeULYuHxyNRFkm7CJbhl6Pu7Q6AKx4pSGGQRjJcY5agBoG49kngcq9aP+D+4e21O8hC4xFcmiGzt8LMkFpDRCB8IMYmAmbARjb7NvWv1yIwWLT5j40GvY7vAbF00LneDQjdiWCtO2ETCgPdR0HIuc8ify.bLSf+C02GR7bh.+DYI8E0xtuXQwq2EooKVtYD++FE0y8+mE0OhmHauxANPhJ7UYpOe.pkBW0UehuruW1qHqGpeup7ccwTlm5kWAOoCVS9tc5f0FN3uJXD33Fw+lzFMKykuoRBrtYp+iN4QGHeGOpUYHT0JUsBfJheiqqzc+Af+Y95r0Rny8WBc9vkPmOZIz4AKgN+okPmGtPcjGF0HQvCzaEAAsap6ylcSc64UMW3GA33xj9F
-
I would recommend a totally different approach: having a second (hidden) UI element is rather weird.
Just take a copy of the current values when you press the lock button and restore this array in the slider pack' callback:
HiseSnippet 1847.3ocsX0sbaTCEVaRDPbvsIcfgKfKD4FblVL1sPggxOt4OvsMsdpSCkggoi7tx1hrVZQq1j5goyvvS.uC7Dva.2yKCWxckij1+bsiqSlhuHSzQme9NGcNGcV0QI8YwwRExa0CGGwPduIt6Xgd3NCobAp8tHuKgOfFqYJhiz1iinwwr.jm2xeigf2pqfr+9mudaZHU3yJHgPGI49r6wGw0ET6z5t7vv8oArC4iJw8G2psuTriLTl.3YYbCTD0+X5.18oF1VBi7ds8B3ZopqlpYw.OaKCF2cn7Tgi+i3w7dgLyhlntfhbjQ6LjGFzIyWiQHuU5T34K6772Be.OfmSuHBrtcCRgDkiAdKMIjVYBH07rfz9xv.iBNC3sTI3shCdaf65q3Q5hcLXaMbaAb3zmBg8xvxwKZo5uNdGIvgPWeD8X19JXQtD0tYiFWi7IMZr0spVoZkO5iHGNjGSNENcHGyXQD8PFYyPo+wrfMImPCSXwUqnXCHNZcC4AL0QV5juj7C+nUMvYXrF3VQb62ANDaBamgiAL8NxQQRArn1lk3YSCLJj9dfM1NQqkhyT3BV1z4BUqvEgbAizOQ3q4fnRQASFknjg07yzv0bN0VUq7KUqPfePHXmPFXbim6bRGKjPdr1wyY66lcqVYUd+ZYp0PIU0YpWFM1pc+DkBfPdXsDOeGrKU7AZxOk.wBMbtYkfpTzwvoidHABCVSWaKROlOMIlMgBNkQNUlDFPjQLEjWBQAqFhgBIR.USMqD0qWuPpo8p5JVLScBqVoiHS7+9IibThqs0V2pPCE+WeopFGBJMtEgS9BxbjGX3pWcqBIKEqNCPEkDO7EQTIFtstFGPUtVdl8+dV0JOyle7xSipGa1xlmrCMLrGXiZyHG5rS2JgsEJeaWIQH0C4hADd+x4clLNBTNxFEoG6XGxrlQHIjIF.4DeIDvKEJULchRjmUNWqQ54py3wlrNlfBcrBxM46W380KR7dol5PSRdZHzjRXslC3l95t1L8fXGWAdqMsF3HWb+gTw.XCtHf8TCXGKSH9gbPR.oTRrUSYY1OpMQpxkMSYfqnAsmV4jpCHsF5WCDIQlLbc8bwZazEDw8owLSMjs7qGDt.6P6ISzthHFziJvxTtjwRC+9CY.5.yvsGbTQpgC41JXd7mmGSs4AYmbeU9A2j8Jtiw9ld5FEZLsqWA7uTMXuO3DlwENgKShCGOgj9xHNKXhB77jPSFt6Lb5bozJmm4NHmWMyD8smcQyzUBYUMkJWtuTydfn1VU9kJqVApVews52el6kpvPlZlaaFrPMOAqIRF0ioxJHyXDtscxqyWawtN22EiJwnTzVv0OHhktt3BeydNuNa2FnbmsLoBerLUqqMC1JHM87DnzyPXxBuT1AOUamq3JoyUTbZg3.NqhKc7grQIjG1yCTl4BDj2aiadcHAq9C291ve+lcqW+aUcPnG0dWy1oFBrIfC3RHM2DM81ExV8YtAZVEuKK9XsLBPcdhEx60OGv5o4CO156aMNewe0oUTl22NvLB6sUQrAC3T3jEN1x0PaSuE2Yxo7.8vhYQG2BUBSXGltTJlb8Bs34MwEMGKAGTY3f3shomvZK5X62XFOqrxWSmN9oS46GJoZn+7gbHMyXhKiKSprSiduRV4WEsRi3tv6kwNyssRdJbONp2frIqW80.1+WKvzrQET+ym+6OeRpW2P9u+qmaIaOW89CrsG0llT8tfWkdu4mSzpD10x2xltqx2rOMLtztlj83oIaJ8bhDOsBomHU.xLehvjRByS.nMYjUna.csdgyxneq0PFevvhu.okrEZ54+qVNKI8SelHuYhw9WddeIRyE+KQJUZtQdo4xmY91kvNTjRJstr36sPKfNphenMwXBUf8lq3tZlz7QyDbZVTJsbErxBpf0vFosX3b3.kTv5VEz8X9TPvaACAfFjJ8cYiO+AxIcjHFK3tBYuBHr1rDd8Tggx9dxskO0JNzhi8yIL3KlyIuXNRIHTE+.eMTF9PyvRm+yxUwcGlzueHadAf4eQAz2hMheHzLqzFSoM2cFuKt4MqO6emC6cDCFbgqG+xs2YbG0BZoqfumc9rE1u5erwNGcGvNOV1wsdAyE1.uCLuqfE1kEx7MMflepvLUx6fePhNJQ+JPUafOnydPyMUlxJTxRKrRtrQI6IBlREqaeFnodhi0wGHCRBMcaK+5KlmYJcCXFtIZCadJCQLjKT9YnNGOISiY9jLMmUe5EDtaf6v09CmMdWZF307ZO+Oi27K31qeeHin.rqf2+wuZeMqYBkGBe5DL9xATshCSuXu+.lt.564RLhyRqRW2HqEVWlHvt34vuzMalkHa1rY1lnQTek7I9tzRySn8FVJ.lD1WObU7Al0jhYYwMp2.MhGvehuuIT7g.1msLW+BHyMt.x7wW.Y9jKfL27BHymdAj4ylqLlGU81IZ4HWYBPnydtYL81y8BD1Ik+OjXiR0K
-
Wow, thanks both for 2 great working solutions to the problem.
Pure gold!!
Hope you're both good
-
or theres this(a combo box listing arp presets, and an arp setting save button):
inline function onSaveSettingsControl(component, value) { //save a setting local arpsetDX = ArpSettings.getValue() - 1; //Console.print("index is:" + arpindx); ArpSettingsArray[arpsetDX] = Arpeggiator1.exportState(); //Console.print("arp settings are:" + ArpSettingsArray[arpsetDX]); ArpSettingsArrayPanel.setValue(ArpSettingsArray); ArpSettingsArray = ArpSettingsArrayPanel.getValue(); //Console.print("retriving:" + ArpSettingsArray[arpsetDX]); component.setValue(0); }; Content.getComponent("SaveSettings").setControlCallback(onSaveSettingsControl); inline function onArpSettingsControl(component, value) { //load an arp setting //Console.print(ArpSettingsArrayPanel.getValue()); local arpLoadDx; arpLoadDx = value -1; ArpSettingsArray = ArpSettingsArrayPanel.getValue(); //Console.print("returned value is:" + ArpSettingsArray[arpLoadDx]); Arpeggiator1.restoreState(ArpSettingsArray[arpLoadDx]); //Console.print("num steps:..........." + Arpeggiator1.getAttribute(Arpeggiator1.NumStepSlider)); ArpSteps.setValue(Arpeggiator1.getAttribute(Arpeggiator1.NumStepSlider)); ArpTempo.setValue(Arpeggiator1.getAttribute(Arpeggiator1.SpeedKnob)); ArpSwing.setValue(Arpeggiator1.getAttribute(Arpeggiator1.Shuffle)); ArpDirection.setValue(Arpeggiator1.getAttribute(Arpeggiator1.SequenceComboBox)); ArpOctave.setValue(Arpeggiator1.getAttribute(Arpeggiator1.OctaveRange)); ArpSteps.setValue(Arpeggiator1.getAttribute(Arpeggiator1.StepSkipSlider)); ArpSteps.setValue(Arpeggiator1.getAttribute(Arpeggiator1.NumStepSlider)); // start it in the off state Arpeggiator1.setAttribute(Arpeggiator1.BypassButton, true); Content.getComponent("ArpBypass").setValue(false); }; Content.getComponent("ArpSettings").setControlCallback(onArpSettingsControl);
-
@Lindon This looks interesting
Would actually make a lot of sense to include the option to 'save' an arpeggiator sequence.Will take a look when I get back to the machine.
Big thanks for this!
-
@Lindon Reviving this old thread. Is combobox still the way forward for Arp / Sliderpack presets?