Forum
    • Categories
    • Register
    • Login
    1. Home
    2. observantsound
    3. Posts
    • Profile
    • Following 0
    • Followers 0
    • Topics 20
    • Posts 66
    • Groups 0

    Posts

    Recent Best Controversial
    • Confused about Matrix Modulator Value Ranges

      This is a continuation of my last post. I made a new post since this is specifically about the ModMatrix.
      https://forum.hise.audio/topic/14944/which-modulation-routing-method-would-you-recommend-for-my-project/18

      I've been struggling to understand how the Matrix Modulator value ranges work..
      I've managed to connect and disconnect sources <> targets dynamically via a Combobox, but the modulation ranges are still way off, and I just don't understand the interaction between the "Value" and "Intensity" knob (I've read all the associated docs multiple times).

      What works:

      • Add Simple Synth and LowPass Filter set to 100Hz.
        Played note outputs 100Hz low-cut square wave.
      • Add UI knob and connect it to Filter cutoff. Set to 100Hz.
      • Add "Matrix Modulator" to Frequency Modulation chain.
        Set to Unipolar mode.
        Set Value and Intensity to 0%.
        Played note is now silent and Cutoff is clamped to 20Hz.
      • Set "Value" to 100%. Cutoff returns to baseline 100Hz.
      • Set "Intensity" knob to lower/higher than 0, and negative/positive modulation gets added.
      • Change mode to "Bipolar" and moving the intensity knob still works as expected.

      What doesn't work:
      With "Intensity" at 100% in Unipolar mode, the cutoff is only alternating between 100Hz - 180Hz...
      This is likely where the "Edit Value Range" comes into play, but I just don't get it....

      If I set the "Output max" range to 20000 instead of 1.0, then the Cutoff value clamps to 1600 KILO Hz, and the UI starts freaking out a bit.

      If I choose either the "FilterFreq" or "FilterFreqLog" value range preset, then the "Income min/max" (huh...?) range are set to (20, 20000), and the Output range is now (0, 1).
      The "Value" knob behaves like before where 0% is 20Hz and 100% is 100Hz, except the displayed "Value" knob % values now go between 2000% and 2000000%???.

      And the "Intensity" knob shows "-20kHz" at 0%, "0 Hz" at 50%, and still "0 Hz" at 100%.
      AND, I can only do negative modulation now...
      Setting "Value" to its max value, and setting "Intensity" lower than 50% adds negative modulation. Setting Intensity higher than 50% does nothing.

      I have to back down with "Value" to be able to set positive modulation, and the Hz display at the "Intensity" knob seems to reflect this shift. But no matter how high the "Intensity" knob is set, the max positive modulation amount that can be reached is 100Hz.

      So yeah... I don't understand.
      And I can't tell if it's by design and me doing something wrong, or if it's a bug.
      I'm not using any of the floating tiles.
      They don't fit my UI design.

      Screenshot 2026-07-28 at 16.02.26.png

      // --- Matrix Setup ---
      const MM  		= Engine.createModulationMatrix("Global Modulator Container");
      const MM_Filter = Synth.getModulator("MM_Filter");
      const LFO 		= Synth.getModulator("LFO Modulator");
      
      
      // --- UI Setup ---
      const cmbTarget = Content.addComboBox("cmbTarget", 0,0);
      cmbTarget.set("items", "None\nFilter\nGain\nPitch");
      
      const depth = Content.addKnob("depth", 0, 40);
      const sli_filter = Content.addKnob("filter", 0, 80);
      
      // =======================================
      //! FUNCTIONS
      // =======================================
      
      // --- Target ComboBox ---
      // Only testing Filter for now
      inline function onTargetBox(component, value)
      {
      	if (value <= 1) 	 // Disconnect MM_Filter if "None" option is selected
      	{MM.connect("LFO Modulator", "MM_Filter", false);}
      	
      	else if (value == 2) // Connect MM_Filter if "Filter" option is selected	
      	{MM.connect("LFO Modulator", "MM_Filter", true);}
      }
      cmbTarget.setControlCallback(onTargetBox);
      
      
      // --- Depth Slider (-1.0, 1.0) ---
      inline function onDepthKnobControl(component, value)
      {
      	MM.setConnectionProperty("LFO Modulator", "MM_Filter", "Intensity", value);  // This sets the "Intensity" knob inside the module
      	
      	//MM_Filter.setIntensity(value); 		// This sets the whole containers intensity between 0.0 - 1.0
      	
      	//MM_Filter.setAttribute(2, value); 	// This sets the "Value" Knob inside the module
      }
      depth.setControlCallback(onDepthKnobControl);
      
      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @David-Healey I've checked out the snippet, and can confirm it works to switch the modulation between gain, pitch, filter using the Global Time Variant Modulators. And it sounds nice and crisp.

      I've also watched the video but I still have some questions:

      • What would I need to do if I wanted to modulate a custom target that can't have a GTVM? For example my instrument color crossfader slider, or modWheel?
      • Is there a way to set the modulation depth at the GTVMs directly instead of lowering the overall gain of the LFO module? That would allow the same LFO to modulate different targets in varying strengths. The GTVM UI does have a strength slider, but I don't see gain, intensity, depth or anything like that in the parameter dump.
      const globalModContainerId = "Global Modulator Container";
      const lfoId = "LFO Modulator";
      
      const modIds = Synth.getIdList("Global Time Variant Modulator");
      const targets = [];
      
      for (x in modIds)
      	targets.push(Synth.getModulator(x));
      
      
      // depth slider
      const depth = Content.getComponent("depth");  // -1.0 .. 1.0
      
      inline function onDepthSlider(component, value)
      {
      	for (i = 0; i < modIds.length; i++)
      	{
      		// Thought this could maybe work as the universal chain idx Attributes
      		modIds[i].setAttribute(1, value);	// Unknown function
      	}
      }
      depth.setControlCallback(onDepthSlider);
      
      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @Christoph-Hart
      I'm afraid I don't completely understand the matrix API yet.
      In the example below, I'm not getting print messages for the modMatrix.connect. But maybe that's normal for onInit? And there's also no modulation happening.

      The reason I thought it was a closed system, is because I don't understand how to set depth without using the floating tiles. I've looked at the tutorial snippet multiple times, but if the answer is in there, I don't see it. I only see a bunch of setup and then CSS styling.

      const LFO 				= Synth.getModulator("LFO Modulator");
      const modMatrix  		= Engine.createModulationMatrix("Global Modulator Container");
      
      // --- targets ---
      const filter    = Synth.getEffect("Filter");       
      const synth 	= Synth.getChildSynth("Waveform Generator");
      
      // If you want to be notified about connection changes, you can attach a callable object here
      modMatrix.setConnectionCallback(function(source, target, isConnected)
      {
      	Console.print(source);
      	Console.print(target);
      	Console.print(isConnected);
      });
      
      modMatrix.connect(LFO, filter.Frequency, true);
      
      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @Christoph-Hart Alright. I had a feeling I was overlooking something.
      I'll try both Davids and your Method Christoph. Just to get on top of what's actually possible.

      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @David-Healey thanks David! I’ll check it out before the end of the week and get back to you.

      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @David-Healey I thought that's what I did in method 3?
      Can you route global LFOs in Global Mod containers to various targets without global cables?

      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      @griffinboy said in Which modulation routing method would you recommend for my project?:

      But it's definately possible to do a sweep with a good AI agent, or use the REST system to probe all the Hise processing paths and get the exact numbers for all the different scenarios.

      I have no idea what that means, sorry. Could you explain?

      @griffinboy said in Which modulation routing method would you recommend for my project?:

      What I do know is that HISE doesn't seem to go faster than updating DSP every 8 samples.

      I used the fix_block8 node and put my oscillator inside of that container. But at 40Hz the native LFO to Filter Cutoff still sounds better than doing the scriptnode LFO to filter.

      Here's the Scriptnode LFO I built
      TimeVariantLFO.xml

      posted in General Questions
      observantsoundO
      observantsound
    • RE: Which modulation routing method would you recommend for my project?

      Hey guys. I do indeed mean the speed of the LFO modulation.
      I should have been more clear.

      Slow methods like the global LFO to cable will sound mushy and uninteresting at speeds higher than 20Hz. Native LFOs add some nice audio rate modulation distortion at those speeds, which the other methods do not.
      At least the way I've set them up

      posted in General Questions
      observantsoundO
      observantsound
    • Which modulation routing method would you recommend for my project?

      The last few weeks I've been fiddling with the different ways of setting up and routing modulation. They all have their pros and cons and I'd like some feedback before I make a final decision, since I might be missing something.
      Thank you for your ideas and corrections!

      My instrument:
      NoteOn plays 3 samplers at the same time for 3 sections of an instrument (Attack, Body, Tail).
      Additionally User can crossfade each section between different instrument sources for color crossfading, and User can set crossfade order, so I need a dedicated sampler for each section of each instrument source.

      My goal:
      Set up 2 x 3 LFOs with comboBoxes for choosing 1 modulation target out of a list for each LFO
      (3 different instrument section samplers play at the same time and each section gets 2 LFOs).

      Method 1: Everything internal
      Most straightforward method would probably be to assign internal LFOs to all the parameters I want to control (volume, pitch, filter) and then only turn on the ones that have been set by the comboBox.
      Pro: best fidelity. Maybe...?
      Con: Lots of fiddly UI work that scales terribly in my project.

      Method 2: Built in modulation matrix.
      Seemed really promising at first but I wasn't able to set it up with comboboxes. I might (probably) be doing something wrong, but it seems like it expects you to use it with a drag and drop style while relying on the floating matrix tiles.
      Pro: Best all in one system
      Con: Requires me to change my UI layout and how I present what is possible and not possible to modulate. Maybe?

      Method 3: Global LFOs
      LFOs in global modulation container, sending to global cables
      Pro: Most straightforward method that stays in script
      Con: Lacking resolution

      Method 4: ScriptNode LFO
      TimeVariant Scriptnode in Global Modulator Container
      Pro: Bit better resolution. Intentionally low block sizes could sound interesting at high speeds.
      Con: Annoying to set up. Even with fix_block8 not as good resolution as native. Maybe?

      posted in General Questions
      observantsoundO
      observantsound
    • RE: --> Update w/ User Feature Requests! // NEW: Online KNOB BUILDER for HISE!! // Filmstrips, Radial Gradients, Render Bounds

      @Chazrox Amazing! Thank you for your hard work and for sharing it with us!

      posted in Scripting
      observantsoundO
      observantsound
    • CRASH: searching/viewing "analyse" nodes in Script Time Variant Modulator

      I had this happen recently in a project and tested it again on a new empty XML preset.

      • Add "Script Time Variant Modulator" (in Master or Global Modulator Container"
      • Open Scriptnode workspace
      • Click to open node browser
      • Click "analyse" category OR search "analyse".
      • As soon as only analyse nodes are presented in the browser, HISE crashes immediately.

      HISE 4.9.2
      Mac OS 15.7.4
      Late 2020 M1

      posted in Bug Reports
      observantsoundO
      observantsound
    • RE: Roadmap to HISE 5

      @ustk I'm indeed still on the latest stable release...
      I read it as 4.10 instead of 4.1 so I was convinced I was on the latest version.
      I'll compile from the latest develop branch instead and try again.

      So what state is the mod matrix actually in?
      Do some things work but others don't?
      I'd just like to know what to look out for, if the documentation isn't super up to date.

      What are PRs?

      posted in General Questions
      observantsoundO
      observantsound
    • RE: Roadmap to HISE 5

      @David-Healey

      No Matrix entry in docs: Navigating to Audio/Modulators/Envelopes/list of Envelopes
      https://docs.hise.audio

      Matrix entry in docs: Found when googling "Hise Modulation Matrix"
      https://docs.hise.audio/hise-modules/modulators/envelopes/list/matrixmodulator.html

      https://docs.hise.dev/tutorials/scripting/index.html#modulation-matrix-tutorial
      This page says "This is a minimal example of all the new modulation features in HISE 5.0:"
      The snippet provided on that page is the same as the example snippet "Modulation Matrix Tutorial" from hise.exe help/browse example snippets. I think at least.

      I think syntax has changed in multiple places after that snippet was made.
      Like using ("") that's not accepted, or
      matrixHandler.setEditCallback(["my funky item", "another item"], function(index)
      argument mismatch. Expected 1, got 2.
      And .setDragCallback doesn't seem to exist anymore in the API list.

      What is the current state of the modulation matrix?
      I've seen posts from 3 years ago from @Christoph-Hart regarding the mod matrix being new.
      But like I said, I don't see matrixTargetId as a property in the interface property editor.

      HiseSnippet 6384.3oc6b07babjcefjf2kXs8Zu6VoRkJop1vqs.k.gvmTTjki3WhVXEoDEAsz50qW6Fyz.XLGLM7LCHHjJkxaU6dOGxk8xV6gj+.xsja9ZNjpRUI+AnjbJ21+CTdutmO5Yv.RpwzejsBrMLld5W2u2q+89pmd39NbclqK2QKWgCmNhok6Uy2Yps2fsFPMs0ZuM1vdTOGySNj45os4zQTWWlgVtbW98wdjagqnI97Gu8lTKpsNKpIMsGwM0Y6ZNzzKp08W+dlVV6PMXGZNTo2MWusN2dKtEeLvMWNeUsQT8in8Y2mhc6R40tK0cfVtqk+VrtL8FzpMqUsWKilM5wX0atRikaVqUqFcaz5l0a1kVqNUK2qbGCSOtSGOpGyUK2U1jaLsy.9Da4D7HSWytVL7hZZcfYV17NbKCTDwV01Zfokw9ApIWMXP2ORocYoR6mjeOSCyv1iTdug3FjHJTUf4tTb16xwXuZprWUE1KEVJmBKcEIK8l46n6XNxK5NH+7Cx211i4ziBqSprhruZW5mVN+Mt10H6wMFaQAVStzSXmPGNxhQta6N2gzpRUBx3lb6BENbfoKA9WJ4XlyTRWpCaotbaVHIdCndDWPnbIvWDONYrK1JiLTN1CClKW7llHQCY1dvHZL0lNzTOnG374N00iMrBocOxT9XhNe3HXFggCXgvYjKF9QNriM4iciFRwPP38jyd3f5yHkwQ7pVVDWlOWCcqvP5mwcL8lFPlN2fQLsICXvzBS5mM10irUmNjaP1cicHtdSsLs6SVRxRv+BPUZfDC7fIPVuw153DSsfAtLwf5QAdvFf5BA+cK7Asgo.VlnhtQFPwggYKZruC.VLH1.qeLyZJ1FWttPsMH8gFcEpFGF0X5Rd7kvIu6X.wf7UWKt9QtjdbGrSNypZeqBEZamPeJjUoZ1gESy4BiAftVsPgkH6tyCfu23ta24.3++HFLSf3UnvF.aMCgdTm9LOjvZUHOnyV0Hn2jB08uXeSO8AEZ3e0AL.a0EwZftyzAT3dS3oLZBdbFTUYxjAl5CHCYTa2vEVbAsGyQrrzaLrpqLbNLWt0XgR4ceWxHt0zQC31.Pzc7nQbGuJDjS.cjiwrbQHnfRbfUD9P4hine.nj5.dyfkV.g.nHbIPm5iNl.DSGxGa6U..aThq.3BbCJ89C.N0vDfHB6Xp.WKtWYXc1izcJff87vUabT+ToB4PAy013SA6B9HliJh11loiXpOncgir4cQFCugYfmBhoGYB3yF.g.2z2DvINP2AdfZH8CPsRQQHU6ADN.TFV.U.6gCtKnFHRHGNPnoVQ.xZUj.NObqPtO2iIcXDXo0k5ZpSs.HOH4F.SXJshfA2aBZc.8zM.iFfH7EEwjiZj2kPGMhAKBPfp2pv0tQgs3fTZ6UYH8H1NNvEg9GKUqV0pkIKWs5hqUnvM.6al2UcI5.WBrFM.nIkKGBu6mAZQI9RmhbE5ny.8FAZbvpcHPfu.nCD0mgi4mOF8Zlvej+JB7S2JXmD5Bw.CZJWNzCpzF2mWDVq9yevRE0xkSl.dtXmxnKcdf2GXUGziIfbvYzkqXnfVUvc.aIPbz4NN.0VSqT.FH.leL0wWUbWeMw6QticeSaVEI6sW3TKClTp36aw6BHlvfLDbQ.L+YN0J5qq88uOgB9CAVDTl1bOydlHrqKGP4QRgu1zsrTk.pdpmGEPdTBpsoPDz.kCBkJDiYq.B7VgC0VP+6BIcTJvCcIoCtx93ox.Nbq.ykEK7zBK.WA9JXUF4.pR+dChPh1kTOa6pi1ZEdlurukE.PgEPqXKUkl.KHnqfXshh7.pgbM2FLW5hA9PKWif3f5xobwDBtNNKaXYEI8tkJFn9ENYRfhAac.FoD9xMbF.2cfetQ7QiGAtYsGSD9ufnXB2IBjDlhfqqYea+ASMxCLgRMzrqMXdFgqJeTwgSwY+HHpG32nXYRQJ.KfUU40eb4PdqjosA6jTVhjsGormmj5KScYCnXVDNf2LlsP8GZt.DZ3P62G8qnJOxVYNyJMaC23rwXvrX6gIwIX+JFiGN5T5Snn7VhzP19N6z99sOr8CteGx68U5SAoqmIPboqBq584hHJQouYylP5YwoxHMlfUFSllkqum+n.rC4tnE6vgbav6mCC754hHzdf+gwfqEEWIVzdfCj.uxROH6xAC4c47ifTI1gwrJ4u10Ah.nldBjC0TRIKJXT3sn+Jn4SBhoKlTvKgLLAx8..ESfDB3fLcOtkEHsTTMtjfQ8SlS3CdGSagqaJlXkKFjiC2m53A5CYnVS22p.v835baafNVGfbVmALlWoh.+BoUioMfq88cfn7FPx.1LKQtXQoCWg.AkpH+Mt7qK0DqRt5UA2GQDuJ4saznA1D2wf4rjC0vbr6pjFiNAZbDFX1t+pjZUwqelb5a2SQYAAQUcjLgIRRGjO1vQPxACgZFfDRUYmUk24ojBDfTKtCvCKu7xqIuNfMuerwsRkqB2GlePsPcfb5dZBgnUqV.+NDf0l1PgCdvRV.WGIEsDWNfY1e.LE0k28zD7krX87vwo5wCVCUhRt8V25VqovLqtZWFn8YmlddIygfZXUDaVZokLgtsX76GL1qrxJvMlXZ3MHZhkxku..S7aK75llpHw3jPVCFmZpWBI2OZUh5B7gQUU4Ih6M.JB.b8fKhdCfUNUUuGjDjKV8js2ZjmcN.nnaMwBsCXo3Opucz0yrzJwmIfhour0yhcxRFlNRTypDG9jkD485xDBWD2I7sJjs3VuhfLAI.X.o3B4QJhy3GERBjC7Lmpp2oeWZIHiO++sRCbktGLLK0CJC0ZJfM1ERW4pQ.JAE0a0pbv+ATcyEifAzwd7YE4VUeGU8BnVBzM5icbwwExVraW3lnrGvyqNfiQedZfoG3i0igKbgc.qV7XFzCwJKrpAVRtfmSVoasx6r3ZOq.TcfGncOyAZNlEKjlRSR87sXvwbep2.EsR8lwvzA1FdFkIUjw21k1kYImdECW4Zgq4SfAuV.UIoHv.rQfcQEWKSiTPmMa1bdnw.NqtbQwmG51sq5.J8FpxjnuP0NLWuK97HrznWRpkNlZMlsH4Znii2YQE6e75z82byadSDEwcMklLzthhVYonYqL11DphkFxRfhta7VPlD+mabMY0DHugoyvDklQ76MQv4v2vWtbn.NpwwXkTFEVfPDoe.deFPXmfUR3JJK8HHwTWgwWfXOjdRIgnK9pZkVPovpZgP0PYBQLtAehHJlRaIvnqUHQKtVbhlqHgQHD4kDnBCpGVLrDzUDTVgkLB3Bx3ICMsKM2Usxng8hBEtKjIjt2KCjKEf9DeHPWtkAzlG6DuknVPFzqJ384FkGRxbhu+ZvKnAeBTPjC3PUHHRNScUGIAW4vDj.GvJdRcGwzM6go73Cei15.fXoVFy3ZjKarAOH6uvz8EaVheF0ckYWXKUlwsFjrv9P0AX05TxlTW1xMgjqbv7pvfOhIAAVAoZwvTurMnNFxMWAcvfLI3WyyOvTJNj9kEWoYEupVzic27g2b4JdaMYmJUdz1O7me8a0aqI0d7Oaysen8mUQGZeTqObyG139C97slXMs5jJO7I6sktn+FUd3gOpRe32auLzGP3OdqIOxCGS6Ja.iox3u2i9veYQgHNmnMIhczbwP8QGlmbWLCPmXvLeS7vxywh841WExsFpHNrVdDofo3QkJhTcQLm7TVQ.Fcj.OUP0dzijY8KfRDKrGDnZOfIDgSRAbIiyjdnV+nFvfKiIkzTwgYLOKkTrnha7DgtdPudWU5.DJNajEjb4rwADyjR1OfI0MbXCAV+Fhb0HRFT5Bqhe1NKEw09JxaJCfiixA3lnDT4cbyFksUgvAsLVSgb4BqkzzcDT6ByXViDQFzAgu0GvzOBb4lz6RfzK0ExjuTzE1W0OSpX03a5ptU7g4S4WAmba6oX5XBCQFtsJJ67hHP.ROtsy1XpVAk.pTQm+iPHpnt93Vt3OQkJJuMxTxeg0OMSAePcUow03VMzECKEUuo7NyYUD22rILb2wbCJR2M1N1gtLGAtrvtZOEmuvMw.bv4hIUa5NP5QzWILijtUXFwmgLG0wHoOpsSSODMkcDoZbFpX0NgSk50mt59sP4+d2+AaJd3FeU2OgH1FUo6ddqzOhrMNXKfj5U.idEUvgabvgPyKA2cs3c9Sdb6sO7tBRpBgoSzgCua6st28uCD668H0ZVoJLUXyifKe5yViD+C.E12T+Hb2o8STvksZgQUtiswVzQhR8A5JJLFYFEWSRxGUDAd3FU494iAWx3uB5xGCT+y3fW6Ph6BU7XIHVP5PSw9riz.EFbL9qvtfDClB5GYCIZAzFJKfPXJ18gvsBCQ5S1iaHW0K0uLtanhsVxB01.X98.eV9Y6TBtWEL1whUfodLjZWovg9F0IWmTGCQIIzNFgUqHJZB9pl+W3ZmeWgJR.cWxUaLrMrBKuKBD2DUMtkDkXKaDLj2vQujcY4x7RvDzx+2.yDtDecrcYvSydBYHZ63vMcS7DVWrvBfPeJc..3f7AcA61B8k6ML93nEDfawn7xZ3Lsvyf+iY4xRq+UOoYycDeB6ZArG8frguikkIj0PIZnFdIUU7RjZKhD8LYB4wG0adyphOXG5i0qMQnCE5pxDZ4HbfTYH09fnd.tE4ycAHnCIWCBaOwx.n58Ug6YZ+HQ9xWKZwnLpMV.SOLYmomLSmE5GYuSJr0qGoBUD1.lJt7B5s5pxrLK94Ivh6lTZkMltnJt28gRpgLveBDfXVwMn2fa0AUbPFTfZDEfaHEa4PASf3xHqkESSgT3r.fJpjikiWB8QSU8g2fwC6NeKP7tyXAJZ7kVeHJHqZsDpkyhnqKHRxwpBt7+4VQjwXRXOxfBwdT.g381vR7XFNDxqpT3ztgKdsnyE0AE.5XUNbpPtVsRB4RNXdIGkME6YYQYgehDThdJjgtfCdHnAOgACVOzEsHUkvmGYJmLAkbsjapfq34PHerOhzqgYTrcNTYZJhLxR+g8I3NifhCKFk6XwfIVtwPxGiSISacqwFA0aIMmrvcYYw4EfQwc5lgCtZ7FeOuhow2YrDbZ4LSLHwTsAFHBihjXYZmcZJ9HrUjdUOPFUMZPrbJSZHBBMK0aH93eKj6mG0AwwRNDaush28zAJBori3w1fGfI.fWbURQeKAwMk.RKmv3.MAWBKl.e9LeXE9nLwmXRPV3y93lPbkCCDC4t0VDwCEC27V7QBZ6hGHiyd0qepoI.qEomovZmqn7AcJXCAOq9Id3JgWAxkvB2cBdxPBBfGDRWbDJptJ5wQ9LYBxFDZ.nz+RL6kf7.guCcMH5VWfGNZsfwpVrwppx.c1zVe0Su2gbHhsf6JEsnQQD3OPKo3SNPWmLaof1KLCLu9J3+H8kEKyCeJluYgDRq1+HKAElyO1fXuFBAw.BVHhkQIalL4lou3JSYTQkjiBsSH2lfICzS7grJbQsZxKhDsnzf7QScfxnfpjEs2BMjKVDlrzj7vHLfqy8Fa4YNxxjYrg0nAzDgcElDUzsLw5uAtBW+.1oxJKlfQBUPmCd4YpE3r8Aa79eRm1+h6.3iFKuVfkubeKisePni4n3EQUypTg6Y52FpRL7LXf18aS8DhrhUuG2iZ8Xwt99dRoW4Y6Ywr6C23ZjRQ780kocnP20wpqppjJxIy3FQFaShm+nperTOGqwZerumyXs1.5ZzLUNR8gr.NMmTQnacvCWhwigEXSawDJerWxQQZ6.9IKI1.xDBIVN.1DpfwvQtUFM1cPoSpH2dgcb3C2k0yKRCDU3T8EkC8L8sVU4MhEmC4Vbu2XdicDbg.Z3Wnbkfic0NAGZfhxvVfg1TYgcPYhwJzClhSm34EwNZfR81m53lFhBFuzZ9kj+5qJgwaO9dD7As+DbCKvh5+nz2ND4wIDLAKPR8S5TINRhurDgGpwhK9w.Ch3qiP7U.+A.qiRcyW70JKtVncJ2FOAXOvtjvvDfEjj2pWuTuWztIk5swyesyoQXIaHAaF32S9jNB5nVtqD+fKme9GbY0yUs+tQpzQtcaaSuGLhYOuSasluhUC5fOWA+xSbDmec+i3rDvqYZnk6UxKNU5B90+nku9+4S9Ots14f1uWdwZbLhkeNGD+8yKgUIo942V6CZi3c7TZ6KK6K2OXST0kaa1wl5L4Y1dg7aybOxiORKWgPTjVtW0y+PlKm0c7OzMGZBpX4bK2KOsShl2e55SCuX8wqK1l5vFd9e65xGvXTW3q6ybRN4GkO4w1Sqa+fyl+Buhl1eifrnXixV0RzZc0lwRmlsyBcStmk+ofgUwvU91FX1xm1AEDMDK1FOMWPOqJtZGwI34wbmibGQ0YP68nVtLw8jKUhsZCG46xcLeBNXVEK7LbA9bqr+Q4StSspp8ehhZ+K1HtN8ubFcpxXDW6pcwpc+UeMpcA0Wbv0W7qSBtzZutpF90OKq24.iIe55CUeiS9vubHUoq+4vcMLrX66mgjpELVqfz7R2Dh2lPyV62+u7hTzrW8W+2KZNt3o8gyHde35C4Pk8cDEXYdLTjUz8tx5wO+03qfQ34cOFv6MNSGSQB6W1U07NgdYk35kUNE8BD0cTGymvTeMdbG2qGXtmKedHO9DZp+tG9YuHUvVZ5OZis+5P+8p4idEAho.+gmsy4H0BwQQC9ofFTfP9yxGs8T6ybvBwo8YZApjKm+czlmx742dTj4kVtWKuxqtfV3w9GuUg7OFB6iajeBs6u82taZ5wd8VUzbREQ7o3qnV9kwEHngUdBRJJ0m+DEkp1u5kLjxErSue+2dgTD2VJig2N1CgaFml+geSx0qunWr0jWStl7Z9qIhy6jO1V76Zyyq4W7n0QsDhs8E5fSO28fDMc0vyZh7Mr6UxiGuMQCw8ITccQanjf8ZStkQR1e55LHiPpHoubWVcc8d26d+iXWRBGatd7EuW7hW7O4mr04VnqOOrWnP+C8gp9Oa1KHo827shz1XdKwvERo8uVwDiDcv9IaGr6.uqZqJuxYdbt0EDT.xs7aCkSy4ob9TWekyOVU4bQBGtHk3YeONei7g9pTesRwzGhjmXuKmsC1pW0n5WXuqomWV7MkIsjNOdoT3Qn.ouN3Q+2P2WK+c50C.9QL3UxuyO+qmWGW0o+6Km9+h7x.OQJpfvNBd4uJ+oDW5Tdoq+2Nuuz0iN2uz0Iqs+JmuZ6Oi2Y5q7ct2Y5yKN9GOyRi62fVa4trBa9lR1Le9c24ABdS9qyja1Td5cw6ui38fwVO39O++5e842FgEsiUWvioGimgug9aKQ3HsKqO5kTokCYfK5NSs0UIuyPNG2q09wAaZZ6x4itiM5ozPcP1e.0E2DKWlWrgAF1C46Qw8FbK7EWV8ls6aycXxMFSs8sDu1OABf3ua.cfpbj4D9Q4WtYE3SuqieeqsfuZ7fKlqeY7dU6zWyuz4FZBK+jvkbDg9cv.ARtLD38sHW5a+7CxuiE6DwKptfA+d4k+Vko1iaykuz2pXqCXPVCXlTyw5JUQYC7sQ8H0sH5tXNDJC61LcZ.Iew+vy+706.X3H+7q2nw+9sOfYw.ijnc.vY88japQhIRVX4LMuEdBxTqVULoyzp+zLS6WXf6ThMVHever.DKGJW9x3Y6CbYGJSASwGg7DgmTYiaATbkml1WKBXlyO5x+oc9QGvGianfeR34xe+wCkmTBX1gxSrvGoPtKgNykWWEuVDQfYaHt.RX9E92rFdcN+aVK3lZxAWty6px6qG3DnC9JZh+otQHsuhXyT9lMUqGn6AgoNT7d3wciMvcXCMOD+KgfZi.DGcid.BWhExiiuSgobq+3s2ADxTooC9l2JvcaH9SNQLb1k++SA76HUaE6urOKD7W1GI1NjS8+K6Sz1JmwHYoJJx7ov8aDxj5QIetZyISu1qmDCkc+oh4TbhOQOfssGM1SdUtW4zeb.Qd+yc4Y2naMsCEkf6+RCo9zAl+9kq8fwdQye9XyOtAsJyu1YN+f4LfxCllMb+ELGN12+uPDjX3xBmFtL110qtE.WfoXMWL5oUMx2LXz7m9il4zwHX4UwvnPTKHvfmHvvohE+xKFr3k9VNSgzb+85Pja7OLR9O2CjAh+jPT4jC37gJx5e32869et81zgi.zPT10+22N7AxnlfryzYZ6wJa7mXrfXqrmvTRlDZ8e91Wb.quIxT5OUligTcG9m3+J5gfm0Es.5VawV7t.3eBtlTa1S3A3w27Sz0iOTyPX8rRXirRXyrRXqrR3xYkvalUBWIqDdqWVBKD..plYJqkYJqmYJajYJalYJakYJWNyTdyLS4JYlxLigpmYLT8LigpmYLT8LigpmYLT8LigpmYLT8LigpmYLT8LigZjYLTiLigZjYLTiLigZjYLTiLigZjYLTiLigZjYLTiLigZlYLTyLigZlYLTyLigZlYLTyLigZlYLTyLigZlYLTyLigZkYLTqLigZkYLTqLigZkYLTqLigZkYLTqLigZkYLTqLigVNyXnkyLFZ4LigVNyXnkOGXHbuq2XrGenbW4zz1a+6He9y4Be324tr1+KfLtzIu
      
      posted in General Questions
      observantsoundO
      observantsound
    • RE: Roadmap to HISE 5

      I'm a bit confused. Was this a beta branch at some point?
      There's documentation about the modulation matrix on the website and a tutorial snippet, but it doesn't work, and I don't see matrixTargetId in my properties editor.

      I'm using 4.10 built from source.

      posted in General Questions
      observantsoundO
      observantsound
    • Confused about set.Bypassed() and ChildSynth vs Sampler

      In my current project I've saved my sampler modules as Child Synth references

      samplers_Start[i] = Synth.getChildSynth("Names")
      

      For a Round Robin change I wanted to make I realised I needed the samplers as get.Sampler() references so I can do .setActiveGroup()
      But then I realised that my Sampler bypassing function wasn't working anymore:
      It works again if I change it back to Synth.getChildSynth() instead, but I don't understand why this is this way....

      // REFERENCES
      const s_Child = Synth.getChildSynth("Sampler1");
      const s_Synth = Synth.getSampler("Sampler1");
      
      // --- Using setBypassed
      s_Child.setBypassed(1); 	// Works
      //s_Synth.setBypassed(1);  	// Doesnt work
      
      // Set Active Group
      //s_Child.enableRoundRobin(0); 	// Doesnt work
      //s_Child.setActiveGroup(1); 	// Doesnt work
      
      s_Synth.enableRoundRobin(0); 	// Works
      s_Synth.setActiveGroup(1);		// Works
      
      for(i = 0; i < 20; i++)
      {
      	Console.print(s_Child.getAttributeId(i)); 	// Works
      	Console.print(s_Synth.getAttributeId(i)); 	// Works
      }
      

      I think I have some general confusion in this area and I sometimes don't know whether to look for a API method or a documentation Property, or when to do .getAttributes().

      posted in General Questions
      observantsoundO
      observantsound
    • RE: One shared Script Voice Start Modulator for many Samplers?

      @David-Healey Yes the Global Modulator Container worked beautifully for this.
      Thanks to your video I've now also understood the global modulator container better.

      Regarding the body + release in one sampler:
      That's what I've tried first, but it's bugged when using together with loop regions.
      It's what I described in this earlier post you commented on:
      https://forum.hise.audio/topic/14799/loud-click-artifact-when-using-releasestart-with-looping-enabled/14?_=1781354181861

      I haven't gotten around to testing it with 48kHz samples yet.
      But by now I've found enough use cases to split apart the sections into dedicated samplers.

      posted in Scripting
      observantsoundO
      observantsound
    • RE: One shared Script Voice Start Modulator for many Samplers?

      @HISEnberg If there's really no way around to having one ScriptStartVoiceModulator per sampler, then I'll deal with it. It's not that big of an issue.

      My question was more regarding workflow/signal flow.
      I'm still new to HISE so I'm unsure about what's possible and where the limits are.
      Like, would a global modulator (one in my Body and one in my Tail sampler container) work?
      All samplers in my Body container play at the same time (for color crossfading), so they can essentially be handled as one unit.

      But maybe SamplerVoiceStart is just a hardcoded factor and must be a child layer of a sampler?

      posted in Scripting
      observantsoundO
      observantsound
    • One shared Script Voice Start Modulator for many Samplers?

      I'm working with 4 samplers currently, divided in a sustain section and a release section.
      For both I'm offering the option to offset or positively randomize the SampleStartPosition determined by 2 sliders.
      I'm doing this via a Script Voice Start Modulator on every sampler.

      Every one of these voice start scripts looks identical except for one line.

      on Init{
      include("DSP.js");
      
      // This is the only line that differs
      const var type = "body"; // OR const var type = "tail"
      }
      
      function onVoiceStart(voiceIndex)
      {
      	if (type == "body")
      	{
              // Globals set by slider callbacks
      		return DSP.getRandomOffsetAmount(Globals.BodyStartOffset, Globals.BodyStartRandom);	
      	}
      	else
      	{
      		return DSP.getRandomOffsetAmount(Globals.TailStartOffset, Globals.TailStartRandom);	
      	}
      	
      }
      
      inline function getRandomOffsetAmount(offset, randomAmount)
      {
          local r = Math.random() * randomAmount;            // unipolar: forward only
          // local r = (Math.random() - 0.5) * randomAmount; // bipolar option
          return Math.range(offset + r, 0.0, 1.0);
      }
      
      
      Right now it works and it's not a big deal having to copy paste the script 4 times, but I'd like to know how I can do something like this more efficiently in the future.
      I tried using the Builder to build my module tree and to attach external files to the script processors, but I think it's bugged.
      
      Any suggestions?
      posted in Scripting
      observantsoundO
      observantsound
    • RE: How does builder.connectToScript() work?

      @Christoph-Hart I'm also still encountering this issue.
      I've also tried all kinds of formats
      "{PROJECT_FOLDER}/Scripts/test.js"
      "{PROJECT_FOLDER}/Scripts/ScriptProcessors/test.js"
      "{PROJECT_FOLDER}/test.js"

      I also get onControl cannot be parsed.
      My test.js is a file I saved after adding a blank script processor to my container.

      1:
      "Right-click/connect to external script": Works!
      "Rick-click/reload connected script": Works!

      2:
      Adding script via Builder.connecttoScript: On Control cannot be parsed.
      "Rick-click/reload connected script": Does not work "because connected script is not a valid HISE script. OnControl( cannot be parsed"

       function onVoiceStart(voiceIndex)
      {
      	"Hallo";
      }
       function onVoiceStop(voiceIndex)
      {
      	
      }
       function onController()
      {
      	
      }
       function onControl(number, value)
      {
      	
      }
      
      posted in Scripting
      observantsoundO
      observantsound
    • RE: Loud click artifact when using ReleaseStart with looping enabled

      @David-Healey Well that shouldn't really matter...
      But this time I've matched ReleaseStart, LoopStart and LoopEnd between the two sample maps.

      Only when I started changing LowKey and HighKey to be to full range like on Test2.xml (the clicking one), then the first sample map started clicking as well.
      So even though I'm consistently only playing D4 in all my tests, changing the Low and High key on the mapping introduces a clicking artifact??

      test 2.xml Test.xml

      Also wasnt sure if the Release was set to max on the snippet before.

      HiseSnippet 1007.3oc6W0sbiSCEVtoZmVlEF1c1K3JlbMLCSb1zjzqZZRSWJzrMSbovc6nXqjnAaIirbVBOA73vi.uC7hz2.3HY6X4PnaHCrKCfuHSNGoy474y+drT3SSRDRjy6c6pXJx4wXuUb0hAKHLN5pKPNOBqnIJT+UwjjDZ.xwo1Kzm4b7gHyy8m0mDR39zRVHzcBlO8ZVDSUxcbuujEFdIIfdKKx51s5ckufOPDJRAbTC2.ES7+Vxb5KI5qc.F84jjEHmOA2sci1ATR6YMCN0mbxrVMc61YZfaqfoco9S614jNAcaSZCndX.SIjdJBfdjyg8EAq7VHdMOy.2wRXSCoZBWjGX4L1WJBCzuhZtnAKXgAiKbPIHjCdbo6pVl65Y3Qr.1Z9ktsOzbP8RIrcfNG7Pvy0FdM1Y3grP2gYnC.gHHMjnphLc7K+.lfWAYWwUTdBSsxN99NEtOAOlo7Wrc7dvVvKDn96Fu4A+2GOb1LpupDrGhu7ad6Fo+3Ln7TrmRRIQL9bORTbHUZvyw3Bp+Bpei2452wRZnfD3w9Aqq8y85mBtKYUt+TOioNORjxqXqbfOgFSIJH5aIyQ8lL4ERQZ7lRc+YlbkakP+CvSXevMbJ31U1uiCjhjjYvqiQWIUTSpbt1WUd4IzkTYRUduLMBB8bNMDDF63.r9pDpNTy7GQTR12ae6qEudLDBFxWBNmX5Mx.HrXctAEMtkXRGFha08yV+b5.3mk27cwwwmtlog9K9TKZ3mY1zYpzcqprTEYprzD6fJatSpbSTlahsqxmuWpbSTlahLU1JWkv.DC8IaP2dC5NkzYIeiHw5hniLS.q2DpdqVLezebwr8TEPMiIPRh0M6ylu1DYbrq3WmXZ.j0XqulrjNSHirzzVFS8n+eLkAt01M3tEOniEFOt.idLc.qn7Me1zEzYjzP0Zt1fbjfKhWH3L+pMRfFCymaW6e+Ya884bkB5iUx4Y8lPCojjxNg+3uz6ZFmRjU6O9mxU3t6thGJb8Q3L3VWOan9+N1tn1+42t3gbceP9tE0AqKU+CON+XroEec81Kuy6jna4NPvURQXwhZOIqOrE22HHgUMxGXUladEzGRpptkRoNg8UlVsuiWjPnVTccNVu7lZ2QBSoOTl+d2UAMQjpfEzJVRBCHyC1dzmZuO0AZvmQ2PSqgfGkGXH9U3I+P2hkuzG5VbHxuPUfGL++WPTD.STt1uY99gPXstP62wDXGUMjfk.dqfxHhuT7J+rXjFqGY3.nja952iwizz0cQK2LbDAYLux2upp9cB1beE746qfs1WAOYeEr89JXm8UvtuYA0EzmmpDQYyUPnQiGlk.5LbcBXMzuQ3GQ9A
      
      posted in Bug Reports
      observantsoundO
      observantsound