Forum
    • Categories
    • Register
    • Login
    1. Home
    2. HISEnberg
    • Profile
    • Following 0
    • Followers 8
    • Topics 89
    • Posts 1,072
    • Groups 1

    HISEnberg

    @HISEnberg

    526
    Reputation
    288
    Profile views
    1.1k
    Posts
    8
    Followers
    0
    Following
    Joined
    Last Online
    Location Canada

    HISEnberg Unfollow Follow
    Beta Testers

    Best posts made by HISEnberg

    • Oscilloscope Script

      I am trying to optimize my oscilloscope script while still keeping it visually interesting. I recall having a discussion a few months ago about this but I can't find the original post.

      Anyways here is an oscilloscope script for drawing the analyzer to a path in a panel. There are a lot of adjustable variables for optimizing it (buffer size, frame rate, frame count, etc.) There is also optional opacity settings (glow effect) and ghost trails (though these consume a lot more CPU). Hope you guys like it and let me know if you can think of any optimizations or better visual performance for it!

      Here is an A/B comparison of it with the floating tile display

      osc.gif

      HiseSnippet 3084.3oc2as0baabEFTRH0Vw4Vmz59HFMsy.YISSRcupNQzTjRbh3kRRY0LdznYIvJx0BDfE.zxJdzL8WRm9SnO1eF8w9X+Ij+AsmcWbYW.PKZEeIN7AEuWNm8rmy24xtKRaWGCrmmiqRtE6c0XrRt6o18Ja+gUFhH1J02WI2mp53Y7PSb+ICTdxUiQddXSkb4l+.5Dxc2ETX+9wu8IHKjsANtKEkm5PLvGQFQ7i6s8deGwxpFxD2iLRX1quWcCG6JNVNS.gYd0BJiQFWfFfahnSaNUkCQdCUx8.09EMJfWquAB0GsCd6s2n+5au0NHbQyhaswl6rQgc5u4FasogRtOopIw2wsqOxG6ojagm3XdU2gNWZyWfmR7H8svzFEU5BqLu6ZNVlzsHsWkJCIVlsC0RdJ.SaGqylmqy9Z0FDSRT+w5tujMfVLEhJvbyIKdyKIdEEEuBBhWFhTNAQZAtH8UpcMbIi8iGgaKqa6icOGA1IQQgOWk4962WshCLCa+7iPWfq4BMhnPe8BEVUC9yx6tnMXT7.CDVqkmAXOAHhyX7huZQM3GXG870dAxUqrMx5JOraQsGqwfU4Gf8qd94XCe8khFbIfgxz8jiqUqZGQh1m3M1Bc0Sl.D61EvHf7bCb3rVcq.rfyqT7PuPJZFaacFrc.ZBUB.QUbFM1wFZnuTv3YrZ9.T1Enqp8.hMNugKFLoT7saq9OmtYSKeS78crKN00JX7vkRfZ5N6npMOn2g.wqWXmM2US6QORqC1bhA1TqOa2o4Q9Ar14NtZ8w9f8SqR6iiYjKd.iMs6zpc0N8pWsKvpWsDWwbD1df+vk9iBKzpZK0bxH.Vaais7fgJdMWrBzx48v9cH1C3L.fbiwt9Drmt7hrbJhJa3SdAV22cBN8FsW0FsOKBIv4cfpUOV1VdWIh1uS4SlIhRtZ05TtQ0ypz53l8.BWa2HE04t.VmyHOXjmcZ7PFSbcAqUM5LpaaheILdAg8AXVpfLFBVkwH+gZNLrfWD4ifvDsoCDCB3RJsyPHCch9tHh0MNS1enlbcBSNzHZ+IwsEzwJqrLaVb+T17E1c4GOwan9T0YAKy0x3nQnA1D+IlX5ZleCQbdixGzrdui2u5YcazpECuVH+NRyndyyhlEa3BaHq+1GaPFg7IN1hF4pUp2nbupmUqbkdsnF50JsaJTP0mVsy2eVyyXp.JBuXBiZEmIzXaILZAdYkq7cGzATa6CJuiZcLcQJ7xBA+D2CmT9oUq0pSCw4UtPsZkqNk408vx625D171Dl21Sie85Tt9QroslD6BUMG4bIH7u.YMA6I5pCNePqQzjwBr8fiZApDvunBEeS83jLDs5UuUS9R1MiwqzpSypchsiqkWRlaWt2gm06v5U9tlU6RouT9DBaiHXxjwl.vh0Ow1BBWpc9DaCpENXnnopmDrZ4XfrzrwWBSAVDAecZzSA51MhDQ3Y7+9AowlqDx2GnoWLeAsGlZJSgqM.WPHa4K0k.yqFOmz9Mf9fEyPyCR+Ck3.Klis0Ufxb7UZlbDOMngCwNHbQRMEkPbEgvOozUICDD6HSauxiS5DsbDkICK7rTg4N8YjSk0+PGwZmn+QVwG0S24JZEWV6OHEpJCM19tnKgbLQ5fL0KlvjDqHQevpPrWHqEydjTGMH+4vLKaYomxce4L1Nb32kDSVfXFao3tSncHh43yaHlLXnu3DOj0S5YNhX98v7BH3QZkl5Z6A+AadXHmCn3AAXPhME4x2oIWCphgtHr05gRL5QkRN49PfQSVxNfaLJWkusWUhvrL4AFJdJKNLxSibtF1FA0xZFMOnKcofNw3uWIiDo3XFepaxyupE0JQ5sv9CyxkMCCW8Xd93z.0kSQRPvNehcXjQweo5fqHo91YB4eX7lXEwMQl9Ao4qCT5Mw+JVFys.loSWnGIynG.is4LHoQEWj2vBibEgmI.enQisjh38PFbSF7IE4HbSd5yJb5xYv3301yG452DeY2I8Y0zPgwAPU1xt7LrShB4kHz1sI.X13lXkAKTFAz4BEHApblWxtYR2OI0GIS0mrJjFIrmi9KuYM20uInBWZvfJNt1fDoKUGvrXSFPKymepdc9+wK+kD+gksFODoKWqypQ3ZJ1cir1wCxSCGwPHQR3pAwqVENBSugDiKrgC7BGRIQQILddcBdFqItd5wxn0oypfWH+Oux8ztLbzgnCOXwugroSOb+LAYDYXB+rH4bFbuV7ssajr6yapaysXum1IIZ+ey9FYX+indlbADgMGX4boF+dNjx3ITD9zzSynCC+PDqlQl+j5.AWlvMzL6w.kwe8qWGIJtINIj.g2ZY3QktNc4yA2CCckaCbyuiyDHsLVOrJP8AKq8pXQLqZB8GR7jJQmO8qWV9TKrqvQqVX0kAmMlUmNTJ5xYVBpiMipJHKq9HiKRUXd30ePYRGLxL35nDtsir.U+zJmWtRcfKBqV1ktm5nXwyIiydjsWP2KHiCKAz2QiLZrqyKvoNeZz4MBNO9Jqr6hoJTK7r5eyiy5v8SyYJDo3hGSAJIqsI6aAHFscs.ZfcEeTHmr0Mg0VD+jFXDbodzqvw0wR2H759VkeJ9jHE5lmM.sD0hu1Bjuwa7Y50zvn+4b5edBj0ymo5jRcfQxoO64mxuNmoktMUwBA5WZdJlFUesBYF4Aa4gyjPmwb5BiWHXIBz67PULcuf8S1n.TesfEqoiOtkM3C+pEu6hfPjbnyOOywBXlEUbxX3.Ac5DpaOYTeraDtHXhJ4VP9ICTm9SFH9hFF76LTXhN10AG6Viw1S6cNTBtnQ5yKDHUvT8YOtvmG73BbUmBwTI2cUCziJLQV7ggTNt99HeTHi.dFeCwPe6ieAw.ye0h6ptO16BvTBKUzkgqj6S3K6mE9lFzCTyV0EUCuSdkWJ9vSWI1fUbQbGWsG+Xyw8P1SQXwtmeva5vWrZVNHH6xfdDPuRWyuPUrqouvj8lgENPgv28egZ4IlDmvW0Po+fvmC6dpqWZ6har9FaTZMEhOdjz.aUbss1oz1BCTJXjRat45EJrthO9k9hOsFydj6HUZzfkhr50Mg7uBOpxpzQYknRuxeVqZ.n14xSbbuf85OP+minNjWqHpB+Uy.LYVsW+s+bJ012rmI9bzDK+mxgZL.b5m.6KUa3XNwB4K+hbz2sLX.vmS5YvnO0ksGb.DQ36asmoaVEwuRsMw2XX1x3bYHifm06BYL3wM+LUdgrwB3Bp09KuidIy4DV+6D8fzDZs5GDt72SsAxCxXy5X5uHshx9XKjjZ5DYGxueuLdy551u.BM01wB4lTIO+LuKK952kKLyHA5VR6mBZcgYyT75ey6YE49qUYp7OlDXFj3iGA9KUgje+LPb4G4Z.b5SWBDIWs4jQ7GkO7Qhg9xMGsJBd6Bz1TApK11j03+A+BFrHsctfAKFNnnJQkqRVTMJ2H+qYHJWkjdH3iDf7CBN1+y8Z6BEZfuLnPiftuydu07peeqS9b9N4Sgvi1X12IASo7aYs0NAAmz5.rM1kBfJNs3j68u9r+yr9k6Ldl+xcZY3CKeOWjs2XGOIF2EOhzCJSvSryi8v0bw+0NTHsX+UbPtYNzO9s0fMYlzzE4Owk4aTdD8jcutH3KLa15a3CBZg2UePPumir7AqvHoueo6FJi7r9UgzwVvoEhxuvJ7KrWYbcCGamwCcrIFhF8NXvebv.rqnrm4FpruObjvnd9ww60AagQB.3l+i8NB.dHWPOguk5hhuweKWYZu9cpbwkcGUe7j.60Vb67yTwsu0k2O.E599NYw8CSVPyKDmr32vZSuMtojqXN4Zp+2uyyUTLyjER8lfhRYRQI4CB3OwVl07tjlEUUTCTEEEKOHryRhcB0fIwLnsDmZPDNc6+8aqxd66tXXmaxuHZpdVzkr8D3PzrRQKJRXb2kD69PjqIXCMdKjZSNluv7+n3Ce8Wz41J8tL2lxWmJ2lxu+Wf419vdYMy+K5KqY189f3g+71JdeUHtbIMloT6Cis78QAAuOViQHCWmyL3uX.0o+Nrdf8sM6+QNtqZCZasTOTfhxHHkwYFFxrJEgktsDt1skv0usDtwskvMusDt0skvsuYBoYzKOw2g+4XSKyocU9CIjiWgCyMQ4+iYkPuv
      
      Content.makeFrontInterface(400, 400);
      namespace Oscilloscope
      {
          const var Analyser1 = Synth.getEffect("Analyser1");
          const var BUFFER = Synth.getDisplayBufferSource("Analyser1");
          const var BUF_OSC = BUFFER.getDisplayBuffer(0);
          const var pnl_Osc = Content.getComponent("pnl_Osc1");
          const var timer = Engine.createTimerObject();
          const var Button1 = Content.getComponent("Button1");
          
          const BUF_LENGTH = 4096;  // Reduced buffer size for better CPU
          
          reg BUF_PROPERTIES = {"BufferLength": BUF_LENGTH, "NumChannels": 1};
          BUF_OSC.setRingBufferProperties(BUF_PROPERTIES);
          BUF_OSC.setActive(true);
          
          const TEMP_BUFFER = Buffer.create(BUF_LENGTH);  
          const DRAW_BUFFER = Buffer.create(BUF_LENGTH); 
          
          const FRAME_COUNT = 3;
          reg frameBuffers = [];
          reg currentFrameIndex = 0;
          
          // Cached path objects
          reg mainPath = Content.createPath();
          reg trailPath = Content.createPath();
          
          for (i = 0; i < FRAME_COUNT; i++)
          {
              frameBuffers.push(Buffer.create(BUF_LENGTH));
          }
          
          reg magnitude = 0.5;
          const MAGNITUDE_SMOOTH = 0.9;
          const MIN_MAGNITUDE = 0.05;
          
          // Decimation
          const DECIMATE_FACTOR = 32; 
          const DRAW_EVERY_N_FRAMES = 1;
          reg frameCounter = 0;
          
          const BACKGROUND_COLOUR = 0x00000000;
          const WAVEFORM_COLOUR = 0xA0FFAE00;
          const WAVEFORM_SHADOW = 0x60FF8000;
          const WAVEFORM_TRAIL = 0x30FFAE00;
          
          // Lower values for better performance
          const GLOW_EFFECT = true;
          const MOTION_TRAILS = true;
          const CORNER_SMOOTH = 3.0;
          const PATH_THICKNESS = 2.0;
          
          // Magnitude update
          inline function updateMagnitude()
          {
              local newMag = DRAW_BUFFER.getMagnitude();
              magnitude = magnitude * MAGNITUDE_SMOOTH + newMag * (1.0 - MAGNITUDE_SMOOTH);
              magnitude = Math.max(MIN_MAGNITUDE, magnitude);
          }
          
          // Frame storage - only copy decimated points
          inline function storeCurrentFrame()
          {
              for (i = 0; i < BUF_LENGTH; i += DECIMATE_FACTOR)
                  frameBuffers[currentFrameIndex][i] = DRAW_BUFFER[i];
              
              currentFrameIndex = (currentFrameIndex + 1) % FRAME_COUNT;
          }
          
          // Drawing function
          inline function drawOscilloscope(g, panel, mag)
          {
              g.fillAll(BACKGROUND_COLOUR);
              
              local width = panel.getWidth();
              local height = panel.getHeight();
              local midY = height / 2;
              
              local scaledHeight = height * Math.min(1.0, mag);
              local drawY = midY - scaledHeight/2;
              local bounds = [0, drawY, width, scaledHeight];
              
              // Draw trail frames if enabled
              if (MOTION_TRAILS)
              {
                  for (frameIdx = 0; frameIdx < FRAME_COUNT; frameIdx++)
                  {
                      if (frameIdx == currentFrameIndex)
                          continue;
                      
                      local age = (currentFrameIndex - frameIdx + FRAME_COUNT) % FRAME_COUNT;
                      local opacity = 0.7 - (age / FRAME_COUNT) * 0.6;
                      
                      trailPath.clear();
                      local sample = Math.max(-1.0, Math.min(1.0, frameBuffers[frameIdx][0]));
                      trailPath.startNewSubPath(0, midY - sample);
                      
                      for (i = DECIMATE_FACTOR; i < BUF_LENGTH; i += DECIMATE_FACTOR)
                      {
                          local x = (i / BUF_LENGTH) * width;
                          sample = Math.max(-1.0, Math.min(1.0, frameBuffers[frameIdx][i]));
                          trailPath.lineTo(x, midY - sample);
                      }
                      
                      trailPath.roundCorners(CORNER_SMOOTH);
                      
                      g.setColour(Colours.withAlpha(WAVEFORM_TRAIL, opacity * 0.5));
                      g.drawPath(trailPath, bounds, {"Thickness": PATH_THICKNESS * 0.5});
                  }
              }
              
              // Draw main path
              mainPath.clear();
              local currentFrame = frameBuffers[currentFrameIndex];
              
              local sample = Math.max(-1.0, Math.min(1.0, currentFrame[0]));
              mainPath.startNewSubPath(0, midY - sample);
      
              for (i = DECIMATE_FACTOR; i < BUF_LENGTH; i += DECIMATE_FACTOR)
              {
                  local x = (i / BUF_LENGTH) * width;
                  sample = Math.max(-1.0, Math.min(1.0, currentFrame[i]));
                  mainPath.lineTo(x, midY - sample);
              }
              
              mainPath.roundCorners(CORNER_SMOOTH);
              
              // Glow Effect
              if (GLOW_EFFECT)
              {
                  g.setColour(Colours.withAlpha(WAVEFORM_SHADOW, Math.min(1.0, mag)));
                  g.drawPath(mainPath, bounds, {"Thickness": PATH_THICKNESS * 2.0});
              }
              
              g.setColour(WAVEFORM_COLOUR);
              g.drawPath(mainPath, bounds, {"Thickness": PATH_THICKNESS/2});
          }
          
          pnl_Osc.setPaintRoutine(function(g) { 
              drawOscilloscope(g, this, magnitude); 
          });
          
          // Timer Function (Buffer copying)
          inline function onTimerCallback()
          {
              BUF_OSC.copyReadBuffer(TEMP_BUFFER);
              
              for (i = 0; i < BUF_LENGTH; i += DECIMATE_FACTOR)
                  DRAW_BUFFER[i] = TEMP_BUFFER[i];
              
              updateMagnitude();
              storeCurrentFrame();
              
              // Skip frames to improve performance
              frameCounter++;
              if (frameCounter >= DRAW_EVERY_N_FRAMES)
              {
                  pnl_Osc.repaint();
                  frameCounter = 0;
              }
          };
          
          timer.setTimerCallback(onTimerCallback);
          
          inline function onButton1Control(component, value)
          {
              if (value == 1)
              {
                  for (i = 0; i < FRAME_COUNT; i++)
                  {
                      for (j = 0; j < BUF_LENGTH; j += DECIMATE_FACTOR)
                          frameBuffers[i][j] = 0.0;
                  }
                  
                  timer.startTimer(30);
              }
              else
                  timer.stopTimer();
          };
          
          Button1.setControlCallback(onButton1Control);
      }
      
      posted in Scripting
      HISEnbergH
      HISEnberg
    • Free Reverse Delay built in RNBO

      I know some users were asking about a reverse delay so I wanted to share one I implemented in RNBO quite a while back.

      Link:
      RNBO Reverse Delay

      Unfortunatley I am away from my Mac at the moment, but I will update this link when I can. If you can't wait there is also build instructions for Mac.

      This project contains three folders:

      1. RnboExport: This is the .cpp .h files created by RNBO when exporting the patch. You will want to drag these into: YourProject/DspNetworks/ThirdPart/src
      2. ReverseDelay: This is a HISE project. If you are on Windows, after downloading you can go straight ahead and open this project. You will see the reverse delay embedded in a scriptnode network.
      3. RevDel3.maxpat: This is the Rnbo project itself which you can open inside of MSP/RNBO.

      Once you open the project and the Scriptnode there is a little write up about the reverse delay (just make sure to click on the comment box next to the xfader to see it).
      dc1d3ea7-7801-4355-8210-3761829f2582-image.png

      Most of the guts of the patch was taken from this generous homie, so shout out to Taylor Brooks for sharing this on Youtube:
      https://www.youtube.com/watch?v=hOX5eg7QCqM

      I recommend watching it and following along if you want to know how the patch works. My patch essentially operates the same but I added processing to make the left and right channels function independently, added a feedback path, and I also tweaked it to create different windowing functions (triangle, Blackmann, Hann, I can't remember the others). You can also tempo sync it in HISE using the tempo sync node, it's easier then trying to do it in RNBO and communicating that to HISE, then to the DAW.

      If you are on Mac, you can build it your own. I am not sure if you need a Max MSP license, but I know you DONT need a RNBO license. You will have to install Max MSP though. A RNBO license will allow you to make changes and save the patch, but I am pretty confident you can open and export patches without a license.

      All you will need to do is open the RevDel3.maxpat, then follow the steps to export it to a HISE project (I recommend this video):

      https://www.youtube.com/watch?v=64dTcwnP40o&t=1s

      Hopefully everything is in working order, its been quite some time that I have looked at this project. Let me know if anyone has questions or recommendations, and happy holidays!

      Hisenberg

      @DabDab @udalilprofile @treynterrio

      posted in Blog Entries
      HISEnbergH
      HISEnberg
    • Preset Browser in CSS

      Full code and snippet are at the bottom.

      I've been abusing CSS lately and wanted to share some findings/bugs. I am really loving CSS for the transformation and blur effects so I hope we can get this more standardized.

      I think the preset browser I am working on best captures some of the issues I am finding.

      Screenshot 2025-08-22 at 8.37.37 AM.png

      1. HISE LAF combined with CSS?

      Is this possible yet? Whenever I have tried to do this in the past something will be overwritten (either the LAF portion of the script or the CSS).

      2. CSS Scripting

      I've noticed a few bugs here (on MacOS). Autofill doesn't work correctly (selecting from the dropdown doesn't fill in the text). The compiler also doesn't function when working on a CSS script (I have to go back to the onInit script to compile, the same is true with F5).

      3. Passing variables to CSS

      I can't seem to pass colour (hex) variables to the CSS renderer. I am not sure if I am doing something wrong here but I assume we would use the setStyleSheetProperty to be able to pass a variable along:

      // Convert to CSS hex variable
      inline function toHex(colorValue)
      {
         local hexString = Engine.intToHexString(colorValue);
         local rgbOnly = hexString.substring(2, hexString.length); // remove the opacity
         return "#" + rgbOnly;
      }
      
      // Colour Variables
      const var c3 = toHex(ft_PresetBrowser.get("itemColour3"));
      Console.print(c3); // This will print something like #ff0000
      css_Laf.setStyleSheetProperty("c3", c3, ""); 
      
      // Then in my CSS style sheet
      .preset-browser
      {    
      background-color: var(--c3); // doesn't work
      

      4. Double Repainting of preset items & buttons

      The gif best captures this, there is a "white flash" that happens on mouse interactions. It might be I am scripting something in the wrong order but I can't account for why this happens

      vid.gif

      5. Preset Tags

      The Preset tags don't display the full text (no matter the length of the text). For some reason flipping the ButtonsInsideBorder boolean will temporarily fix it, but when you recompile the issue reappears.
      tag.gif

      6. Scrollbar

      I am pretty sure this is me but I can't get the scrollbar in bounds (the right side is always cutoff).

      I'll post more of the bugs I come across here then unify them as I come across them. If someone can confirm if any are just my lack of understanding or true HISE bugs it would be appreciated!

      SNIPPET

      HiseSnippet 11017.3oc6bu7bbbbe.GeAIWEI3WxN1woruLl1VdAM.ztKdPPRISPPPPhHRQFBJIqvvhd1cGfcLmclMyLKHfk4gjpxYWUt4SIUk+Dx0TUTkqIGR4a4lujK4jOkqI+5ddr8ryrK.n0Km5KbjD14QOc+qeN89Aw4nXG+dN8dZju6vgNw0pM24ePXPWmnnfvZyM+iNdnSs49x026X+392rusqesc2t1bes5CCchbh2JL34QNg0153g1QQN8pM2bm+1pKZtW6B0z+76t9V1d19ccFenZ0d+.2tN20cfa73i9fMeGWOucr647H2AFW8pata2.+aF3ELRxPmudyZCs69L6CbdWa0kct50ticT+Zyco5Wwo2ZqtQyKeEmlctRy1qXek1qrZm1sZsey8W0dsK2c8qb402nics4dka0yMNHbuX6XmnZycgsB5c7d8CdtexC38cib634n9PqZ6IO4jCuSfWOUQTczZ2ruqWu7HUjD2paD2NeRb6aV+dt8byO9332qqOg036vL.N24Jl8NegrWKyrWSirWEYoyYjktPRV5qWeutgtCiGeFU94KUeW+Xmv8sk5IyrRx0V6b+cmq9MCjqvOd4A1OyYmP4C42Qi0Ws4hVqtZyEt17yK0UQwVGZGZse7SefYiDq21JKMNvI9lACFF3KenwEkKrPqoKJoy3joaTzSuq89F2c2PGIvb2ft1d2MH3Y2vu2NNNdMT2Ux0trjV6Eermyd8cbjGf5vExJKKGQ8TlLKptwRoaZhpJb2x+.WeG0U8dxUmbqOx9f65FE23wW7l8CkeIXX+eTj0MGMniq8EWz5h2ww1y4Xq63NrevP8Abib763DdfkbpCO15dNw1dW7IKbs8G42M1Mv2Jv+cChctueiEl+il+0TAAe4yuqjj5n38j5Mo8uJJ9t4GWU7eMI67NNGq5qD1X7srnUb3HGU9+EyaM4CY+8+D6orusWTEOFU0VXfmm5tUOoINsp2d0mI8Fa3ml9GZ6IEirKTZQWraR8o2MwrWb2jVQFWXf+t9tw2eni+z5aWKsomzk5Bo4J4Ri0cn9pocn1yysmLRnqzu4Os9y76j1xRm6xtGcIvbfvZSK01ZTbbfuN0d85ch8SSs643OZxT42c8yZpH+6C+8Ou7tNGEWQp7d6tscrsDolKMnIAxgNgwtp5n4114PYn+jghds5a6D8LoCi7DyGNPNbxS+qjMPksuim9gOe8t9wO8dpwPOx7Qdr4Gdtau394GXye0l8cbOn+34Y17ucS2XmAlymL9ysSNPvP6+pQNYMFFmyleZ4rulNmkNThcnQ16e33MMxdOZyhYuZ9Sl8p8SN4rWrD3ytf4q2Z8Ke4K2t0Z0NzbZg4pWNhdVZoNtD7wcLKA+fONR537HIGrUvQIOpIJRaWpHs8lExZCsCkbkQ1axnmYH+UmVH+Ot9PeuzaZa2ngd1Ga1p3c2rPqBUHSRr5pXo0J0JGzmnYyOayyTt70N8cdMBrGTLOtuq2fnX492cfLtas49N0+nG7v6+mcqa9nmty8u6125guXfj.KOz+fIC46VJj+VaFIyh4ric2X0b+YG92d8OEJV5QSldGxStXIS9eXUEqq74ZwRO71QlsQNiEKeIA9rrX8JSuqhwMktf8iLWf8wlenXt8i+aJkaOdS0P64O1uZb5RcSdr63EXG65evibk96pm92n9jquy7g+CLe3WbhGtUoG9G+7MSmUIYJjuV8hEqNGjMv3Wt9psVckqb41qrV6ZlCoJmn8k2n8ZqsVqMJN1p5LWY0qzr0kWuYM8jXm6e5b0+n4srtnZ0B6YenSRakKdU8JpVL6L25ng19QxhVhtQjjZiFntB8pgxuD86NDV8sqVdUTozTVaSxkW3TiOrrxMofKmqUy7a5F85U8i3gN9xaKU8411wyIdJmaOG6vt8kVZlmXG6CCBkHm58xxyEiyDlmtPbXmQddOvNte1EDU3roE1ck.YOmsBBkvUgyKqxLI1pts15Ck74OP0l4gRit.4DOVNtkUykWYkUVrxeU9smnuY0h1ug7lD4kfjaMIZZYU7+rzpMyuwjm5CCd9Cr60SZoO9oV0cN99xikaELxumpT73jSbufvzv+jmYbStIOSVLrzYm+EkmfspA.LWDQRWhVWoYyMLWtwJYm4xazr0pqKuh9o7sIe05204.63fpdUxyeI+Wq9a9lV2n2gpcEnmUxkZca0hRrRtHqkrt+vX2At+B476GDZsm8fgx6ODMubiaYKIn71AVw8cr5JExPm9NRilCcRSJcJs7OOxZ+vfAVCCC94Ncisdlevy8b5cfiJMtiseOOmHqPGYD7CNvIbo3fk5630aI06yj+NH1dtwGqRAY8qdGO+7Yu.pDFuidboFqoemWIEu2HuX2k5IuKidf.aOK6vP6iizYeUtzy4H86WIcir69LoYS5q3pdp5A.jW45wO4ZV4+HI5iMe6ptA1gQNa6DOx2QdWK48Py98Cc7B5J4zmjljp0B4TUhpRRoUi7Nr1dpSunkygR4Y2dRpOJT0nI4nSlfgxHDRTeqQ6uu9UCySRU0QxAUEyzKy5.cUoJno5T5GULUzUO5W5KK2Ioh9yVAcTUUQkSrnjX7tauqkpaaxUn58kTKMYLM8deTRc6sRJipmV56umrABpcfQ+l64a2Pw668ShBtNy7NUYL8JmUaVgqsrJ2n4CcNvxyNRGMk6coVWSenzfswQTWjpnKGpYxQjV8IaLl5PK2r8ZWSGkeTeoyaeYNjj1S8kgGs5IiZqalVHojgyRRs4mHrZoy6p2rthvqqumT7F+x29NxTFSTccecxneScUcumZeRR92IOlIBREtmqM9VzGW0ER+K2z1yqiT40nTqiryjduRW0Qg9VejNBEdUizZQqN51fpQ+rdw0l+E5hd1sWQKScJTtLO0bvDE4jgWkh6AxZe0+d4LezhxvStQo4c8isQx8sbRl8wMexhVEORqRGo8SRS.UZsrZqkR2rjrB4seucsReisrdYwIMmxFpR5j7N9AcZbQ0cdwEkYkrTCYotJUcvCs8Ovogbv1MapN0xMaMdS7J1cnXhlLuSiKV7ZjGPq0jzok5YT7TpmViKFISnsqexLQWzXGiTiI63MTMPRV0gLmfDfsrOz10S0sJoZqTslbM63FFEuSniSolr40bpFAMNxxshZ4nEzWQx0o9wceqFeuiVV+3V1MReQObjuuL9RiEVXdKieRaTdTRsjTmjbvIeBKObTT+FypOUwF4kSgGWQh543ePbeYtxVOIq8PEwPYhhdIgtrFtICGTUfLs0rdlKisaKO.J2oJDpO+BEhWxYRBXVu8amciUDnjK6ZIAIooTTfmyxCCcUaA7MCFIisIS2YIkO+X28ONMOmjYuXZ7QmxU0Q3gNCBjE.jL6sZZe0zp5OFkjcqn2t5N1Qt16jMCrwlYVrGu60FGCb0itZ4Z8Vim5NspPN5O9GWUqo7K7wtOQ53qhQlOprK8iJDxFm5IY0a44LPU63lFKx9oiLZ6yFenWj1TLItri6QVxRCcTKWnW5BCRhR5PY4AA228nGju7gFRaGmixhE59EtQamjXMLVkwi0W2STiWY8K+kVUdFcgVdAfphO5Kx5mX0z5MdCqu2LeH5l6S8Akc17GVwVgSIiM8zYbX0QFn5TkVMuVgJ.0tUlNsSVLtbOO8zC5DQl1vNT+sinVr2izKuK4H6H2h5y4cHqnhJsuURi1t4IgjqLBoS9.zQxIOXV.z55RkxUKcZioy0qDcZOk7L83mwN4WdEOgrSlVPzeoipYadfab29puZvpZ0ol2TOelj.uupUciEVrPUkwOFAkkppJTMqbVAJevkcTCgpu.mjUdlsNdYo9IKvsbuH+d6lbCScPEYNP4cFRVBr4pKBcNzMXTj9aWS5jJWPqlpeLuH2zSdshCRU4nTFkxYNN03mWg3htY8RFiWk9XF22M89jtuSanL00cOaUUYmn7aXA4NxO3jk5I539QkpOShdISr5p5tNwnhULx33QGM6TqybkC5ucd.4y1bREgIIu74Xb5ESTcqxNkaRoS4oT6WHKbRSdk+qUzOnXq97UaktjI0CY18XSWC0r5sde+zkncV619R06KKnVtC2TVgPUgyoGEtsr74jwUSWIjJyo1I1nYN30ApuS6vzu1WIhnVsdjLjdZ77DBGlYuGOkuC4EM+xkuow9ZLwo1IeSNZrvSlbIxlkza1OHHJa4eFuuW996TpP1UeGIeM6YU4UV.8S2FkwKGqqWfJCYV6GmGuTQhlIulk7ZPsu7SRqfTUy9lcXxGtbbmkwED0VaMHP+JXck074c730yle0Edl5j9w9Szi7IU0SY78oidUiNHKKOw7pUkqSWsQx9GktYFoaDfbiumZe7xiVFQL4na6p2qByaco78wvXZFcbwQdUdIGodSXK4+yNcSPRBpYqr8Pmvisj5GUHLPd58M67LQOsr3jzUqod4IY4n2Z7lvLsgzjbz6577j1a46GyRI6vhi7BGxKv310UJl5s7ovslNbQOCgEJQM2H+dZrfQQehUZdRcqb6sn0ooOW5VacbR2pIKZ6EDFa043jhWB9hzswTFyHRsC.Vcb5aKCOGV3VyzwH29G3F2emzVVlA8Ey6A1vdQqNmzrWppLa0aL8VVcj+yBYsgU6e1Tu1eRwqchK8ESVfU22DaUw3F7KT5wjEEcOvOHzQu2hMR40TdxyBu0PolPo6783whklPo6PUfZG3J1e2b0eISr81EVm4Tp2mXB2IGuJJYerl4.9UkBtSDEmQXov0M47ioOipmar5FEFutjd9xEMKNoug8Odxi0p7kku6Zy705zWa561U54L4hlJ7Qysx0rA6KJLx1M50SUcareEISfkNw03s1t79B7ROG6zd6noL06LF5HuQw3MxdZi8mzqHegtmPWtByJlNAsUVLYPPuw8KNEcHm195q1Sxjm5YaPyELdG+o3o6LLAZU6D0I2Y9zzgybhSaOu78CKeov8JtomIuus5YNZP5f.uiywQR19MdiR61kdhyYLA4MxefAxjpxjixSz2ZzvW1Aeqd1gBe0TkVa0j+TZaf2Jay3e7JOYgo0sHceH7Spd21QODwVGm98J0H4rpANzaEyQxXEKZcjJAmZGsY9y3NPIesmQ6DDdOWOO28bjYf6E0nUylKTwPWk1hpxkZiQ29C4Ra42c9DZobFh.EJ8iK1GIyfrvLGt2bYZp15gMl35K+U6Me4Gbg81t3q8Y1PuzC3ztliGlOwRj7lE1gtAoatS9PBVcFEaEnV5bjUTrTSn64eZWFx32lZ5CgUZDfhKBnb22xUnUuHjWpEXT8CX7CIabO0apLiWZrhrRwY3ydmzNi+By0eEGK0QG00qpoxjnXMexj9lq9IKClrtm7O05Im1Nj42hpqbwlwAYu58zJb6IqIJN86pQUjhFDHscJ9EtV48ZLgyr+N1ppOh7LS5jrRSq2Tu+nyHK9dC6odqLyu7iz0WmrdtJuuYtNPiH90NS28JEt6Up3teQ4hgtW6Rp2pxrLDM+TFI8k90uldGgyxqgcFdUrrWGaZa73mBqZzpuR9i4xoS2kmY8G7P0KiLiUx3EQ5un0DyNJGYpq8LOu6uf47ayd12ojELRqSWm9yxrtYeUVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVH1BwVeFH1xXYtE+l0k.8CBC5p1TwJFgKc3fDkIVZOFEdYm4mwpxp76k+zLhQ5lJOewWX7H8WtyQ52D7nwu7Wwuz9pldshIlKFPREX3ULpjXLSsoIomzZPRCrHUIw2womr76JSnF9ojuJ7MvWJIkoiT5MJlb0l6B2pmabPn1jTTs4puUPui2qevy8qM24q2p166F41wyI4C6E3En9sl05lP6v3BC7202M99CcR+bsa120qWZccPXTM4HI2TsZyMWZVWtz3iGJo9WsdBku8Tw9vZt8pM2qTWE+poKT0l60tPsreduc21N1NKUjD7AZwcpdIxw114P2tNORmpuV8schdlTSTatycyfACkomjG+b0Oom4QlOuiM+v.6wmay+9MqM8TMQ7hNUe85E6GZj9ebmMMR+evllfWRhz0xCgRcURw50qeufdi7rkpsa1210u1taqN3skeM8DR6iZac7Pa0qjIwjyq9VQTaZjwy52c84NWwp9yO8p9lFU8UTwdJyhe855uX1pyimqh7nTG+oQd77I4wuR8aI8d6FONCdg567SKD29D6wO2bFO+WM44+kqumqZvzam83eEcUXgLf9.FwC8H7lG3Cb6E2e7A9vM2x1SAk07Z10+Po6wCB7j0uOQ387m5xWqYW9tvotMfpHY8E51oei55v7Wzyj5p9uXmIe85Ov9yqJ6GFLJVls+d1xB5jAbqKKPaufQgccjrmuurDQ4XycN0zRIeto5ypLwdN98ze3+U9I8jsTedtzS1J6jlggucRX3KU+Cjgv0qAPGA9V5OKKYYf0sc7UDmCBaMit3+GWuhNvuefLkldu.Fezga9NxBvTHWzSYke7U2b2tpkF3Ik0jXy86FKYgGo9ZCFJuOZKyTdOmAtORl.KpvQm3NZW4czt33Rp89sU4CU3pTgBYkiCZYVimcPyqbSoYiwE8ger741lixcO2r4Ps9K+U+lqeKeE4yjEid+ntRfQEmMeJOXj7NA5dLFo6u03vsMO7crC6I0gcm0XkW3zMV4NAd8TUzUuln4dkxyK8Mqq.imebydSpSXM9N9TYpp+.XAGElM80y53simyQ23Nau2C0Yu+H8mK1U6dA9AC6G36VnhMeOtLyqUV.tQbr7JIoGYyuy+7+x0uiT6VrQe274msd5+ye9l6MJJdbG7O9W+q+Oud5KZlcn+8+5auoDEcJ+ftqygNdYI1ktz+c5gu4nvCytZqu025+555Gp4Q+s+ley+Z1iw73+ru628e6rTKz5S+k8c9+e8x9N88kjAz9h8T4e65x.qsszUkVe9TW9YwL5eV7LFX2ML3oouVtZ3rWUeDob6aqmJu98Te1pU4W9cfLAvS61sXRU5Fa+xdiq7xdiq9xdiq8xdiq+xdiW9k8F23juQ07y2XTbvfj9F0pcuGbK8lUL2bIKQQ2MolyfNN8jUEjrSA5Iz12U0E3bp+SxS8aWuaTzSS1IfsBCddjZelhhx14kZm6e7Oo9adoDv3piI+WmPqm6JuRfyQwg1VCU+Au4efd6xTeiwp+Z.rtzaN+xC0o4RcRRzzsKRsWaGDFLxu2UsTz2rCW5fP6dtpum3VqrVOmCVz562xV8+rZ9Ckeuss5+o1L8eX5Fe8lWZbhrTWoib3UU+Qt0Xok5txBWSdzxU7HkGqdANQ9+nXqmGD9LICoe7Ag8T+IY0d3QVQAdt8r99qrxJWy3bKoxMihtp0FCS+6mIs.dUqVsyNTmfiVJpucufmeUKWeoTZ0TRvVx+rh7OgGzwtQ60Vawr+o4xsRUaeIqsr8e1aJKadz.ecTpq9WOCQGcp2pcyEs1nY5eWSMWdkEzQK84TGV+W6Ta8oZufYvKMd886p+oxBdqlkJ4qJkp0yN5.6vCb8upt3tzURK2sFGZRhvsxivUlgWMOfjzzypadH46mzv4TDRZ29yuPRKcMdyYFT13kNnraryfHqFOu+wJUgZcgptq8rhCu9BpfTb3YtIi5ujt0UOrUxBB4wG0gWU+GHm9TsNqwmUJEdVopVLpdcqkF1jm2IEclHCuxBY+8N4GuTj6uvQti7lcwxfQKY64df7X7b1ON8n4F1tpVZhjHQVpUqZbZ06Le0jeUVpgyOsgj0WX7m+vFMK74+B8m00SwgWsuLfW3uucdWc5sTWoPMQZTOsBIIsxq1ZcY8cr1D0Z6u+9oGXTXj5HCCzf0mUDX8SHBrzk0gfIGITUqpphWMaLvIKnsyia1cicOz4LG3lrvttQjSeb0g0WkJPTUi37vQ0k7Uqnjmkm6pLK4z6Lmo0UmsT+qqnyXaXloyiPqqO2kmclt7zWIoxky5kztkNYthYWkmq++m.bU4l85YzYIqVqU4QvKVk1LYjroTZFOl0dQRPPVzdG6P0HTt9CGcZFDu0FMGGrVMcfnUSKFiiTpRW1+nOyoZDpS0PtULf15kFPa8BC2aNFT9pBJOZSayQal9hFZmEcatn9+kOTm4.mqpdLRjVGWu59AcGEkEcqXXg0yFCocyzFcW6rUSrd5fuqWplXszgnVqhZhpZ6r9zFNX0pZlmtJI82pUjpcTG8u966XrqM8wXW8Sp1RqWcaoUqb4TaTUSoVENXVG20x9qr6DZfUnacywcqK11ZsEJuhk1ypu+TGNekjt9IUPujSENdD8MxF.rhQzyhumzjgSqU+oZz+OrwRsl57ZEGDrTE+hm7jeEiVujS.Vt.9ROWR0gflyLBL0txajOKvirOP2sc4X6CV5T228JFi7rQVYLsbrxDKTMo4xpyXk7c1n2p62bl8cm7gLk4A1nxE1VYe2RuJvJSedgUVyre6.W+kdt56F3pFKJdf8QYGTxmoi8aDTO082LCsiCcoc2lbXwhgDyXqQyknt1dNMZsby0VX1KKIOwRas9Y+xRLCXm5tbEhXSVFJM.kY3b8Wtku84ebR53l7mcipmaBApy3J2Js9r7nTxvUI+S40Kbld0uSbl070skE6s0+LidqpB0R8SiwsVdkOIVqV9Jh6pHVktd3nrObVirEWIl4q7Tb0xUN8XVnJeF9rwTNkKZ8jFCM6epdMqqkFvZWphJaDs7nxoe8Cazb5KyqTuSiFQEmOLKNrZwcg3z8x0lkwULKiEJQm943KTjlbNdy9RkVuzUNw0DsQ1XTsamFFxZdpPkI4QKO6NNd5t95eKMCW0BgqrGzYaYmls2zOB09MkOcnjwz4gBsFlwR7jIgTEmZi2paemi1w0yQ8837+A+SIZOB
      

      CODE

      Content.makeFrontInterface(640, 440);
      
      const var ft_PresetBrowser = Content.getComponent("ft_presetBrowser");
      const var css_Laf = Content.createLocalLookAndFeel();
      css_Laf.setStyleSheet("css_PresetBrowser.css");
      ft_PresetBrowser.setLocalLookAndFeel(css_Laf);
      
      Engine.setUserPresetTagList(["Christoph's Cumbia", "Healey Hiphop", "Hisenberg Heavy Metal"]);
      
      // Colour Variables
      const var c3 = toHex(ft_PresetBrowser.get("itemColour3"));
      Console.print(c3);
      css_Laf.setStyleSheetProperty("c3", c3, "");
      
      // Convert to CSS hex variable
      inline function toHex(colorValue)
      {
         local hexString = Engine.intToHexString(colorValue);
         local rgbOnly = hexString.substring(2, hexString.length);
         return "#" + rgbOnly;
      }
      

      css_PresetBrowser.css

      /* Main container */
      .preset-browser
      {
          background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
          /*background-color: var(--c3); */ /*This doesn't work*/
          border: 2px solid #333;
          border-radius: 8px;
          padding: 12px;
          box-shadow: inset 0px 1px 3px rgba(255,255,255,0.1);
      }
      
      /* Bank/Column */
      .column
      {
          background: linear-gradient(135deg, rgba(120, 80, 150, 0.3) 0%, rgba(80, 50, 120, 0.2) 100%);
          color: #cccccc;
          border-radius: 10px;
          padding: 4px 6px;
          margin: 1px -9px 1px 1px;
          border: 1px solid rgba(120, 80, 150, 0.4);
      }
      
      /* Preset column */
      #preset
      {
          background: linear-gradient(225deg, rgba(120, 80, 150, 0.3) 0%, rgba(80, 50, 120, 0.2) 100%);
          color: #cccccc;
          border-radius: 10px;
          padding: 10px 10px;
          margin: 1px -9px 1px 8px;
          border: 1px solid rgba(120, 80, 150, 0.4);
      }
      
      /* Items (why is this named tr?) */
      tr
      {
          background: linear-gradient(135deg, rgba(100, 60, 130, 0.2) 0%, rgba(60, 40, 100, 0.1) 100%);
          color: #cccccc;
          border-radius: 3px;
          padding: 3px 6px;
          margin: 2px 5px 10px 40px;
          border: 1px solid rgba(100, 60, 130, 0.3);
          font-size: 11px;
          text-align: left;
          transition: all 0.3s ease;
          transform: translateX(3px) translateY(0px) translateZ(0px);
      }
      
      tr:hover
      {
          background: linear-gradient(135deg, rgba(120, 80, 150, 0.4) 0%, rgba(80, 50, 120, 0.3) 100%);
          border-color: rgba(140, 100, 170, 0.5);
          color: #fff;
          cursor: pointer;
          transform: translateX(6px) translateY(0px) translateZ(-7px);
          box-shadow: 0px 2px 4px rgba(120, 80, 150, 0.2);
      }
      
      tr:active
      {
          background: linear-gradient(135deg, rgba(140, 100, 170, 0.6) 0%, rgba(100, 70, 140, 0.5) 100%);
          color: #fff;
          transform: translateX(4px) translateY(0px);
      }
      
      tr:checked
      {
          background: linear-gradient(135deg, rgba(150, 110, 190, 0.8) 0%, rgba(120, 80, 160, 0.7) 100%);
          color: #fff;
          border: 2px solid rgba(170, 130, 210, 0.9);
          font-weight: bold;
          text-shadow: 1px 1px 1px;
          box-shadow: 0px 0px 8px rgba(150, 110, 190, 0.4);
      }
      
      /* Ssearch bar */
      input
      {
          background: linear-gradient(180deg, rgba(40, 40, 40, 0.9) 0%, rgba(30, 30, 30, 0.9) 100%);
          color: #cccccc;
          border: 1px solid rgba(120, 80, 150, 0.4);
          border-radius: 6px;
          padding: 6px 10px;
          font-size: 12px;
          transition: all 0.2s ease;
          box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3);
          margin: 2px 4px;
      }
      
      input:focus
      {
          border-color: rgba(160, 120, 200, 0.8);
          background: linear-gradient(180deg, rgba(60, 60, 60, 0.9) 0%, rgba(50, 50, 50, 0.9) 100%);
          box-shadow: 0px 0px 6px rgba(120, 80, 150, 0.4);
          color: #fff;
      }
      
      /* Buttons */
      button
      {
          background: linear-gradient(135deg, rgba(120, 80, 150, 0.5) 0%, rgba(80, 50, 120, 0.4) 100%);
          color: #cccccc;
          border: 1px solid rgba(120, 80, 150, 0.6);
          border-radius: 4px;
          padding: 4px 8px;
          font-size: 11px;
          font-weight: 500;
          transition: all 0.2s ease;
          text-shadow: 0px 1px 1px rgba(0,0,0,0.5);
          margin: 1px 2px;
          box-shadow: 0px 0px 4px rgba(120, 80, 150, 0.3);
      }
      
      button:hover
      {
          background: linear-gradient(135deg, rgba(140, 100, 180, 0.7) 0%, rgba(100, 70, 150, 0.6) 100%);
          border-color: rgba(160, 120, 200, 0.8);
          color: #fff;
          transform: translateY(-1px);
          box-shadow: 0px 0px 8px rgba(120, 80, 150, 0.6), 0px 2px 4px rgba(120, 80, 150, 0.3);
      }
      
      button:active
      {
          background: linear-gradient(135deg, rgba(160, 120, 200, 0.8) 0%, rgba(120, 80, 160, 0.7) 100%);
          color: #fff;
          transform: translateY(0px);
          box-shadow: 0px 0px 6px rgba(120, 80, 150, 0.8);
      }
      
      /* Tags */
      .tag-button
      {
          background: linear-gradient(90deg, rgba(80, 120, 160, 0.3) 0%, rgba(60, 100, 140, 0.2) 100%);
          color: #b8d4f0;
          border: 1px solid rgba(80, 120, 160, 0.4);
          border-radius: 8px;
          padding: 3px 8px;
          font-size: 10px;
          margin: 3px;
          transition: all 0.35s ease;
          min-width: 40px;
          max-width: 120px;
      }
      
      .tag-button:hover
      {
          background: linear-gradient(90deg, rgba(100, 140, 180, 0.5) 0%, rgba(80, 120, 160, 0.4) 100%);
          transform: scale(1.05);
          border: 2px solid rgba(120, 160, 200, 0.9);
          font-weight: bold;
          text-shadow: 1px 1px 1px;
          box-shadow: 0px 0px 8px rgba(150, 110, 190, 0.4);
      }
      
      .tag-button:active
      {
          background: linear-gradient(90deg, rgba(120, 160, 200, 0.7) 0%, rgba(100, 140, 180, 0.6) 100%);
          color: #fff;
          border: 2px solid rgba(120, 160, 200, 0.9);
          font-weight: bold;
          text-shadow: 1px 1px 1px;
          box-shadow: 0px 0px 8px rgba(150, 110, 190, 0.4);
      }
      
      /* Notes */
      .notes
      {
          background: linear-gradient(180deg, rgba(30, 30, 30, 0.9) 0%, rgba(20, 20, 20, 0.9) 100%);
          border: 1px solid rgba(100, 60, 130, 0.3);
          border-radius: 4px;
          padding: 6px;
          color: #aaaaaa;
          font-size: 10px;
          line-height: 1.3;
          box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3);
          margin: 2px;
      }
      
      /* Scrollbar */
      scrollbar
      {
          background: linear-gradient(180deg, rgba(60, 60, 60, 0.6) 0%, rgba(40, 40, 40, 0.6) 100%);
          border-radius: 2px;
          width: 1px;
          transition: all 0.2s ease;
          
          border: 1px solid rgba(80, 80, 80, 0.3);
          margin: 2px 5px 2px 2px;
          padding: 0px;
      }
      
      scrollbar:hover
      {
          background: linear-gradient(180deg, rgba(120, 80, 150, 0.7) 0%, rgba(100, 60, 130, 0.7) 100%);
          width: 14px;
          border-color: rgba(140, 100, 170, 0.5);
          margin: 2px 3px 2px 2px;
      }
      
      scrollbar:active
      {
          background: linear-gradient(180deg, rgba(160, 120, 200, 0.9) 0%, rgba(140, 100, 180, 0.9) 100%);
          border-color: rgba(180, 140, 220, 0.7);
      }
      
      /* Compact labels */
      label
      {
          color: #cccccc;
          font-size: 10px;
          text-shadow: 0px 1px 1px rgba(0,0,0,0.5);
          transition: color 0.15s ease;
      }
      
      label:hover
      {
          color: rgba(160, 120, 200, 1.0);
      }
      
      posted in Scripting css preset browser bugzzz
      HISEnbergH
      HISEnberg
    • Preset Display Bar - Display your preset, Previous & Next Buttons, etc.

      Dug up this old script which I am going to modify for my own uses but I thought it might be helpful for some beginners or at the very least a time saver for others.

      It's a very simple preset display bar (a lot of this looks like it was taken from David's videos, which is a good place to start). The script includes:

      • Preset Name Display: Display the preset name in a panel
      • Open/Close Preset Browser
      • Previous and Next Buttons
      • A few LAFs and Paint Routines some may find valuable.

      It's not much to look at but hopefully useful for someone!

      ScreenRecording2025-11-15at8.45.48AM-ezgif.com-video-to-gif-converter.gif

      Snippet
      HiseSnippet 3016.3ocyZrsaabbcorW2R0jlDz7PebCQPAUBixRRQa4ZXTck1BURlUT1wAFBFC2cH4TsbGhcWJa0DCz+fluf9Ozel9bepO225iomyL6kYuPxkLN.cW.ItyYNWmybNm4ROOtE02m6oUYyKucJUqxGn2+V2fwGNlvb0N4HsJ+J8ddTeZvADOsCtcJw2mZqUoxcdB1gJUuql34+7GNf3PbsnIMoo8BNyhdJaBKHo0d68GYNNcI1zKYST58N6chE28PtCeFHL2Q2TaJw5ZxH54Draanq8Th+XsJeg982cf4Cd3vcG1hRGLv5gDayNTp08ICF7.SRyV1Co6Z2ocasJ26XaV.2qe.If5CD8.t8s8GyeiqjAuf4yF3PwOZp0G3rrYsCGybr6EYY70zpb2dI1o6HsSep9YLaVb6I1qOV.vHACUiVkMVjH0bEDoJJhzckhzmn22xiMMHAhb76D2.p2PBL1nJJx9pswe+yzOjC8vMX6Ijqoc8fOhwn9NllMLZaZt0i1bSX7wOv3Fhmgkavqi8JLdrQDAFQCNjOYJ2E9ndsT8pFPgBIfG+M9zRQDYOqkVTFD3FB+b5aClKYR2szBSBL3u2TBRfcKMIl55DB6Hl+TGxsykJ45YZBcs6fPvBWDjFdbm4Rsh6dFSzojggc50GLKH.ZWgdVdT.wS4VDmS47q220tKk5TGofKLyyGlERMhGE2761r5W+0FOt3GEXFce94Gd4IO679F4fU.dLWGlK0X3LWq.F20HfOZjCUxVTRgIWTu5L+mMk5t0lUAov.dX9wvP.fVI6wijfy45r8PHrSh0S14FFCCCFsUHd4Fh11iNE3R.ZUp9tMEpRzHygDGmAPjJ+MERTF8f6l1wKDq5VQBQCXDxYFcKA1em3uB5LrtR63S0icGAjdaGNwFozyA8QR25CIN9nvicCjtkIGn266G4.oDiOye9xR07BRwtrEHIQixNnuog0LOO.pDSXjNTLvoCRHIBAlwndzfIanQ8L39XiZ01RBMjEEOpi5Ss.LbQizrOh1uS9OJnxuGIWob+NwkEvHNr+BUwCrZZmssCm7.l2n9TeNNjHkS6grLjU7hPjKdTsXhTbewHNnls+zoN2Zb59cKRcxEmJershUkxgnP.B+byp46BLRLh4C4F6F5OWulsG4MWJhVI6CL3F4rWeTCC9f+bhmrHyG2CBWcAwlMCCCuCxTDFv39ybuFhhgVoQd7Yt1Idv.Y11FpRHua6HT6dhGPOvepKTZU8WY91tca0AeE7eaBDh+UlWo7QyqZjPgBdPJz1DemOEL9xjuZeEFEElFbUASMhU.9MTuRq.M2Ee+on.sZiuuGTfxJxlCw2eJhbSB99STjGs8PPjt.cfn1WPsBHtf2Y8HDajxEbKE+uSbwvi9iIfmVDoF.N7tmRtEx9F3MKNEYgVf6aJeVGKf4aMWJ1f1uaVcdNJ6qTnAfVyrzQsgVWY7UFsZnZYwFtJsgBZpYBSGQl46yHtG3Lyqdqj1ot1Rikpc8INPQ2FzgCAwaI1ULBwHr6OkxFMFyyoJUegg416rnQfVc5JdVyQfkhMX4Tjt0arnUVJ1J6XwNMT4R9wgVyYbn4RFG12CJCzvO3VnjjQoishglL99u2XIwYkKOsNNU8nCw2RGsPAy86dXqCeXBlwx2QPpDCBJj9J4Kn3ZwdopmfYp3.fI6qMZ8nrX7spXjMxQFLD7rOVKgRBoHSCyVTwT1U+TfZhoBOEJJqdjL+kITtQrh7U4a7aKrwFFM2tSjYZNb3qJhCeYgDKhUofpvgEODt9bds0sRa8Jkt8tnxad7BdTW.Wu8O47KMt3YO+xSN+3xrJNYGD83EDOFYfCE7iSVF527zSt7XvCSjpT77HUvO6h8O+IQvO7A3K.GJ3Jd8Y.rVBjvFY9OEmzRAuSYXn31ytlvPnBAqGVGsADhJ.5fuwuy3LX4KoJgN0lVfybEnDhQ8jR6RWU2.LnGVOWvXlOtnDQ8lGHZstoZz8L0+sqR7oChK7yXTXf8EDqGpPqC91Hj4hX0g+bww4SpynHLAmnvemuBi4DgW1+4WXw4bFXjwk9LyitzJKH11BDpqLArFwY5XRseOj.zrihtUaB2kaM1iOgDvr.3HoTg6CCCztDq.tm.6G1IbFwRxUTTsPELHzItnkUcPvbgXhknb+xleMl.xjopDo0hq4LrqQYciG2wOKNuarA5R9TiwP9YGLG8BrPsMiJpX0sPKBSP4VKCTyLV4xaf.S6NEWTXxLXNrDvIkxtrTsScvX2EYmZ1orT58f8RUpZuR1tVK014YS87ULYJ0L0wDeSjaLYYoBC0PspcUZ1Nb92Rn46OeGUKWQ1hPIUlmtvcOpTYhHqQRncTAs56yVY1.iLokW48wPtTDwJXRs6DIsiE+ThMhHttgUdmHxJBQ6uvpHBq5VIjkmQItKKOmyL7B1D.kLeP6f2JNarnIN6VxINIK8NYM2IK1lrrIBueV87ptr4z1ayBZe8VBbxZeSVz6Oyq1UZ2hSEYf6CeQim6DlHpjpP6XUncrJ.IhalWvaWbf2l432B8e5jxMGHamX11zrP9l0A5R7bAs.16M2vQ3R+WVfgetW6OeJtwCxEvkYo4uT3IaJMBRUuS1ku+sh9jXnV3J7qlYImgbI0hKks0Hh5xYsxeKbeUVdYNJEgc5EjphsJUkTJ1TDl5AWtPhBfesuGEyt8J0IoQQT5HCobkpKWWNdDoCg+VCJ+vbkOQHoZsOL8wkZidQ0qcDcHYlCRuHApgQMb02feSsxuSBpzLknrL5tfpCDqjM9TVhKOfdCPEkiLETdQSaa4vrttHu8hO60OKaFbkMuPTug5gToXERX33h2+e0ExiAyKIcKz5VzlBrLhglz2soxATdNOf9L25agm0M.wHKngCKDV3wX4fggK.LtAFdKBw5tylLf5Ee7mgcTqxcSekQtW4txHVxy2WoibW7PCwwN42c4N13UAA+c9KXhV3ED.upIgRHz0.wEM4WGdQS56vfhDzX.Q9s5EepdZBsQ8RAo87SNhDPhnqv0mOk5EvPsqxQzaXVT4EZop9QT+qC3SANGer8fEPJEeXz0cg3RcDBwGomZ2azdqJeuU8i2vrCFqUQuxOTQSarHyK9UW.TJVsYZEVdDeBd8w5oOcREl8ulsmBy978hYVKMUlge4StgdhqjJ3kxYJAiEnH.YUIl+Y7I.DhGvhJaLQLoelm3Z.8o583fyMyczSIt1gspsxZCt+tpltO++S0lpyyM32nmK.op9b9bzmZUxpOPvT9ah2aPzJcHFzD22PQbFskpfXzbXFrduVoD8ew7E8bWZk44E+W+S6MGu3+M.8lnnBUtCNOKlyePP3sWSx4tNbBZhujA8UNERsol4XtdkEL8AYbNSRQpT3De4r7OROMvAihtEfUuGPv+KxPV.cRRq+ie7G9wzs1JryhGQ3kM9mani2ikZXDv9fiY3wyGsEggPN9sSIt9PfX+8g7aNylf8Pj5HtKh3jdEiNlPvOGMg30gWX.UPIMCoP.8EfAUvFgz911EyhKn38vpXXGQcnAyAVeJwyZLdy6T.zkbC2CLa3csLVJRDBUvoPaliSORv3H39oLRg55IfczlJ2FmTvOe1DooEQqsnI42eC5FcA3swA.uRbmgL2tclmFqX6PyWI3woLeQkTw5YHGZTz+hwRJYWveSOhsMLMnr3Eatk62BhlDvYbuvQnrPR7JyBIxNmC5luKUbj6s54imWNwK2aBIA1d+s8Thfnk+tl9w5mwsm4PBRe0WwKEbH.XNUp6aJdmRAOjfaUuzvqv8g0bg2G1xJhehdOVf03hkwMJPFgBB94PFCuEwen9whM1HQ.uqd2WttWY3kvd4VGN5LRfGCFp0g4k8gXmVTf6tPFHeLF9FXoexuMiB22m5ZK93GgmPfMwuqDBrYDPsIDKO9qsjNa38T9WJZAjIWw83tp9Y32FMyWX3DlM60VVoIUNDastH1dcQbm0EwNqKh2ecQ7AqKh6tbDwa099yBDmzFLsQS6rdGKxzVoxwt3g8J7V09ecu4xY.
      
      Code
      Content.makeFrontInterface(400, 300);
      
      const var cnt_PresetBar = Content.getComponent("cnt_PresetBar");
      const var cnt_PresetBrowser = Content.getComponent("cnt_PresetBrowser");
      
      const var btn_PresetNext = Content.getComponent("btn_PresetNext");
      const var btn_PresetPrev = Content.getComponent("btn_PresetPrev");
      const var pnl_PresetDisplay = Content.getComponent("pnl_PresetDisplay");
      const var knb_PresetStateControl = Content.getComponent("knb_PresetStateControl");
      
      const var Laf_Preset_Buttons = Content.createLocalLookAndFeel();
      
      namespace PresetBar
      {
      	// =======================
      	// ====== FUNCTIONS ======
      	// =======================
      	inline function togglePresetContainer(isOpen)
      	{
      	    isContainerOpen = isOpen;
      	    cnt_PresetBrowser.fadeComponent(isOpen, fadeTime);
      	    pnl_PresetDisplay.repaint();
      	}
      
      	// Control Callbacks
          inline function onbtn_PresetNextControl(component, value)
          {
              if(value)
              	Engine.loadNextUserPreset(false);
          }
      
          inline function onbtn_PresetPrevControl(component, value)
          {
              if(value)
              	Engine.loadPreviousUserPreset(false);
          }
      
      	inline function onknb_PresetStateControl(component, value)
      	{
      	    local currentPreset = Engine.getCurrentUserPresetName();
      	    if (currentPreset == "")
      	    {
      	        pnl_PresetDisplay.set("text", currentPreset);
      	    }
      	    else
      	    {
      	        pnl_PresetDisplay.set("text", currentPreset);
      	    }
      	    pnl_PresetDisplay.repaint();
      	}
      
      	// Initialize Callbacks
      	btn_PresetNext.setControlCallback(onbtn_PresetNextControl);
      	btn_PresetPrev.setControlCallback(onbtn_PresetPrevControl);
      	knb_PresetStateControl.setControlCallback(onknb_PresetStateControl);
      
      	// Apply LAF
      	btn_PresetNext.setLocalLookAndFeel(Laf_Preset_Buttons);
      	btn_PresetPrev.setLocalLookAndFeel(Laf_Preset_Buttons);
      
      	// Buttons
      	Laf_Preset_Buttons.registerFunction("drawToggleButton", function(g, obj)
      	{
      	    var cornerRadius = 4;
      
      	    // Sunken background
      	    if (obj.down)
      	    {
      	        g.setGradientFill([0xFF252525, obj.area[0], obj.area[1],
      	                           0xFF303030, obj.area[0], obj.area[1] + obj.area[3], false]);
      	    }
      	    else if (obj.over)
      	    {
      	        g.setGradientFill([0xFF181818, obj.area[0], obj.area[1],
      	                           0xFF232323, obj.area[0], obj.area[1] + obj.area[3], false]);
      	    }
      	    else
      	    {
      	        g.setGradientFill([0xFF0f0f0f, obj.area[0], obj.area[1],
      	                           0xFF1a1a1a, obj.area[0], obj.area[1] + obj.area[3], false]);
      	    }
      	    g.fillRoundedRectangle(obj.area, cornerRadius);
      
      	    // Inset shadow
      	    g.beginLayer(true);
      	    g.setGradientFill([0x60000000, obj.area[0], obj.area[1],
      	                       0x00000000, obj.area[0], obj.area[1] + 8, false]);
      	    g.fillRoundedRectangle([obj.area[0] + 1, obj.area[1] + 1, obj.area[2] - 2, obj.area[3] - 2], cornerRadius - 1);
      	    g.gaussianBlur(2);
      	    g.endLayer();
      
      	    // Glass effect
      	    g.beginLayer(true);
      	    var glassHeight = obj.area[3] * 0.4;
      	    g.setGradientFill([0x25FFFFFF, obj.area[0], obj.area[1],
      	                       0x05FFFFFF, obj.area[0], obj.area[1] + glassHeight, false]);
      	    g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 2, obj.area[2] - 4, glassHeight], cornerRadius - 2);
      	    g.gaussianBlur(1);
      	    g.endLayer();
      
      	    // Arrow styling
      	    if (obj.over || obj.down)
      	    {
      	        g.setColour(0xFFDCDCDC);
      	    }
      	    else
      	    {
      	        g.setColour(0xFFAFC2C9);
      	    }
      
      	    // Draw arrows
      	    var centerX = obj.area[0] + obj.area[2] / 2;
      	    var centerY = obj.area[1] + obj.area[3] / 2;
      	    var arrowSize = 4;
      
      	    if (obj.id == "btn_PresetPrev")
      	    {
      	        g.drawLine(centerX + arrowSize, centerX - arrowSize, centerY - arrowSize, centerY, 1.5);
      	        g.drawLine(centerX - arrowSize, centerX + arrowSize, centerY, centerY + arrowSize, 1.5);
      	    }
      	    else
      	    {
      	        g.drawLine(centerX - arrowSize, centerX + arrowSize, centerY - arrowSize, centerY, 1.5);
      	        g.drawLine(centerX + arrowSize, centerX - arrowSize, centerY, centerY + arrowSize, 1.5);
      	    }
      	});
      
      	// ============================
      	// ====== PAINT ROUTINES ======
      	// ============================
      
      	// Variables
      	const var WHITE = 0xFF000000;
      	const var ORANGE = 0xFFC7C7C7;
      	reg fadeTime = 200;
      	reg isHovered = false;
      	reg isContainerOpen = false;
      
      	// Paint Routines & Mouse Callbacks
      	cnt_PresetBar.setPaintRoutine(function(g)
      	{
      	    var bounds = this.getLocalBounds(0);
      	    var cornerRadius = 8;
      
      	    // Background gradient
      	    g.setGradientFill([0xFF353535, bounds[0], bounds[1],
      	                       0xFF1a1a1a, bounds[0], bounds[1] + bounds[3], false]);
      	    g.fillRoundedRectangle(bounds, cornerRadius);
      
      	    // Noise texture
      	    g.beginLayer(true);
      	    g.addNoise({
      	        "alpha": 0.05,
      	        "monochromatic": true,
      	        "scaleFactor": 0.95
      	    });
      	    g.endLayer();
      
      	    // Inset shadow
      	    g.setGradientFill([0x50000000, bounds[0], bounds[1],
      	                       0x00000000, bounds[0], bounds[1] + 16, false]);
      	    g.fillRoundedRectangle([bounds[0] + 2, bounds[1] + 2,
      	                           bounds[2] - 4, bounds[3] - 4], cornerRadius - 2);
      
      	    // Top highlight
      	    g.setGradientFill([0x30FFFFFF, bounds[0], bounds[1],
      	                       0x00FFFFFF, bounds[0], bounds[1] + 6, false]);
      	    g.fillRoundedRectangle([bounds[0] + 1, bounds[1] + 1,
      	                           bounds[2] - 2, 4], cornerRadius - 1);
      
      	    // Bottom highlight
      	    g.setGradientFill([0x00FFFFFF, bounds[0], bounds[1] + bounds[3] - 8,
      	                       0x15FFFFFF, bounds[0], bounds[1] + bounds[3], false]);
      	    g.fillRoundedRectangle([bounds[0] + 1, bounds[1] + bounds[3] - 3,
      	                           bounds[2] - 2, 2], cornerRadius - 1);
      
      	    // Borders
      	    g.setColour(0xFF505050);
      	    g.drawRoundedRectangle(bounds, cornerRadius, 1);
      	    g.setColour(0x30000000);
      	    g.drawRoundedRectangle([bounds[0] + 1, bounds[1] + 1,
      	                           bounds[2] - 2, bounds[3] - 2], cornerRadius - 1, 1);
      	});
      
      	pnl_PresetDisplay.setPaintRoutine(function(g)
      	{
      	    var a = this.getLocalBounds(0);
      	    var cornerRadius = 4;
      	    var currentPreset = Engine.getCurrentUserPresetName();
      
      	    // Sunken background
      	    if (isContainerOpen)
      	    {
      	        g.setGradientFill([0xFF252525, a[0], a[1], 0xFF303030, a[0], a[1] + a[3], false]);
      	    }
      	    else if (isHovered)
      	    {
      	        g.setGradientFill([0xFF181818, a[0], a[1], 0xFF232323, a[0], a[1] + a[3], false]);
      	    }
      	    else
      	    {
      	        g.setGradientFill([0xFF0f0f0f, a[0], a[1], 0xFF1a1a1a, a[0], a[1] + a[3], false]);
      	    }
      	    g.fillRoundedRectangle(a, cornerRadius);
      
      
      	    // Inner border
      	    g.setColour(0x80000000);
      	    g.drawRoundedRectangle([a[0] + 1, a[1] + 1, a[2] - 2, a[3] - 2], cornerRadius - 1, 1);
      
      	    // Glass effect
      	    g.beginLayer(true);
      	    var glassHeight = a[3] * 0.4;
      	    g.setGradientFill([0x25FFFFFF, a[0], a[1], 0x05FFFFFF, a[0], a[1] + glassHeight, false]);
      	    g.fillRoundedRectangle([a[0] + 2, a[1] + 2, a[2] - 4, glassHeight], cornerRadius - 2);
      	    g.gaussianBlur(1);
      	    g.endLayer();
      
      	    // Glass highlight line
      	    g.setColour(0x40FFFFFF);
      	    g.fillRoundedRectangle([a[0] + 3, a[1] + 3, a[2] - 6, 1], cornerRadius - 3);
      	    g.setColour(0x10FFFFFF);
      	    g.drawRoundedRectangle([a[0] + 5, a[1] + a[3] - 5, a[2] - 10, 1], cornerRadius - 1, 1);
      
      	    // Text color
      	    if (isContainerOpen || isHovered)
      	    {
      	        g.setColour(0xFFDCDCDC);
      	    }
      	    else
      	    {
      	        g.setColour(0xFFAFC2C9);
      	    }
      
      	    // Dropdown arrow
      	    var arrowX = a[0] + a[2] - 15;
      	    var arrowY = a[1] + a[3] / 2;
      	    var arrowSize = 4;
      	    g.drawLine(arrowX - arrowSize, arrowX, arrowY - 2, arrowY + 2, 1.5);
      	    g.drawLine(arrowX, arrowX + arrowSize, arrowY + 2, arrowY - 2, 1.5);
      
      	    // Preset text
      	    var textArea = [a[0], a[1], a[2] - 25, a[3]];
      	    g.setFont("font", 20);
      	    if (currentPreset == "")
      	    {
      	        g.drawAlignedText("Default", textArea, "centred");
      	    }
      	    else
      	    {
      	        g.drawAlignedText(currentPreset, textArea, "centred");
      	    }
      	});
      
      	pnl_PresetDisplay.setMouseCallback(function(event)
      	{
      	    if (event.clicked)
      	    {
      	        togglePresetContainer(!isContainerOpen);
      	        this.repaint();
      	    }
      	    if (event.hover)
      	    {
      	        isHovered = true;
      	        this.repaint();
      	    }
      	    else
      	    {
      	        isHovered = false;
      	        this.repaint();
      	    }
      	});
      }
      
      posted in Snippet Waiting Room preset browser preset button
      HISEnbergH
      HISEnberg
    • RE: Reverse Delay Faust

      @DabDab Cool I didn't know there would be so much interest. I will upload it on the forum in a couple of days!

      posted in ScriptNode
      HISEnbergH
      HISEnberg
    • Modular FX Template - changing Fx order with drag and drop panels

      Modular FX Template

      Every now and again I see a user posting about how to rearrange FX networks and a new method crossed my mind on how to approach it. This essentially involves reassigning the processorID that a group of UI components is attached to. It's really experimental at this stage and it's an unorthodox approach so there is a high probability that you may encounter issues if you use this (just post here so we are updated). But anyways I wanted to share with you a template on how to do this.

      Important Notes
      • Keep in mind that before using the patch you need to export the FX to dll since we are using the Hardcoded Master FX to load XML Networks (Scriptnode).
      • All component attachments need to be scripted. Since we are reassigning the processorIDs it means you cannot use the Property Editor or it will become detached (and probably crash).
      • There is a degree of flexibility with the panel layout and FX amount. INstructions follow below but it is quite easy to adjust the grid position and add new effects.

      Snippet

      Alright this is probably the least frustrating way to set this up to share on the forum. I realize the effects won't be shared either unless they are in ScriptFX. So instructions for compiling:

      1. Import Hise Snippet
      2. Save each individual ScriptFx network (6 in total)
      3. Export the networks to dll.
      4. Select "Replace script FX modules" so they are exchanged for hardcoded master Fx.
      5. Close and reopen HISE
      6. Uncomment the code.
      HiseSnippet 7052.3oc68zzbbajcfRDjRi9vRVZcxgTofYrcMzhdL.lushrFJQRIFKJSSRaKUpT3hYFLjPDyfI.XjH8VJqOkZus45daqJUs+FRtoe.6AWkOr2R4jpRU4n+GjzeBzMPiY.lYnDWsb1p7Rft6W+5260uu5GZsoqSKSOOGWoYxsyQ8Mkl4hxaeTO+8u69FV8jVeEoYtfbWm1CrMbW6Po6bTeCOOy1RyLyYuGrCyb9YkP+94aeGCaidsLCekjz23X0x7AVcs7Ce6lM9BKa60LZatiUWldWpw5sb5cWGamA.j4rxpR8MZcfwdlOz.1syHKceCu8kl4ikap0R0rXyVFFMMpaVqV4lkpUstgoVaspkqTurZ8lUJWsRKoYla01V9Nta6a3a5IMyr2wo8QauuyK5gmfuwxyposI7AMosAyL90q4X2FtDguU5t6aY2dSJUxSB.kMCoYmESytt7FVssBdeHs6JnFTBGAKAblyvidmkC8zXQOUFzS.JMCCJMKFktp71sbs56G1BlWtdOeS2NF.9DKpf6qzY9AE4O8iycqo5ubafEeTV6QJaejmuY2b4VY4cV8yTH+1v3HEcU8x4V9q249e4Vj2e+02d0GdmU25d4dv52c0GtMo+ar9NJ4Wek6s7ZKNswyO9Syk6tN.5SO+BcMNvbMWvCAzq7UqptjRoZpKdyb.Zzm9oJe85JOv3HmA9JfQ44azy2KWK3eo7bvpsuQOS6u0ps+9J2RQuj5Mi118Ms1aeeXiZwabafvuUu8.sVlss8bsZSgIyDbCtAEc.OFzY94G9VfTmq+ifSOWStNuHbtEfXdaZ5tkyK.MV7l4fTgU6zwrkuxJlcr5Y4a4ziYDqt1Zqd2c1Fz4mjCx79UVs+LkE1x74ltMWXID+rskWeaiifaxi1jxA8bZtoK.vGBZ5fdM2EzLss8M7Vtmg8Qemo6mozwv1y7kKwLGqXB.Jsu7yAWSwmCPyBmCe2A7SwZV1.QCgKCtlhOELMOho.nQcOJfhLErMIXJBad3Swcc512Eof.zW9ofqo3SArYxzO7oX0t88SfWv0T7ofoYA76bOEKAB1GBwEmdl76.gf6dtNC56AE.eJqnrAATwaYsC2DIlGqgl9871c0dF.Mxf1n5I1yzeYa6voO+Bf9Q51BKFY7PYKfw0V7iOXv3wR5CbvvEGToosiuxVlcLcMA1W8T3vVXiwQV7lR11bM2SoCp2.HQeIy920a6oj+gl9uvw8.EH2A7XgC6Zu3hw.Krq3w2wwUIuE3A0apXo72S2uWv1r2d96Cd2Mtwh49UHQgfg9DqmBF.omfGJX09l4dIBUtmouh+9lQXnYXRB433YIQtDyzGJzAn3Pff9OVcTX6Diz2hXI6bTqWAhRwlRFFaG+cW.nklaUCddgUv6FVfL0.x.7+iJCNLH1umcbPB.yKwb0sIjx0NDK93FH9DRO0PzyaMLBJQ95IVehFDUPdFBQD3aW6Q4W.2NDOrHKAFIuXiB2lnQEaxJ3Ez8fUH7030XtrHTfrpY1AJzwhaOEOyg6IvTaPOohiHl.jRNnuxGQL0mypmsUOSkNC50BZrSAYzyv156LQcOOxH4RJlDw8k.cns4gTbA0Zg1F9FEn8.Lmz+7lL8Ar9+FC6Al4wiORS4Wvy34lq2CH3BdBngDpzMdmdAz6.PqgtJDuO6ibCg1IrSIQ6ETDz0w9tF11MANkm2oGZwRdsXNBUHVDKIJQiQfeINMEKgjP3XGNt9PmSRjg.LW4ig1cNBSAMVRoIclcAbS2dJFPwQbqKp7IJMYdDMcQApMZtvfMOEV1NsLrQymYaNiFARzoilvqOgEdE5OvaeVpSfdhfofq6vGxGi..sjHBa3F5PvH75zE4z2FFfsxcrcbbAP5S4bIjfaginuiGxgv06gcXzR4C4FPz9e3lNPJHiyo2HBL93PGfiN3iBG7iAiyE067rNZeCFeaYvUgDdn5TztiCAaLf3Ey.D1OnWJGE1uWBEh3EZtIiPLYiiBcCUL4M9MXTkJOGwM4k9L5XhXxTdiKzuu7ndtjBHfkHhb.gcsn14PcV48uUHvhJADQkTX+BoJ3MVwDOiRCvc0wssoKdetW9fM3q3Z.2WucOi9JOvYOqVw2aCZZGm6A3wXRBOs.Hy.1F+HZnQv8zPFHYVY6yi46yQh5ylDIOdBK9OcFzqc97z46SXDYWDroHPFcQDGfKroPxOYOBpwk82AAKF8G3laMvEX0lEWBP6.0Ub7R556yC1IvrE3S0ixXirTuwsDrAEyMGFQguszH1MNJFgKOVOideBxp7QeDqGSrZ1u0shf2KF.sP3FHfGvFRRsaH0f3nFDkhLTx58yUTEqF0A3UlKVKvshLsOQ8ogySX+B22EQZfAqhrAMxhlkOBlOygu6dHCNaaoyhGArLP.lrgy.Oy.2Mn6+ya9bvxWjbApgBsrsZcfY6E4Xs96a4g83xxCpgYObpMfNLQrKxCj1f9jjXBBVA1EPOQUx.1oQFuosuwiX3M7C7HtAdTzA9XNQMAnWWHk4q6OTLL9pEEvLOJwnKENn3h3A5kIQHtElGCAnXsyQEBHr1wYuNixQv.YDNhZ1mwKZA9VmjGI7puhpRcHJvBfGMVEJDYCXgN6h1eBBbilP10aCDEXhEJe.1cCvbwGQXbZHZ5GMIjnxX0PxTPTVHMk2ku87Kl.AFFDRPDT.eyKfBK4K6jOxDHxwJjvKCX.Jt+DsjDfYhGiYLOMgn2hMWADqCvDqC.DKlrBvBx.h2AThmXLJjV.AD.rI.umbPDjhlQh6azqsMLAAr8NOrkkPsyH5EQswKSdQxlfBtUESpJfVFCSOAauF05U7nvBvq.1gAjb+G19KeXAOen9.qNGkONLf+VXSFo8OiSZ2BIluj3gglOv.TSn80brscdw253dfGvgdyEHoDLVmeYxTzWF5nNPG2W.YssHtkS0nEMYhTFYP9rc5gSXMbzKQdCJ8xru.msWt2fSNK6qBy0J6aQ4+D9BTpNiGjP3rmuEM0PBCSvhr+kQzU8og6goikPrfxVVh1pxr4TEIMrrOP.n4.eRZJnysvXnYHMYGa0lLrUaLv1P9V1QW8ICc0GGzMTnJ63awICeKNF3KuDe1Q4RSFJWZLP4fsiYGaKOYXa4QhsYHgnnt9LbWeFu8QqPqhOKtKEbc7IO6ohRMHmAOlDVQbkDe9I2YfuOT8p.RLpC31GAUtIpSHeZB5HzTZnWLrdv.ORCPOoCpfqYea3o5xddM.2wVHojkkBOtvAnNTuqfQjFhOI4CDumNPpL8r5y+9OORdWf+Z5ZZbvMEYYK5pf4PrDIYvzLYhim4WVNDRzCdr4LbvG53a9k8Pd+edPqJQapSGgsQlHfXivlg0Jh6vFX9dC51zzkQRA0QoYlkuHKjStHKXqAjV3CcgoivbPZ4+k8M6kTkgHQNoFIoYVffUft5iJGiKQKGCXf.RVsg0YC7HbvVvkPHMakyHEE.Wl..LgGAg2UNT1ULb94amHb111BDqFASHms9FVGxAge+89u9uSEDtBEBqXzsOvgPd73O8u8CoBJWlBETxy3fQib+oeLUv3RTXrs02YxAhe4+9e6+SbPDmubADeA4pRTx40ajF1xUYXKBASV3J..DkqjZHbIJDPEZEOHTeQizyRffvDngMCzCFXbUJLVyzrMTIRTv7+d6zPVujLyoimhMLIsiC6VWT.btFYcGmX37yYX+BFBq4Z9OEAJq8GZjd9KFJeUFTgj.hrgSaywhtdILcE6+YFHHLD1qwRXyLfhufvfPvNmuHUT12kEJa2GH2xqW72869OtclgyJl8inUC76doBe9ErvQ31HwppiyqtBhWE56cT74JoZev6wvtRFVYgiAgxN6CfSD89c5rzqRCTdm.nrkAvwfnZ9kajMTA3ocLJbZY5WMDULsMM732T0nXweL8lgPQbDaSYlMCIDLYwLDB.ZimyALPPmCB+z2c8+yaK80qCSnDrHVItOAbopuoquEzasYVw74VsLwkz54kWwz6.em9RybtfJgA75jHgWEqW5PHbM.wY3JcHqlsiXe.UoDAu3J+lF3xhHrK+yMr7M6RKO4KJWRullVY0pUJKE1fNtkp0zpqpVSUx27PetgTRuTQ0hUfZUCv+KkJODOjsRoYP8UZvi5R8hh5MdVLTudo5pZUqnFG0CZIJpWuX0ZEU00jXK7DrmvLYzFJ2hCARqfpjALIczPG7faRW1N7Pu8vsSOkBLrlYNFJyE3oLOvnY.kwtoHJy5rTlOHJkYmXL0RMZtW3hTGvxJVsDXcJ0AHxf7fLnqpM5a.ikiA833OP5EPtTl4QVxWfHAKm+bYw09CYWYCaY94wVle9Hv81lcLFXiyAcD8CQ4EiJ7gDvxuesHX42+jXX45i.K6B8OAX54gNtcQ0NT6MMcaA5mwdlRdC5zAL8.YnOTpqU611lzCvLbB9oaiYRxxPLMcKtXQ1jvB7Ue6InE3bxPrMkqvHQcwr99GOot9lWFiqoaAxGRXBquSTBnyIiP0TYjfMb0v01O8qYVaM5Ol1HJWCpwRjMBbKSpMhJioMhykFaDW.YiHJg40rIBVtCU1M7oIv.Q7jLLcsOvh3SCyCj7XbHaxCX18s7Xs6KN0EqZeJrQTvduQlgkvEWicY2980SoE2bxnoAu5nOXvLq+1Fd9l84EJ+4aSWvxxJc8RZI23W2fcIewzlQnDVySMF57x34Aunu.9ITFfXW4R5BW4IwdWnQ5Dcim4pDjemZr3bxAS0TVH97oLwZgqveeaV6+aEUMxCEnpLv7EDRSrNEx9tqSP40rcLfk98NV1lD1SGeL3HeFEIwd9oeYDj+U1QQ9u+qFN6gDaJNPTfMpAssbPkYgGPVg0BALtvxkJWVunTr.FqpUrZc8ZwsnVSuRkRppk3rJ.OFBTnwybaY3wyDsVJV.Vk.7UJgf5hPM2KyRzljrZlPzlimmD0JqCbJnZEAqaZKSpmDkN9i1LNk4MQzlDrfFsIyiSonMiuLmZQaR.cZ15e4zm57iiHNIXJ0nCbdFX1q0Q.cs8X4mr1f9M+3nr9d+uKQqu+VhpS14JKQ2PODfjhdaqImXfQvyJ+ULVde0e7O920HjlfxsYRliRq+hwNRhDVSR0mBLXVeHtRl7gPJvXGBIyhcq2EZ2BiABLb8ACyv02ePr03CGwZ70jkKrkp6NAVpvUv2KiYCLUVu3OCpPx4+Z+INYoUqoWpV8x0EkmWRKSp4K8wz707ow70kvluhQZdMa+hmCg27bdY1mm.KXhN+voqILdzOM1vtX5OjxjrgMdQQIhRSBLlUe2iajjts0GpkrYkU9vTZbRv4nlvRcLifRzRcdY7LwsXK0HY6R7lnSGKTvI6lTlEWdJtxvyT5YiLgIJhklNtn3SeNgk6TjQd7EL7nrPeMjEZBychMQKJ1R906a+QWFqtCRvD83EgY050pC9uZBLQSaYRMQW93zD8UPlnERc.9rLDaW.QqoqU5X7I7VwKJG4USfs5DJdjoq45XqioQTmLEoRRX6Jik1uXXKVeGrfGZYAER3h67wuhy.fTTU6nJUgwnV66jnZQ8WQi6DutbraywEyk5BtIIWX9loCAgZ.DOYbq+FIZ.ToQ5Rier59IoPNmpbWAYv+UtMFAuL4L3ClYZVgHqhzs3iWtRI4Hy2bRd0+AMngTPWFYwf+6AM3Ghiivl+2aLVgkGiR71uYe1pXKgSmdBpfo5hr3GzxjZwu3XZwe1ze5zQILuQNcZLRPUvF9zT5zoisFmZmNMFxowv97oq7FmtF0YQxLiL5SYCpIgLmKIAzyIi9asDK7vqGAO9g+EAbNrT00jicEfJP.8yaHE+ZL8Jjg5yeqpBu6YIM.sBvdUlBuvN6ArNbDqvvT6pVMsn3Uk2zxu09hwwyH.GkjNVvQxET6kjweSYgH3rxq8nioai14hSixQM79HzjedZQhJ5Rncleib322EvTITVdGmMA1iy6YzsusIvGPykTZZ6z5.nDT7OJLh576.6Q9V6azCdQNLNe6XykZRh1v4Ha4L.5uwFF9tHWYd3ftaCTt1x7tDrC7tYNC7qs.+rJ7YnPw1l8Zid3+C7iznF74YHMpQaL7qOShbMNhtYfI+MPsCjvGTepKiLrAzCXQDOwKHSWOzCyKqV.7+vcaSG6i5uuSOqVPtDdPTDe4tNCf5QvX+8M71wvxFJhu8.u9.z6K6sMnynqEZfH1LOD4627qYzBPVOZSCn9iqJ2hVf1EZEHeFfogRHPZK9xfNnQHyXSCWvK8AnNdQ.mCpsKLQDfxcQZ6NiLnKv1gjlyfQl4vy1gcLfpg4vrqHStQ.JPZULtPZbTyKScsCdC4IfFfy.Qf2AJRvrRHlyNqrNZ6LaWIm3DoGxxasw1.QgW.U2fuGgPvm8EjhqumI9VMf+QBg.54ybx6AI+AnA9cn64aowAdyifmlX.xrXgWf0zm.pL1vpWvhCJDtgwgAOCKqbHQXdY7qVdfuSWvtS500MCOcdYfS7V9RIJrgaVDOkNzwQTZdYrP7HjwEOs31R6zNCyzR3cby5E.ypqYg8RZ9HiYDS2Y33TmkgSMWHm5bxehlZTlE74sChn65fmA8A8SC5jtVEfVyCLeAFmgtITtPIcc8ppUqVpVIshp0kvKMjDCCqFnrQLZDUf4bxvYLanArCEU0TKB5P850JUuppF4xSe6tNN96Cc0m.+4.9bCftzqehxEAp.oWYWRb.WhUQC21LtVPWZ7r5Utn75deCr0VF1THBHzbZIQxmZiircvXGu8T6EedGkzMcPmJd+Vr3MmzoK1ofHRIcNrf6vbkfz3XKlHmF6UmWl9AjrBW7pvQTNlUrrBc5GDwwArIeLBoBzSUEOIB.dWGlkcAAAG9ntG0RiagDcwA6P5bwIv6ONebndmHEE2BECdsgeDwaN7KDMhggTQo2n3WvG3STriHL9FE4necNiiL837wtxFNu7PCmVmKbZP.Ej7XemAff+c8BBa7z3rOtiyl9U9bhOLaJhJ1AJbamFj8aeAYKmkfria6W8DYf2MMf6SGq.uwC8z.uOMxjShAdikO0GeQa8SC69Tg6imvtupbGRUZtaan6BQDW9qXjR6XcXQ8cQNTJTz4JQ.UpEZmiyKitV8fkURBdYPZUrWFjFG07FdrdgNCjTHDcZtKvoTdyyLU1JuI54lV4AOqv47PGBr5NnaTtdlyyA3srvYNPWqJNHrD.tPg2v4ZNvlOnvdj8V50pqVoTM8RkqooUphNM2EftIk3rNaJS.BXi0DPWB2WFBzbx.28MbgGAbZytEQPJhM.WbDOEbMaYZ8byDjqIiMS5jy7YxvHUOzLCwrptnrO7C5dWO3GLL2J65AaXY5gnEGGHldabur7yP5f1s0flfHx319dAbfQnBXaHIiJYZFPFtVBBFzO38zl1Nsn.tRB.9hxa.1.ZAbuF.izrOL8BymWFWpOsGFVOErmBmqKK+08frZy1HxOudk4AFNEEbRRheQXxbBfWCzlW+BbcPj7WDXjosXmIcT9P5SZbnXdY7+hKGcvRGGSF6VgzR0mGpNJZHSWNPSlmYu1I3YIdbijDObmsY1tGrjI5G4cZmSPwwqkksM3+BfFOl+dxF3Z1r.WeDKqv0kQosBlCHayCooLLR17h9F3BDV2l3Ib0tMMa21rMtXOAfKk4Se5lp9obt9k+yjb8SRL.ZWwjq1iz8qIqWFza3uhU0KqWWs3DrX3LaxsfhngM15hZgJyl2B5M71Z33.yoXVriMfwyjWaxJjPIRqrB5JSIqFe457wAEMzx9Ivi6nXzi6.+Eue54b75rdBI2x.wNRifyn.tBDeLHY7TOl7JJjfqhCQhz3jbXGroEVV164c3cT3RxcvBnEfMIBKvCJitEPk5C9Svev3HPxIXfwibRFmB02bdnmzBcCTWudc0RkqnqWrTsp0JSbCL7dKgWOTfQtzEZv0PNZhs+oUWWstdcFr5Zx0KTqN7WEsZkKppWsXb7qRopZUqoUsnZkxZ0pfvO30VhH8ioKJq4k+DjAsXV3XxiHaxKzgeEF0o+zEd9IYKnqwLQhuGDZpD7nZUX9QJWSO8ycoDB3ib5XSRokL73HiDeZhNDd1nFRYEDSk3c.KtrZRFQG4NfzYkEu4NRhDXtteh5zBTl8XciwX3off0.DME3OCR.IqxVSI+YDfkzqomSddwT5zh13DhyLg2FMhKPiXNvD2GmWedyDhrhbjHr0SKdiS+BI9K9uPh4mvB0XMG61TB3omq8oEswIuuVhYYDzmnx13TQ8+xqDNNOIYkZiQMSDN1o2YudQxwj.+jpSvM92JJZhhIUzD3lNslIF+ZlXd7o10zpObH610IZggdcF8vfVwphi6rrpPg9KwB3Tqi9rbE9.iHdLCDtzyRD0r3pdfoCS6yQjl9vYApoFxdsioTGMOada.fkWPVeLTZmwTVNurttZpSNXlJAC3TpfuCqltkfAzTnu4Dtqcd4M2GdyIMYk.FwpbpR2ZhFj7r1SGt2JRMB.F79EnsI1bDs0i2ZchZBIcFXmStuowABcHC0f3POPMMhkwrGCUzz3ptH1oMb74a8kk6.AFsXR4Hr+0rUbJauDWQFbcYbTkedYZs2MFklW3fONjWgJ+ppx8SabKUuSR0J0bGS0J00.6uqnUrZoh55UJVudEfwjDNNKozVoe5Gq0R0bxnxkJqkREYXS8JoJTbNx182Zqvn4k0XOGo4jKOYmcQ5KxHRr93K65QJANx5ZIzqBhWWw7hpHXmQMcshZkqWsbc8TWbIIEL2PO8K5cccFn7UKOgUASxQcFIgruwJqnv8Wi96IfngHm72Z7byNNtckFUrnIdbb5SDgMLEAIHSeh6L4Je5YxcB4L43t3oSwovMoeZ0S5wxwguhCbmoCSqhM5RxOqUHT4Py2k3ZVqgiV7PXTAcL0hPHoOXhjSPZJx.ZN4cn2k0o86QHZH7E0E3zVoJkqopVtVwhUzKWsdQhGj3v4yX0EM2vrqUTrCr0pTqrN.CpUpBrldHE0F4xd93e9gU0T8xv7nnURujdEhFS50sbzbnnM5uDCAwtlrzAwXF8dJWZJHrLkJ2D98NQLLGHJJvCGrjyjKGNcwYJdECgCj0lBxtSWTN7JOO9EtCU9bJHvOcQZlap72Dd.M7al0Jmdyr959FiAe4L+mA93PQUwGiLtsoUYGccYOzQqZ1d29Aas4vw+lfSoTPOEghBAYlJMoYFZ8FcI4G.HXFtJaA1SLj5UcZcTko+X.yx2Y46Ddl1nDREwt9wVs9Jxm.F4geg.lm1DJPHFlmJQbBVhHwLCOK1QExE5epyJS5MnKT6wHyUGKZoebfVhkgeCmukWG1V6Zzx0YWxNd3B5bn2.1Tzib.Ka.eVQS547+KDgD7eJYr1sUKdPEaf5i6.KNtCrz3Nvxi6.qLtCr53NvZidfa.dlnjCJqCTDr4p3ul4YnJJ.NtH8+O8qUVK
      

      Example

      mod.gif

      Overview

      This script implements a flexible, modular FX interface that allows you to:

      • Drag and drop effect panels to rearrange them
      • Automatically reassign slots when effects are moved
      • Save and recall effect order in presets
      • Enable/disable effects individually
      • Use any HISE component (floating tile analyser, knobs, buttons, etc.)

      How It Works:

      The system uses a data-based approach where effects are defined in a central EFFECTS array. Each panel represents a single effect and is linked to a dedicated FX slot. When panels are dragged and dropped, the system detects the panel's new position in the grid, updates its value to reflect this position. It then reconnects the panel and components to the appropriate slot.

      Adding a New Effect

      To add a new effect to the system (for example, a "Chorus" effect):

      1. Create UI Components in the Interface Designer
      • Panel: Create a panel with ID pnl_Chorus
      • Knobs: Create knobs with prefix knb_Chorus (e.g., knb_ChorusMix, knb_ChorusRate)
      • Enable Button: Create a button with ID btn_EnableChorus
      • Analyzer (optional): If your effect needs an analyzer, create it with ID ft_ChorusDisplay
      1. Add your new effect to the EFFECTS array in the script:
      const var EFFECTS = [
          // ... existing effects ...
          {id: "Chorus", displayName: "Chorus", knobPrefix: "knb_Chorus", hasAnalyzer: true}
      ];
      

      The analyzers are really just there to show you how to add something that isn't a knob...

      1. Create a Knob Handler Function
        Add a new handler function for your effect's knobs:
      inline function onChorusKnob(component, value)
      {
          local index = knobGroups[6].indexOf(component); // Use the correct index
          if (index != -1)
              fxSlotRefs[6].setAttribute(index, value);
      }
      
      1. Add the Handler to the knobHandlers Array
      const var knobHandlers = [
          // ... existing handlers ...
          onChorusKnob
      ];
      
      1. Create the FX Chain in HISE
        Make sure to create an actual FX slot in HISE's processor chain with the new effect type.
      posted in Snippet Waiting Room
      HISEnbergH
      HISEnberg
    • RE: HISE Meet Up

      @ustk Only one shirt will do, hopefully @Lindon has some spares.....

      0d94aa62-654e-4c49-9983-0beb3117ff3e-image.png

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: ChatGPT HISE Copilot?

      @hisefilo

      Ah I have been unmasked.

      So I have been working on this since the beginning of the year. I simply fed it a lot of information from the HISE docs and this forum, forgot I had it published. If anyone has a problem with it being there I can take it down fyi. Just send me a message.

      I meant to share it here once its performance is optimized, so the fact that I haven't tells you all you need to know. I also figured theres a bunch of users here who probably have their own versions (come on guys, fess up) so it didn't seem worthwhile publishing in the forum.

      My opinion is that it doesn't understand HISE scripting even until this day. It confuses HISE for Javascript constantly. Even after months of training it doesn't grasp simple concepts like the inline function and ControlCallback. (I don't know how many times I have tried to get the GPT to understand this but it constantly gaslights me on it).

      What I find it good for is mainly debugging or writing out redundant tasks. It seems to be okay with LAF as well but that is about the extent of its capabilities.

      As @d-healey said, beginners should definitely stay away from asking it to produce code. It will very easily provide wrong answers and tell you why it is right, so it can lead you in the wrong direction.

      However, if there is code from the forum or docs that you find, something about the ScriptingAPI you can't understand, the GPT is actually quite helpful at explaining it. This is where it performs most optimally, and it is also helpful for checking your code against (but always take its advice with a handful of salt).

      In short it is good for speeding up workflow and checking for errors, but anything more than that is asking too much generally. Its also advisable to know something of the topic you are talking about in order to prompt it with the right type of inquiries.

      In any case hope you all can make use of it and if there are any issues people see vis a vis intellectual property, reach out to me and we can talk about it

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Cost Of Operations?: License Fees?

      @HISEnberg said in Cost Of Operations?: License Fees?:

      You'll also need an Apple developer account which is about £99. And if you want to codesign on Windows you need to buy into the license cartel, although I think @aaronventure found a cheaper solution.

      Apologies that was lacking context, I was referring to the Windows codesigning!

      Just throwing this in the mix as it seems to be a relatively recent article with up-to-date info on codesigning for AU/VST3/AAX on Windows (Azure) and Mac, as well as the fees associated:

      https://moonbase.sh/articles/code-signing-audio-plugins-in-2025-a-round-up/

      posted in General Questions
      HISEnbergH
      HISEnberg
    • HISE Flags Definitions

      Just making this post to reference later (I always have a hard time finding this)

      HISE Definitions: https://docs.google.com/spreadsheets/d/1crdLOkfyebQZefBQBJEXMisHs2qPkUafBtBjgVM-ir4/edit?gid=1018116899#gid=1018116899

      PROJUCER Definitions:
      https://docs.google.com/spreadsheets/d/1_1VHwHgDNo2ruV4zDOWTKKGUDnS2SOWEHOwHAZKcNHw/edit?gid=1220927349#gid=1220927349

      posted in Documentation
      HISEnbergH
      HISEnberg

    Latest posts made by HISEnberg

    • RE: Agentic coding workflows

      @Christoph-Hart excited to see what is in the works here! 😁

      ScreenRecording2026-04-05at1.09.01PM-ezgif.com-video-to-gif-converter.gif

      posted in AI discussion
      HISEnbergH
      HISEnberg
    • RE: How to add a custom C++ method to Engine scripting API?

      @pcs800 There is a bit of documentation about it here:

      https://docs.hise.dev/cpp_api/index.html#create-your-own-classes

      I think this discussion may help:

      https://forum.hise.audio/topic/12951/procedure-for-writing-our-own-api-for-hisescript

      Best advice here is just to follow and copy the patterns found in the HISE source code already. One thing to note, if you are trying to detect if a specific DAW is running, that's definitely a JUCE task. Does JUCE have a function for detecting your specific DAW? If not then you need to modify the JUCE source code (PluginSourceType) , then mirror that in HISE.

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: How to show FFT Spectrum behind EQ curve like FabFilter Q3?

      @the-red_1 You need to assign the floating tile to the module, via the ProcessorId. So ProcessorId should be filled with the name of your module. "Index" is for which buffer you want to display.

      Example:

      "ProcessorId": "Script FX1", // Name of your effect
      "Index" : 0, // To display the first FFT
      

      In either case, I think this example should help you somewhat:

      https://docs.hise.dev/tutorials/scriptnode/index.html#custom-draggable-eq

      posted in AI discussion
      HISEnbergH
      HISEnberg
    • RE: Module Tree Master Dry/Wet Mix

      Okay I reworked this, turns out the easiest solution is just to do the majority of the channel routing in Scriptnode. I have an edge case where I am using a third stereo pair of channels which was causing me too much headache, but Scriptnode resolved it. For posterity and anyone else who ends up here you can use this to get started and modify it to suit your needs:

      HiseSnippet 3003.3oc6brsaaajkx1irsRRaylfh9nPvt.oaSU3EYIqcA1HaKqFUaYqHoll7T.E4HIFSwQkjx1pEEaeLeW6S6iKP9A1Og8On6Y3PJMTlxVhx1IsUNH.dlyb4b+bl4vw0rIZXGGhsPhTMG1GKj3tnFCsb6tWWUCKgJknc33hswjlXGWgcG1W0wAqKjHwpeCcDI1bMAue9eOaWUSUKM73tDDdIwPCenQOC2w8Vq3AFllkU0wMM5wM5rEqnQr1iXRF.XypHQg9pZmn1AejJcXqfDdtpSWgD+UjplhjnX1b5JsTUaoKWHaarRtbYkTZWPLqZA0bhExIlURHQx80MbI1MbUcwNBIVaWh9vFcImYw1fWZ3XzxDSaHIz.1YV2kIl5TRj1qvdcML0qEvlbDDRfpMlosJio8PTUCciQ8Ol48Yd.ROdF7LvDqDF8VMD5IwidhbnWDnTBNTZMFJceTCMai9tigPwm6fpXARy1pfbhGUXiUHw+BsGAFfkaldpmfKaCMFMgGmUT7IokEE+x+dpTsGXo4ZPrRSrNh3hO15weYpeJ0lo94TomDT61QBitQ1DSSrcjfoJG1W1Der0fdsv1OI8oplCviFHv.ByUQSmqxKz0XzM2.IVUrLbOtO1ZZpBB9LKpDvGqfg55w++De9eCSCcrsfAvl+TzIVsdSUUp8TUiyE7PbdyEguqRIUW0fkCVYX25iscMnDRhR3SAyIl3cSTIryItj9.AtGoWehEEORb2YdyOe7FqWbHOV3hOGVIDhNpdDcX49bzQD6dplF+HVuF1VC1JvtTvYP61vX.lyeQnmgttItFwwfJkFub+2mclgta2Qc7KurXWrQmtbNDNpX+.dZE.QWCTQASeavpGPUZOafNvpEEaD3nzTt9VdLJsrIQ00vpSSCPzxnW9tj3oWAAN580E8Y0L95mh1YftAYGKUygN.qqUm.ORalTQQ4WoSwvE2abuu6cuahdkocWpToeMfaNdvAHfmXNw9neJU5zOp1Xx+Q+szOph0idBs6JV53ygND8ZANkLIm88D6Sb.+hXn+1plN3T+7BvUj44JFE+HgqTNRtxwCbiOaAwXK2ymsbnZKroG+XCj2uGR83evwH9kWTjYN3oUNOKYHdqUTKIBAzDDO7BttgfFD8AlptgijPi25CfZhw69l5i1BL8FxGO9ZK7xrhh2GUyvUqaz33JQfifitaBbzOn78P62tMVycLBtFp7qtgh.uJ29iX6ep.ivW4u4UBKzNZPuRFN8MUGtK3HEaSiUkHAPJAAieGZbXu91XvmHtIoFL9G6n1quItNfzOIcKSh1IM.WyWLVoue0coi3wZcUsrvlNwIjZxYlMIc4Ro5jATmOUUcsoQN1D3AM.m.Z387wNJOfpc32Vj1lpnz.ao603Wge7AJMhgA.kl.nLs8J9.km.nBs8p9.UB.NNbtvQX2yn9Tngh8+cvxlJF+SHJMfqX8Feo64B6PcAQcMX3q1yXJfD0qw5HwLv+DXiHfR2oGY.0OxpnrzDaapZXx3ZdqVMh4v9cIVFZTMkwVT6FHrGwWF3.InnerUCXo8x9lpUejWX60KqpARsg0ToAfuOhlhCXJfsynMxjHBxYrNJEcXYeGwvnx+ZAgocXzLceCbqyvOfn644uDxeGT4A3dVKLDLIEC1.cdaUZVJgv1OyCaAcxL9PiBqFM0qZe4RiB5wuE3HZEJB7oHPKjiRdIKsrUQxddU3GZRpaObvHPn5Ua.hfynd8ZpZ2A65s97c3mKmE1yTyIbSAljhliy5nNfHQRnFehOI874GdGluETN5EjiZoGdHnEPRUMrFQcTk1ppmOpsDzlxEVGw5ZmAtjdfGA+iJUB2VcfoKClfPHQbOlA+DhXal2fL9PiVD6C7JDwqDRDmXB41mf1GbroCmpyKECeJ5ehJHkQgr8te6WU+fJCyWWVtzADqC+g16TN6ONn9vpJ4Ovw5sMDydX8CGjud0dcec6W7xW+18K+p16XkuZFfla85mqzb3A6eZqWsam2Vd2tGaT6jRG9Mlu34jWzV4qvsyTq9t81qYkpkeckNC6rSliOb6CJmIrXfmesNpGvHMDlp8KCbT7qfoNqVhqDZaY9EtB2FQssHjt8vXtoLE+Pa5cfM0Fmoyz1tMoammp7UpVvqouJml9Fi0z2.80RhSprSa2vE2m4r8gPaXLd+HksfnjTNHR2I3yXnsPhGf1JSVYY47h4ymc6rRJhEDXdL7PylPFeMIdKNXsdJnZRwA5g3zLnINxYJkXkILjhFomz7bCDE+lOjlN.EQIQEX.EJrc1B4Ek7ulfF8HD2tfw4TP8jHuauweyShjoacHDOnSgael9cQ0wNXe73pX8g17vT.qOAdWKgMSgr2Lbmt8BCbzloLXwwhYClYpbbrSGM2YbiC6h5R8wdWTEmWRgpoNhoBIfcQDWYAPbkXxw7bJJEGGpil6BHpxt.Tb1XkTEhh0g20TzHocoT5T7fSgLWtSichCbCbqKXxIcYlbahrwZXiSwSxQCRkH.bzQMBfFaxL4rPloPkwX8VpZmLEmOS49zBsPykmnjn1scmP89dHU100jAfEI+veVWk9E8bKl3yCtYxINy5j8.s8tgF+i.NU+G2DdV1ZAry1JVF3IoVMRykgl+T9X2RKIxANWYXJ6SFYl4AKZpyCzBks9cQbmnwGaGa6NghyhpEMcEzvYFahUm3Hp2kImYPhNHOC1stndV7dbCx3tArrkh2gRNCO6oXk3BGJQddOTBrcKOTxxCkb6enjaIi4PNmVmYd5WZtqxSUUhNeo82+bXMfzS3pU.D2DRjPskInuElhAaF+e6dz3XhJxhJRxaMiWD1nKILzMgE30LVbqcIjS5o5c8vwpjs7Eq3NLfqC.gbnDXLUueWJT0B75hpdeHtMWwS+hhi.TObYUeXwfrP4lQQEk2+rf94mfGfCo2nqiSYa7OLZcd26K9biKzqPohUMNmuLuMw85SZLzRKTInV8CZgCnWp+TKbP.vqiBGbkE+gUqukU+425U+4Ar5f.BywEBY5004Bk.J5JE8Ar7OQQOQkaSTi65p.P+d+1tW3DKClTrSqb8KMCmjHI44MEmbYfNk2ZKk7YkJ.YnsMedkgid+4P7e+EQpfx1YymKG9qyMYwiVlP4uuRn7CxQ3tXckThiklxRKskVZ+gqdRaGO6SHsfOjESpvBbkuEVjhIIu.ESRdQjS4hCEmBoEj66xxIsrbRKKmzr3aI+BYokcYAkVVPoowL1fUZnryYEkFMskkT5lQp7Q42o3ufJHec9cJV33ZYZVoZoR3xc9VRGqJjWbpxd0qaz90GV6je7UuE9+qJu2dYxbpi0fmeIenhI8Nuz7cFK+4bicDK4ryaR+JYjoI8KIV.R4ea3jVKOh0uauLiPpRax14CrZQE0krGJbKb78qmJgwoHJtkTdkBRRTEwqyuM7I4OeO18OT7Gkqj+jJD+gVgmaAeSKH+IZaqqIFmuu8n4aefKz5CBdUXdOkwCIzI6454grdRS6JMs.aXaoK4gt+el0G5d+Y9gtSKap2CKgqzodOktl1vo9ndz41JJZtuES5xM95fye5ysl+g12vqPgMbUscgkmeQpiAIuCNTekML8eq8YQO86b.3OEzrvNtO0mc9TFehspNO0tK87KfVdtLmodpPOJShEIum54ze88+6UDLAr0CABfY5g95AvmrBwqMaEWL7agja7Q7z7V6l585u1r8ZAu7+bB7af2+Yn+7BrY.N1vfpFrO3BwDLk7eLY9taB5MrcTUhEInpl7phPdyc53EuYDtGIAsiqK8RP39BGpigiC4voy+mKdHb9bU6IsllCdgzb+mZgHkWeAhgtooF+oWD41spZ1k9FdWcldCuW63a7eOuWOnxDe1BnH+rEVYg9rEts+zHDtrOMhDW3SinmplM4M9uHSpUvFd8.bLK+qBsJscZoK92zhdf+z2noEdotvDki6DUh6DyF2ItUbmXt3Nw7wchae0SjFty+zqTicAgp01m8mggDiRxHwpB+ePylhjx
      

      ScreenRecording2026-04-03at6.26.59PM-ezgif.com-video-to-gif-converter.gif

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Promising app Midilize

      @ustk I saw a few posts about this too, looks very promising! I grabbed your code so for anyone else interested:

      oPOa6mMF

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Module Tree Master Dry/Wet Mix

      @dannytaurus Indeed I did, I'll update it!

      @ustk you're also right that the rmOut is redundant. I also agree the signal routing can be a little awkward in HISE, it is somewhat related to the Module Tree structure being locked in a vertical display.

      I'd personally prefer to use a routing matrix more akin to the AudioPluginHost found in JUCE where you can freely route all the audio/midi channels (MetaPlugin from Plugin Doctor or Kushview's Element are other examples which seem loosely based on the AudioPluginHost]).

      @Christoph-Hart I'll tag you here for a feature request update to this. I don't imagine it being a top priority but seems worthwhile to share my thoughts about it!

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Module Tree Master Dry/Wet Mix

      @David-Healey Hmm that could work. It's an FX plugin I am working on however, so I don't believe the send containers are an ideal candidate (could create a feedback loop). I'll try it out though.

      Edit: The Dry Gain needs to be at the end of the signal chain (outside the routing matrix). It appears the signal routing is not done serially. You also do not need a second routing matrix node as the signal is summed to stereo at the end anyways.

      In my original setup you end up simply attenuating just the Wet Signal by the time the signal reaches the output. This doesn't feel like a totally satisfactory answer, but it gets the job done.

      For anyone else who ends up here:

      HiseSnippet 1502.3oc6YssaaaCFlx1rq1cGZG5V2kBEa.tCcoVNdYKnXntMNt0n0IF0YsqWUPKQaSDJRCI5z3MLf8nsGg8Hr8Fr2fsepCVRNJtttGVxPyEAf+m4+gORQ2ySZS88kdHiJGLaBEY7g39yDpw6LlvDnNszD7UTOp7.puBcuYSH99TGjgQw6qkvnbITve+8ctGgSD1zDRHzSjLa5iXtLUB0dMeHiyaSbnGvbSIcilcrkhcjb4THZJhqglPrOjLhtGQKVAL5AD+wHiuFSr2zpVsFa4r4.BYfS8saLjt4Va0vZygaWqAYaxV01dqZMrPFWXWGlR50WQTTejQo6Icl0er7EhPG7DlOa.mpWXg5CdNjbaI2QuE0TQ6Llwc5Eml7QHCbujjVwvj1UwcYNr4zSRdWNfgYhFoSfFExFdEyDdVoCuZoBubBIiTgTovP5J391drIpDN534R3NBnZNj.0ozgRnrnB+UA7NRPBgZCWxgz1dvh4ZTEx52zD92MtckJPsxWYdDwyrk2Lcqf4OXFz4rwHpZ2gCo1ppWOh00AERj+oT0oIeDqrxenXvy6RzMgcYGCZEGffd6HcmHEvhpWOiTZCT4V2xLjf4CExA9UXBNSPMGNUXqXRgoTjQGsY8j7p12z7naT4WpTlKsIbyWLOZOx71wDcluks1nl42DKD3zDsZM.XuqXD3Scn1hZyFP49skdZQaSrgJe0HEuQZKuRJFEA58Y4nr1F9T0cUJO1foJZ0Xh5+cyv3Q6knJRVYiIFJaPH.x9qUxjezpDki1gv4Cfgyp4mB0AUpr7dREceQ0fbJXTyEYMbXt7hLFm5kKaM3g2xTrpXp6.pGTMI7oz4BBCHYm5vm9TWZPA6vttTBJEcDL09SnhSCp.E0ppmPihJPTUv74GGMe1mybndHFLF9I3LYSTPfmFNE8icZQTjXyAVF71Dpmho2HFsnGAvsgi+kwsn9GpjSBjMZJA.4WYmebhi+xlyRuPQOFrDFqkxU5.l6yw6I8bIb1OSc5Q8rAWA31H+oCGBx.ImuB4xbb3zdReltJkXt+7Nuf4nFOmvu8jliorQiScfwdMQmDdC.VkNS4DUVzVcGbDCsaRCwogwDf6mk9Lq2XPvqZHdEbOlxdb9wXgbhQnX+1HFiN35ivgPuIAXIb6e5szoTkNo+KierDPf.Wp88EvdtcxV0LJtxd2Z4adsiXhQcI.pmt4duot8gqZXSg8tP..rPOsgNoGstldsN+2mJbBVTHgokdsQDyfEESXVWu9ef+zLmuHh4loYNeQ5RyEmeQLl6DN89wUlx3HL8kbKrm86snbRl1mmlY9B8rl4bOsNhi.TjdRNwawlu2T4+LU+kOgDbz5qyTboUqEc42yaUmn+TbPJ+7T.GzRb9IfuLtG4rPCwZgfDOpWaAb.qzLsVfY8X3lSEAoXDybQPxEb8C.v08mpNyhttXtIC55h4lLnqnDydRz0.tqD5ZzsfWB5JB8dz02it9dz0yNnqugPPdkte10BSlWB+TxQzfmvHHO9YAqGBeHj48oBpmNKasDvj+XUevrIq7ClsusBBgC7HB+IRepUZK2m5xN.9JP+LTWPi54pQ8rHfpohrlNjTFozoh1PpHkbWrYLw5oIBMeYLFrNik5xNN8WKtqf.sV8ovN2YeeaHwnyyo6N6Mk6SClAsRqXB45oI+.hmCTCsWFpboUCU9k7rgW3L2yFdN3ypy7xlkiiwvit2ENVkKAJwmSLjLkqholczqqTHmLVJXYJzOlBXMiFQyz+j6F5tJEw9vDJWs4iobJwml9gQdDSPIdcCdRj0JWX8J+Ju4Vu9BbX3ZpwKLO+9bHE+e8ygr5Se5m89LcU7ZX.JttYPoz7+lZ4B2d.m6sGJ7Zc6g202PAsru+y3De+mKw1S9b6vmYVCWbw.JPFSD7CnUF2Uu1z5juqrKbXyyssyZpSnX80UwMWWEartJ9sqqhastJ9cqqhe+KWQ8cAt6TkzMbpBtSTucC9c.LLBuNTv.F5eAb1jpbD
      

      Before:
      ScreenRecording2026-04-01at5.20.39PM-ezgif.com-video-to-gif-converter.gif

      After:
      ScreenRecording2026-04-02at7.59.29AM-ezgif.com-video-to-gif-converter.gif

      posted in General Questions
      HISEnbergH
      HISEnberg
    • Module Tree Master Dry/Wet Mix

      I feel as though I am forgetting something here...

      Setting up an FX chain, how do you properly set the Dry/Wet Mix routing? I thought it included:

      1. Set the project to use 4 channels
      2. Add a routing matrix:
      3. Add your dry gain set to channels 1&2.
      4. Add your wet gain to channels 3&4.
      5. Add the routing matrix (out) to mix the channels together

      However I am noticing a -6dB gain drop on the Dry channel with my current setup. Does anyone else do this differently?

      Here is an example of what I mean:

      HiseSnippet 1503.3oc6YstaSbDEdVauTroWfJZo+bEpUxTQCdcbSaDpBCwwfE3DKbJT9EZ7tisGkYmwZ2YCwspR8QqOB8Qn8MnuAsmYu3c1jEWWCgRpv+vRy4xbNy4x2b73A9BGRPfvGYT6f4yHHi22b3btb5NSwTNpWGEg.IwmHNfDHQ2a9LbP.wEYXT99JILpVAE84Ouy8vLL2gjQBgdhf5PdD0iJynNn8CoLVWrK4.pmlzsZ2yQv2QvDgf2T1rAZF14P7DxdXkXkLQO.GLEY7klXmMsazn0VtaNBiG41b6ViIat0Vsr2b71MZg2FuUis2pQKajwE10kJE9CkXII.YT4dB24CmJdAO1.OgFPGwHpE1ngfkiI2UvbUGQEUzNSoL2Aogo.DxvbPVPqbbP6pl8otzEzyBdWNhgUlF5APiR4cux4bOac2qgl6UfKYn4RUhcoqXNzwmNSlwQ4OWxrGGxliwPdR2UhkEU5OJYti.jfK2vCeHoqOrXgF0gn9MsfutwsqUCxUARqiv9Vc7mqJEr9NqnJmMlPj6NdLwQV+5IrtNnPl7OkHeYxmvJu7GxG879XUQXe5wfVoNHn2NBuYBNrn90yIkZCpcqaYESv5gbwnfZTNixIViC4NRpfaI34zQss9BVcmaZczMp8S0pxDNXl0KV3sGYc6ThtKNx1azv5qREBLZlVcFAr2kOAroxU6PbniHrftBekncwNPludhh2PemWIES7.04rZRTai.h7tRoOcTnjTOkn5qaF6OJqjjQxKaJwXYibAP1etVt3iRkjXzNXFaDzbVu3Pnxozhx6Ijj840ihovlZcRViGWHujMiQ7KjsB7veYJVmG5Mh3CYSLKjrPPnAIeWm4KuqSGTvItpSSPAuGmJ2eFg+xfJPIkppNzDuBDUF0e9gI8mCYTWhOhBsgejYtnIJxw0QXQeeuNXINc6fcFr1LhujpNHFcHGAvsws+UM6PBNTJlEIaRWB.xuxF+3LC+4smquPRNF1ISSkTdBWX69Ty8D9dXF8GItCH9Nfo.baTP33wfLPv4KPdTWWFYfHfpxRYa2uemWPckSWP3WdR6oD5joZWXrWazog2.fUgaHCKyi1ppfSXnLiNDmBFiCletdD8jPvUVMH3keCwp5tWwb.U5LsX+sTA9Kj3Oq82jKz9.yXH4LmshY2e3L51qJm19UMer.Pl.Spr8EL885kOaZTdkst8RsNRYHJeReLfFpJ52KzaHLBhCAN6bN.7B05FpDPx5Fp0pbwPB2MZQoLl1p0FILiVTNiYS05+B9nXtXQByM0YtXgdp4hKFPi5MiQteZlAZ0iwuWxzYO6W6PX3bkROMWeG5YsKX9sd7i.zkABF1+jEhuth+4x9KuaI5J2yMc2erYTH+7jCGURb9wgur4.7aCEDu5HHZ3.mFAQi4YFBRxzhKAAAgdGBx6PPdGBxaOHHos5EhfjxrPDjRIvKEhfTNgYgHHENd16Aimsen7s14yVezUT11dZz0HtZwlqEGatj4SwGQhdZinnymDsdL7CjrtOgS7UUf1KAn82V0GRa1J+PZ66HAW3.eLOXlHfXquyCIdzCfecXPNpmPilEpQy72NHC4425XR4jREJ5BgBM4tX6ThZRd01Pios97qv5l520zmdr9uhbWNFJmFRfSt69ANPfQEm06bGDxBHQ3S15JlQtoN4Gf8cgbnyxtwpxpUS+O7bhW3r54DeCij9p9Sue875mUS8w3Qb1EF+fI.Jo2mNFGxjoTy2F1WvEylJ3zbI8GS.bmISH4pkJ7.cWoD6bndM7iILBNfn+3IOhxIX+9QOaxZEKr+W+RvElu9LyX20RgcX8+imLo74smL4MbGp54yO2joulI.i2zJJca8ee99DSgXV3THkdklB4M8jNnkMEnwolBzC63KdtS7yXqfZtXDEHhwi9C5pZ1Ws1x9juaMR83uzm63jeqNkhMWWE2bcUr05p3WutJt05p32rtJ9s+yJplo3tgRgWbGFB0evtQ+OCFFwiUE0rg9a.MAGDe
      

      This is more or less my setup:

      Screenshot 2026-04-01 at 4.42.33 PM.png

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Attack in effects plugin

      @Sampletekk I am not sure I entirely follow. It sounds like you want to use something from the dynamics category. You could for example use the gate node for a similar effect as my previous example:

      HiseSnippet 2310.3oc6Z07aiabEmzxirk1MMIMYSxQdH.0oXgfjrhaWzCR1V1aDZrsfkh2jStiHGIQXRNL7CaoTTf.zK8V60sWZ9SnW6MetGa5sdIAn+A36EntugCoHoDkLkrrR2f0KvBMe+9726MCeMsnxDaapkfX91CMIBhOF0ZngS+86iUMDZTWP7mfNBa6Prj3cs2PSrsMQQPTLyyYcHlacAu+to5dXMrgLIrKAgynpxjOUUW0Ir2l090pZZGhUHsU0iL6J0ZHSM1mpQcA5ICpnfIV9BbOxwX1zVCI7IX69Bh+bDVd6REKVYGks6fwcTJ+rJcIauyNUJsc2mUrB9Y3cJ9rcJVojfX1CTTcnVsbvNDaAw02ipLrUe5UF7C3LUa0NZDViRBsfSl28gTMEFKx5UX+9pZJMCDT1BBhnlghsLbw16hNRUQcT+ghu2xa.ovUDU.JtVbxKSLxqTTxqXDxKARRLBIsNmjdaTKYKUSmvQXzyiPML.sYWLnmhRJ74JHdMZeJLACmB53KHGZAMFsfs1oXwmJA+2G8q55ZH6nRMjnFGScHmXr0Gk+2lOW9eWdowGpa2DGicLVTMMhUhCyLMrl0B2xvUuCw5oRWh0bIilHv9wkonoKSipxk4bcjIRMZXn5bhIwXZFBB9hJ3WeVi5XGLSQ32GLOShkiJiDDqStDbC3pkbn5D6KbnlfivD5LvZgp3pgchaBwbz7G.jAwzaLkigspyvnNhKM6pzRhuMpopib+jow0RfFAI0CAM56M9FnC51kH6DRfqiN7yWctd48c8fyjc3O1uozgedoDc59CnPCbSKhI1hzl1TCObKartoF4TfFepTGMp7EsT+JxjdElbRXO1L1RtO1vfnYuHNOYSsTozrUJmRccTM5cD1wRc.3EdrqdK.WWlruO0A8ItFyGh2tHqMytnEwPwqwsve9CVh0VzevRACFw86XhyUTqK7TG9+VPbSlreSjE4RhUGgc0znWsOU2T02BEj+d80jpMzrO0PUl0EeFAT4t5TW3.7I0Py68BTEATMDYpMVUiYs2x0FvLTNwnErOdgCEybFwx16L2.Ur.7Ov5+XpBLT1Cwxf7dXSrSelaDCFBrYIVEjGY6NhEhZ5viINZH1tED4jSQ.inyDNr3lhYh.GwsXYs.+w031mMrOiMpLVS3LlEAiO71StD0iT2fM07HEqgmeEwojvTobaSMHbOypoI1BHSH5ACDbsnzXtru7k8tkQmSxT4BNiw3g.5IPzEROlLZ3NjjSdNQV6cI9F6n8DEuY.Ydtt5.hU7y+s7NevSqvftPhNVIb7iu9jEOQoifzRDWaLE5ZioPeSl6VDguuNkaEKL1jyx.zIAyYSzmBBMrE3qcECRuM1pGww6Ph1gejNChGvhc7l9xoFJAx3dLEvH5g0eVuXZwOjzumLg1z2yHLNyVOnEj6yQpF9rYXbnivCFquap1xgXx8tCmWqKHWwUwQmIS.tAhuAsICbZS89MP2faI+PQelgBoKHTU.JqGOQ1VtcdtE00zqwDjTcRWrqlyD8uqqCUG.lUF4dFyqzShDyJ7QfUnEoPuYY+6M3bY6sVTau3R6LyVZ+EWOozFjrwk1eyKe4eq5DR6q68WeRMt4pmVNYgMK4JY0NDskqnNBWkOU1P09i0REW8adm5eaUdZ4szoTm9PHyovZYQd2VJU7UkZIyWUpcGrxxPA8XzoDahyr7IVZpIgEItVTKVgXwRX3JKZrjQqMswRPQbf2.o3pqOL94lGAVf8Kn6pEtCeHZWEEIm9DI37jp2pYPpefgiTeB3rWnvXdydoJkXf1QmZp7sEmaufenQRuoZx1M2TMN34nvIyE34nU8ZvyWCd9JI3YDruMP8.E1XI0CYnNz.qqJaWfMZhHH7kcGXdqGynO7ZTgIWlbldahzUMzwChmmW.JA6LfKGOH3kWpqB27.ObOW3t+bDqX8vBJ.3GCBt93AvMfU.2RukGbkxXNjnUg9tceKhc+9.BwRPe+et81itd5AKmaOQZJ8Dq7m9WU4WUcWGGr7E2S2vu9u.nnSwMrQsU.ejCbC0HXaxR.OowhxH2TcR6qZoiQ9lu8+9O7indJySaEDQc9yNPn1jYGbS0omc..yqpP3Yf8feWqnfiifglxU78GMommwen444YlC7wrnTdK3ruBcK3242e8e+6+yeW04N6hTlyz7xX4Pv9pp6purL59hohP2fuodVPBO7oaCbFdvxjyll6zrgG7fvlja9vZohatN2Wyg5xhXic+Yku7C92Ree2mTaIhzMuJFfUf4uB.4VNrxr.syiZR0vVrO9yCbLnQX1d2p6MPcsHe44duE81y8aUmYRr7naX46FPe72XX7GtdCTGL6aYL2uzPvBS4yLrTegD9YWdQI5xy66rmk6LLu2M2eE2wgkxah+3+O+l3+yau8mccphUd+ht75aku5uUdN+OuWows96NnvT+lfgKZ43.7fk7Qcrt4zMNdOzwTKcrFrgJMIVx.YyDr2qPDe2pH38FnWnp.poejwVPNIr4tZ4p6arq3V326caZOG9FOLh7MQ0sF9BhSbrhIkeo6ylN92aN42TapXBB6QoWni8Jxh6c4N897AeD5E3KIdEbnWkN7Du1cASIomSf7IXEYTokQIGZl5RN7DYGfDZagMrMo1jRwzTDc01TChcrdGaEkSbEkiC863ZDeq4cEaVLQwgfnHx71rVPmki1YSrQrMCZGamNhUANgtUGXf6nQZQ.NW4DaYPvfGy3qoqlMwCEqTzEF1c4nc+IXKEPGJGq5txLqBubpERT7BcKx7Sntqx9PUElqmtRAa1EI5q.E2WrJWKW.M1Rk8n5G.P6ZfKsGM9SQ9.PA8F2m7HpAMn.pBs.Nk3Xo1qGINpVRLj+SFOpm2sVviuF4s.3UkhWkprXxhRycU7kn95C7egaIFPhz8QusRMylYAZlIUEn4RmdW7h0bE6gB3mu5noeeDfoWVxScK8Cu9dUTGnqhyPGKaQO2+E+Y.Fa50Cv2F9255HVaoRBWNdhf5PnmykkiuUSrvxK5B2dQWXkEcge7htvcVzE9KVzE9Ku6ExxLv+cRX9IP5RMOf+MgE4YJwevj+GFxvEH
      

      All the tools you need are in scriptnode, you first just need to define how you want to modulate the sound. In this example I am using a gate node to shape the amplitude. The threshold is set to -60dB, so any sound above that triggers the gate's envelope. You can use the Attack time to determine how much time for the gain to ramp up from -100dB to 0dB.

      Then I use the minmax node to invert the signal and apply that to the gain.

      However, it really depends on what you are after. Other nodes here you could try are the envelope follower, the core.peak, you can use control tables, pmas, bangs, etc. all to the same effect.

      All you need is a trigger (if the amplitude is above -100dB), an envelope shaper (for applying an attack and decay), a gain node and your reverb module.

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Attack in effects plugin

      @Sampletekk yes there are alot of ways to do this in scriptnode. For example you could use one envelope nodes to modulate a gain node on your wet path. A number of the control nodes can also be used to shape the amplitude of the signal.

      HiseSnippet 1808.3oc6ZsrTabDEsGAs.jeWwNq0Bu.mxkJIiBwTYgDf.GpXvprvXmUjVyzRpKMyzS0SO.JoxprI6xZ1kOgrM67+P9A7m.UkO.maOOzLidgP7HUbYnJJ0Ot88dO2mcKpK35TWWt.oka+dNTj1swM5YK6rYGByFsSMj1cw6RbkTQ9fo1nmCw0kZfzzl6EpIzVZdj+OmUYChIwVmFOEBc.moSeIyhIimsd0umYZtMwftOyJwtKWcGct8lbStGHOygKhbH5cIso6QTaKCF8cD2NHsuBSzWoTwhkW0XklDRSimsV4VzUVc0xkVo0ZEKSVirZw0VsX4RHsraYvjbQCIQRcgCcCtQuFc3GaGvfCXtrllT0fRnF.mClFsYGloQ8HvwEgzludLTMW.T8P7tLCV+4igr66uP9XJRBZZYljHU5BHRZIDo4CDoGfanKXNx3UTxysv6XCVvVDv1jTTB1KR683M4vFrkErHcoaKfA8IX4UKV7o4g+7juskmstjwsyys2iKouxd4mj6mysTteIW9AWpUqQtlhMBtoIULxkUtChIQ3x1dVMohml+HhoGs+FA0OMllc5vT8.sNwF416XyjuxgFNdatogBqTedXK.JD1fO8lcpQjDkQIbNXeNTgjoDGsZzifvf.SzR3ZT2tRtCDHLj8C7b3FdlDYZ2IUfV3B.djxFpLT1tLYujAhW.erhSzGaZEwGfqyj5cFsLlYDxHfTWGxXXj4cva0pEUWFKfyi29cyZXXwKbXXtvvPfmJle6vg429ckFY.3ugic1cDTGhftOutIo2xtDKGS5qAY7o4aZx061f8SzgiPbBDgMT6XY8NDaapo6rDHk8JJ4D50bOIyt8tDofcBRCummUCHutNcyPoClSKiJFJXbQ0XkeQCpsg+fOB+DtXI0XsvEKEsXhvu8nxi4ht9livOizVTg8KhEzinhln0MM4GuI2xgE5gB3u+b04l8b5vsY5poB1QjTttE2CXPnnF6duQjoHRpgJS6SXlJu8FdtP9CiWY2.NG+xgZyc.U35yyEvEK.+Bd+6wMfkxtMQGv6d0IxNpvHUJIvmkJJn222suJjz0InlX+kTmVTky.IBTDKE3npapMWhzQAdrpQP7Xl.+ycbOPspNwDcfxiPoG9mY.h5KpKn1ZNrgn2gGSkPtwwI4tNlP4dkWSch.DSnRhJIXljx3RYO8z1eTImCqTKEwiAzgH4IB5hkGGkLbNH4v7IAsmG7M.q8gh6EIlGZwNgJRy+66yeHRqvIsfFcDif8CR+ngmjxQT0HsLCXPyLfA8dpvsDfenMMvKFMvlypRnSi1yh3WBfFQ.wZGqRouOQzlJ8YRxIBqzYS8Sr3ldXHNsiQDF2VY.5KOp4y5WSKMSl9yTAZi+LSn3Je8nQPeP6xrCUy35P6RNYf4NqRCI0IH5NdeM5RONvDmbmJ.bAbvArO8D49b+OCxMDVFvT7arMns.P0.jr1AMx1vq4KDbOG+ACIR0nsHdlxglecOI2BRL66DgFJpzGQR4EdKvKTPKzdR9+9Kdg78xjz2KMZO2jQ6e38Ci1.xlFs+iSO8upLDZ+91+4ipF3t5akGMXqZtRm0jZd0B0IzpbSkOT0eu5ToU+3WT6uqDzhdCKNW1AJYNFUKK1+1RSkdUt5n0qxUOGU4pv.ca7qotT4jhItxLSnYotVROVTpZIp7JyZsj9zNs0RvIX8BXCOKqdo4aNL3A1ofkmY7I7X75FF4kcn4A9kuVi5Qs9ANN46Pgf8BEFHZ1uUoQVnMhqSJhV6B66+ec9yypLZukypjNkY+hHWnTl8o5yoL+bJy+WlxLQZmagsXFrfbZohBdThTdwaY33gjGv04UPR1xeVedlVdua+1s8WaXAMjnKkLltQYUPkjl7RgwsJO59VuE1kotM+gP20C03p5nFWgojDlRseHlBNHlfTVHdGixJEu54f.3Ih.S9dEWIWXHKdFurfRO.c7jn2gqFCtGJo2FdsZEVIK0LJMBpqbRziIrkUSpAjt1mbETjNK87W+4yVDutTRz6dISlU74q7O+5XRl83p2.4kWBRlYRItzqfrxOdpTjKw85Nqx36KILr7F8ZcYPW+8acmPGsM8DGMN06KgtSEVDS3PMpSE5PBBkRdYq8LhjkiMq2RgusUoAaPq0IEF6ChESz4jnaJ6H6ZxD.UyIVNiuykKC7+gwz+6GpftI5k+sLCvL8IlZkE6u2aTsJUKOWzKpDRwUSPvmLWKIymuVxmtujyXe1hrWO4DVDWSz6sPmnoToorM2Ae7+T86F8fHnwFdh1fy6ZQ7+Fulsu64ahueNKhtfeX3MyTXwh9y.IWrCKVuqZb9RniFz7nts1g55oOpgH7YyJgqLqDVdVI7qmUBWcVI7alUBe94Sn5+ukvDqJ+ZHbp9VA2bRaKaRSyvGA5eALvcZRL
      

      You may need to elaborate more however, when is the reverb meant to swell in (on MIDI events, an LFO, etc.)?

      posted in General Questions
      HISEnbergH
      HISEnberg