A/B comparison
-
@dustbro yeah I have A/B running in my synth - export and restore are not any use to me - as I want to be able to morph states a-to-B and to include/exclude voices in that process.. so it's all hand built.
-
-
@dustbro see the post here from April 9th
-
-
@dustbro said in A/B comparison:
@Lindon Are you using
Content.storeAllControlsAsPreset()
or
Engine.dumpAsJSON()
no. neither.
I have a two array-dimensional array of "sound affecting controls"(lets call them slots) - and a button (in stateA or stateB).
I save the array in the preset(panel.data) and depending on the button state I load one or other dimension.
This allows me to :
- have a morph slider so I can move between slots
- Include or exclude any set of controls from this morph
- on preset load I can overwrite the loaded preset with these values if I wish
So I have a 4-voice synth - the user can morph between Slot A and B - and include or exclude any voice, and they can include or exclude any voice from a preset load.
-
@Lindon Got it!
-
Can I get some extra eyes on this AB script? This is a simplified script with 2 knobs controlling an EQ.
If I comment out Compare_Elements_Array[i].changed(); the knobs store/recall as expected but module doesn't update (also expected). With .changed() left in, one knob works, and the other stops updating.
I can't see why.The full version of this script is getting Time Out errors on the for() loops and crashing HISE... yay!
Content.makeFrontInterface(600, 500); //--------------------------eq stuff------------------------------------ const var ParametriqEQ1 = Synth.getEffect("Parametriq EQ1"); const var band_enable = Content.getComponent("band_enable"); const var eq_gain = Content.getComponent("eq_gain"); const var controls = [Content.getComponent("eq_gain"), Content.getComponent("band_enable")]; //function to disable all EQ bands inline function DisableAllBands() { //diable all bands for(i=0; i<3; i++) { ParametriqEQ1.setAttribute(i * ParametriqEQ1.BandOffset + ParametriqEQ1.Enabled, false); } }; inline function eq_function(component, value) { DisableAllBands(); //disable all bands //enable only selected bands local bands = band_enable.getValue() +1; for(i=0; i<bands; i++) { ParametriqEQ1.setAttribute(i * ParametriqEQ1.BandOffset + ParametriqEQ1.Enabled, true); } // set gain local gain = eq_gain.getValue(); for(i=0; i<bands; i++) { ParametriqEQ1.setAttribute(i * ParametriqEQ1.BandOffset + ParametriqEQ1.Gain, gain); } }; for(c in controls) c.setControlCallback(eq_function); //--------------------------A B Compare--------------------------- //compare panels const var Compare = Content.getComponent("Compare"); //components to store const var Compare_Elements_Array = [Content.getComponent("band_enable"), Content.getComponent("eq_gain")]; //array for value storage const var Compare_A = []; const var Compare_B = []; //populate both compare arrays for(i=0; i<Compare_Elements_Array.length; i++) { Compare_A[i] = Compare_Elements_Array[i].getValue(); Compare_B[i] = Compare_Elements_Array[i].getValue(); }; inline function onCompareControl(component, value) { if(!value) { for(i=0; i<Compare_Elements_Array.length; i++) { Compare_A[i] = Compare_Elements_Array[i].getValue(); Compare_Elements_Array[i].setValue(Compare_B[i]); // Compare_Elements_Array[i].changed(); } } if(value) { for(i=0; i<Compare_Elements_Array.length; i++) { Compare_B[i] = Compare_Elements_Array[i].getValue(); Compare_Elements_Array[i].setValue(Compare_A[i]); // Compare_Elements_Array[i].changed(); } } }; Content.getComponent("Compare").setControlCallback(onCompareControl);
HiseSnippet 1542.3ocuX0saaTDEd23rHrAW0J0GfgbCNjzD6l9SPgp5ehMJBZqAWppnJJc7tiiG0wy3r6rkZhpD2xkbAHk65KAWvc8Qf63VdD3M.Nyty5c7Z6DWKZ1Dk34727c9YN6bbaegKIHP3aYm+wiFRrr+XmNi3x9M5iobqC12x9CbXBwPq5iFhCBHdV1149REO67qZE87O2uNlg4tjTRVVOQPcIeMc.UlRsc0uhxXsvdjGSGXH8spdfqf2PvDg.Nx4T1ZH18E3iIODqDaEG.DM8nRgeGIVRBrrWstvaTm9hefGK+SnAztLhZQEqNfghI2Rv7THVQ0pQeJyqch+FXAVocp2mK16utyCndzwzSiBWMhAJUCy3g8JmG7pXBuxKN7rMf2pwv6ZNcb8oCkobTX6ibNfKI98vPJvDVwxZsxuUvog.jfK2Z.9EjV9vhwZT5NkKuI51kKu9dEKn9Y6suwbeHmfBjg85ciE3oXAHoFHQuD6iZi8gTozmdRyuoB5dnnRrsNlHa1qGwUVZsTAPfDqovRp1cwbuiHbLDBAcSbEP6FhACEbXQo0LjIi1jSN5XHKNWM07WK1+S0C9jzWvB.Ee1En4lEKfl4yBf0C2KNn2Kj6JoBNRJPdzfHmEyXP3Hx+CJVfxYTNAMVv8ikpFiUWIPo0KV3zXfr81dzwFPqshdOgeI58JuGh9E6.+YiMVOl9oo3ehL0VADYMIrnanjThh9rLrU66i50CjBsQFVMibOuMQ8vr.hJ1pr9qKV305xrrdCDLS9bI2jX0lPlfERh8r7S4v6E6pAY807vuausthQvYiPADFTmQ7LiFLgKVqBjiMRJpz0ST6ao0QaTAvadi.Wj7WVAOoenYrS8ujLLRonp7yzYzE55BSC+XuoJ.tL7C06I1LBTFNQ9jZ.EXbQ.fSNosNxUsYMhW1.Rncg2CTxnxHoG0E0mpFpNRcfC6SN2NTw1wMVRzPLmvBL6Answb6cn4q6cDaoHVApiwAvqDHS1TQqvQMYjAJwNpluOdz7awLQqh41lYQZ5LtY0gi6yii1aHMDeJKBuvacmMhqo.4g6MKV0SXoL5PwvPF7ZPTWgrOJIzFsUAw4bcA3rCEawH7ik8SJL0EkiAwynGFkLlkp.uoq3Giw2IMmWSJ0sThLftFcdcpn8J8IIqyb15cMBjn2oSl7W9HRVKLsJAIpXF7TpCccVHC31GyOl3Aa43c70S2CCBRWNwn5WFwnZ+OFihK+tfVNypUY15SEfLJdenPRdDuz5ENsP9BvtkkUudyjm1XLh+LYqtLu+4oXId3ftD+jiHIBB2pcxqM6L+qMadqd233hgfB9Abp7QCI74cYZKcvDtVcNMpfOIitT8UzWptCi5Q7snvcmK5Xz30JB1FC2T0ZALQdGcG2IT+uO6rhyW85gRofqUWmImZ2sr9tC1GKwpIDzdE3oCI9RpJHZuO4kvnWwyKj2YeRvKjv3aJ2VWCASSsfN9qFusOGWcz3E+jW0.IYXG5ORLmBb.9UYBRi2vBKPXJU4pRiMyhTcfvS6KtztDl0.yoO28sSru6lEZu4ry9i6G.yrPAobbPd0A887Xj1h.ppNchPqAlWcAxMoa7a3FX9OCqZM8vavHjBO06FmbtR0kjzLTnwb.N0PZb.kiLCyuWF1bQg60bZSkt8mMdWYF3EpReeiW8n6EchGlLErq5z5oK6b5y9qQn7EMm90SN20Hz+kjlmnywSNd6DX5ggCZQYvv3pFf14.WScg5xoQvO8sJBUzDd9U90uuphvMm7Kfg6sSVB2JkvUiT41YM5cRL5ubseNRh6l0F6lkvmm0nURf5aUs1hnjf0pE9qeOlxTfsxNlkHQTl.tsZ8X8PPQ4sbSl2xsX4sYT17shPIke7CvPtP0O.h9cDg9tDnpgqt8uJIrhpQP75xp0JH0gDkTbr+W3QyrhZsslYkDlWJ6w.rqu3njAmfhvOLhB327nuyr7NOPsFUI40GNNk2prpyG8HWW0Qia.GqlsN2bIzYmkPmasD5b6kPm6rD5b2kPmcOWcTe8g0BkhAwsMABsaF8ZbaaiJcq+Sw4ldg
-
@dustbro I don't fully understand why but calling changed() at the end works:
inline function onCompareControl(component, value) { if(!value) { for(i=0; i<Compare_Elements_Array.length; i++) { Compare_A[i] = Compare_Elements_Array[i].getValue(); Compare_Elements_Array[i].setValue(Compare_B[i]); } } if(value) { for(i=0; i<Compare_Elements_Array.length; i++) { Compare_B[i] = Compare_Elements_Array[i].getValue(); Compare_Elements_Array[i].setValue(Compare_A[i]); } } for (comp in Compare_Elements_Array) comp.changed(); }; Content.getComponent("Compare").setControlCallback(onCompareControl);
-
@dustbro - what @ustk said - the only way I get this sort of thing to work is to make all the value changes then outside that loop do the changed() element
-
@ustk said in A/B comparison:
for (comp in Compare_Elements_Array) comp.changed();
You guys are life savers! !!