HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. HISEnberg
    3. Posts
    • Profile
    • Following 0
    • Followers 6
    • Topics 67
    • Posts 762
    • Groups 1

    Posts

    Recent Best Controversial
    • RE: DisplayBuffer in compiled network causing crash

      @dane-zone it might be that you just need to save the scriptnode network once you load in the snippet, then go to compile it.

      Are you able to create a scriptnode network with just a simple oscilloscope then compile and load it into the hardcoded fx?

      You also don't necessarily need to use the hardcoded fx, you can work with just the script fx.

      HiseSnippet 1615.3oc2X0sSabDEdVfMI3jz1zVklKWwUapnNdMgRSqhBXCjfZ.rvDZjppPi2cr8Tudls6NFvMJ22WhdWee56QuJO.Up8blYW1cIlThaRTSsDfmyueyYN+LCshk9rjDYLwpx9iiXDqqY2drP0uYeJWP1Zch0mXuNOIJjN1owntcYwNOpIow3HZRBKfXYM6CQAsleNh9yKdPCZHU3yxIQHGH49rGyGxU4Tas52xCC2jFv1mOrfz2c0s7khlxP4H.TyZWiDQ8GP6w1ghhMiM4Qzj9DqO2tFqSmftcV5dr5dd0u2x0VdkN0ARKw7o06txc8psxxqT+d.HuzFAbkLtshpXIDq4ZHCF2tu7XgwAGvS3cBY3BORavyFxaJCCvsHRkzrOOLnUVzJgPrrakG6l0D69T6s4A7SomGC+HMCmbMJF.sloL7lsD77JBuZEf2DfjUAHMmAR2vtseLORkyAwyUs2RnXwcov4TQnXjkLysl0toDjPnpNjNfsYLr3TMb8pUaQmkqc6uoRE3nJQ4jlfzRD5bemLE6wTMkCijBXg6B4hrPtdlDp1vIsOCzTm3g5kJbQ1tKXvlylO0CsPIGmlXd+RF7kLjqG546bGmVvwhxYO4HEWvbpjCspILklYJO2tiD9JtT3161NUdVEG3Supcg710BCcM4nIU6DBInfomux7GQich.bTxuU8iYvIaKppuqpOOAA1ik9zvFxQhfD2ZUqc6Ec9dHl5snC76uv6Gf+Vsl1jFWlfwRzam5zXV.v2vMHldr15QK5DgVO0vdZC+rE1uO2ef.N8W3qc.ZOGTD+QGKvhuXmlzvvNvtHMrpzDuuyFhdPTHE+ZI2syOx7Utf1ZYPfoomYf7H1oArBg2XVDFccy.PpMTzXiUbWRmTUoRlUbjhcjJ1tf4.qMekmWw4rr51ch7vrvXYXHXzIw13tWghthQC6vhWz4HZ3H1oBB0UkKVsO+h0h8R7MEEEDTJ1RvU6FwDmWGFRZkD7smr05TEEqvSoAxEwhUbDBVqyNB5uZp2m2dcVx.kLRKaZ4GfZkl60y5FPErPBO.a2me9PNoXS6wEWPd4NKPOMYvnPppbiNbbPJCHfVp6B1AQjvUiKNt3MV2uKJDugcKtxu+jw3LS.iPX+sAFSmYbc6MflD9pb.Nm8lO8cv.Bai+qjlR.9Dc90ry6yVBD6LZXotZXtu0LvVJclg0uXmWFEgU5wr8ks.4cSnCiBY6AfeQmNgR+As4+L6kq8hLXqAJgqeep.xQSllRzKcgCWdu5SKyXfdaSUwbn1vFhAlYKMSQWVLHccMbMlvzlIBzK9K3SJSObsUJSuLlEJx2goNVFOPeNk9ch0ULGJI5f7gcOAfOD6wrVqKaCCIpVi.yhjGi057z7Y3zRSqkLbbTeof6ijLRjA80FByHTY3OuXnQ14S1VAts09TdHVazdTBztJXWQavN5q3g4l6HCfucoMo9PLeLNGBqwvFdPBMN86zD6Rai7bKL3atbWIAP6lcMPCTfcvPc2L3RfPBIv2DqL..8v0s6xOYo5GpyxHkfzmU.REEZR3nrYlFfbY6giBUbx4FULrmjyyT8h51YJ31OzVl3CWOA9MLevqr6uoMUPCGmvpVTnIhgyZm+Irf4VgrSxFRclFEmkBAayFvNw3wMfh3.3h1ZkQyQZQiATnXYcLylzQHm6Vs9ansZ82ZaUSs+qylcJ3naviqFiNVWxsUxAHW35ljCv9jXg7+dCzPJGLjpaVMUWNo3fvOvv7p1sgJC8a.zcKtodsy2QOh47PFTyfiw8N2md96+5ebQe5YzE9om65q.2ueLUjDISJY31rg78gaWkTj3SRf2Jw9o8vVoEo2TRimHqW7fMgM4D0oMUMJV2SNqWcgKjL6q5EsdS4KZm6+bun88fqcV5NUymgw1brKwFhiXgXiGDieLj72kBs1ynVNWdaoPlMrN+fdOFb0id8vFI4Xehan0TJ38W4TFr5drPFsPR6e9aq9XHYiFustK5TEK7ds+GPLwyqaYafq94mNu+9bgY+e8yEdmb+22E9XH0OVdnu4YCXd5UzTf8sPeGf4s2FW63QNxLgK+rbHzk6Pe+xl5kTr9zp3RSqh2cZUb4oUwubZUbkoUwu5eVQbHzZiTxglRS3kLs1vb2JqMDTHKWWQP9azvPYK.
      
      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: CSS custom variables not taken by the ModulationMatrix

      @ustk said in CSS custom variables not taken by the ModulationMatrix:

      @Christoph-Hart This has no effect when using the variable inside the CSS (var(--myVariable))

      I've noticed this as well for the preset browser!

      Link Preview Image
      Preset Browser in CSS

      @d-healey Nice thanks for clarifying, that does open up a bit more possibilities. I'm trying some things to hack around it so I can get the best of both worl...

      favicon

      Forum (forum.hise.audio)

      posted in Bug Reports
      HISEnbergH
      HISEnberg
    • RE: Compressor

      @hyperphonias I think this tutorial might have what you need:

      Link Preview Image
      hise_tutorial/DynamicsFX at master ยท christophhart/hise_tutorial

      The Tutorial project for HISE. Contribute to christophhart/hise_tutorial development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Recompiled Hise

      @ustk beat me to it!

      @hyperphonias The global cable is the way to go. You actually have 2 options, you can use scriptnode and send it out that way or you can bake it into your C++ node. The scriptnode method is a little easaier, particularly as you already have the modulation signal setup. Here's an example:

      Content.makeFrontInterface(100, 100);
      
      const var gainMeter = Content.getComponent("Knob1");
      const var rm = Engine.getGlobalRoutingManager();
      const var cable = rm.getCable("globalCable1");
      
      
      cable.registerCallback(function(value)
      {
      	gainMeter.setValue(value);
      	
      }, AsyncNotification);
      
      HiseSnippet 1913.3oc0X07aajaEmisoSjxtsMAIcCvdYPPOnTDXXo3DmhEEV9yrB6JaAKEua5k.5Ynj3pYHGLjis09wsEE8Oj8ZKJ5sdpF8RA5k1i8RAZ+OHG58zGImQZFaEaY0rtsN.AhO9dj+3683u2iSqXgGUJEwHmxcFFQQNuGt8Ptp+l8ILNpwVHmag6A+rIUQiQaLLhHkTejiy7OWqfSoEPl+d8ZaPBHbO5XQHzABlG8SYgL0Xosp+IrffcH9zNrvbZuR8FdB9lh.QB.l4wKihHdCH8n6RzpMGF8wDYejyOE64eXsG6uhWsUn+rGS6txyVsZsU6Vs1SVckZjmtxJvbzUeJoFxYws8YJQbaEQQkvhtgveX69hi41M3.ljcX.UOnJpMryVwnM6yB7ak4YjHjCt0X+z7V+zcwMY9rQxG6u9QlIbGaQdmlybWDjpdEfjSNHsfER2F21KlEoFOiM90fCwttDH1jGJVcQy86cvaJ.M3pkBICn6DCCFYQkpKu7ibg+6geT4xP7QpbOhD6NJiv8m6lYbOpZSQXjfCCp7fOgKNr5C.qFaTbHn817dLNUq7yCDGRB1WjnX7dMIbHTGWofAdDvU.1DGZVb8nJOnmwLy.y5CvR+6kho8XR.QaRBBNDxbpzMg6oXBdkiHAIzGV9qJWZDrWRRUGnEmN4GUtT4u4QtqKGx81UnXcYdDssl0OagbEbXN5d7JlEq72T18rS0s6DmS6hhEAA5C3DlVeQH9hLrBOI7PZ7ibGeTzJBA9hYSKNcYSd1HVNEE7FblZuHZ53cDA95rD8uOetGJMjqyBSQHnpxjC9CRyAaGv7ABCFrH2.aRFPFvmmd.8hFaQTjrkAVQXWhnwJl9v3rE8Hf9vlZWBuEUNPIhL5llkgb9gW5ldx3Mbq5CGO3mTWpFpcMkwGn2QOR.Jj46GPaIjLs6OG21e.RrhZy9RC5+p69ad9+7K+10ByS+gPgjSxyFJS51kchg2pKKHTp.70HDxwQN2A+BI00m1kjDnbkCf0IfwGP86HL5eLyWADcXm6BqTeJqWekdzu.FwTzvLJxRKhPu4MVN0yQE.jPB+j.hpHyjlyNcB8ILOcf9JOGN4CyeJtBzUKegzUSKDuMtES40exXbtIfQH446CLlRx+93s61k5oFCvEv674yJi9xWYF8xoI1vdp272Kcn6Ned0Iwk67qviYOhhoQjXZGQq.xvJRRXT.ce.iOx8v.g2.c574obhrPXCsFU75S3bZfbVXlV7cTcNznBDvMH39Dd2jv1P9uGcyTzouaLmlTxNdY8XcdQaJ22L3MveoSVUO1IcxpYSNlOCsKUcrHdfIbj9ajyM0996aZCZepehwE7pz.yIn0CBDGq4jXoYrP7vHqkHXXTeAm4oEY0HC0qGJR3pLnONceirPS1o.Z5oCgEny9amHABZ+83sg0wzoky7.2kzrm2.u7Rv+faC6J7goVbGhG3+G1hn4RtMVy4C3GJ84MJW9sdjxmZYa+5sppd2xXjrHFNngFxYfJyY9bL51Lb8H396b174FxQruGXKO.ND8ZpUO6nnU88wegG3Ais2OJb3tC9K7kQKke9ye.JZ+kf5Exi5bQmNjXnQDYZAKN0yFuM3rgutNjs6jWYZIA0hDC6MztQCSAI6ATuSvMwSxp7sESFAWP2.pWPsz.Ejn8Tbe5IY4paCW27gZyFyyxeGsQZ6WXzHHysIiePwxtu7zljSN3rkhamq.2HYCnGaczoROs2u8d00Aix3NfirOzj.pC8DUGgY8.WxQfSSuu2B+B.zcg7Mezn85q+PwuL4YO8zsrU9NGFPWLve8ZmG30qOU.u9u9u72WSC7af2WGHuJn9F+oG9j0Rte8Ii5Wu1kfZH84rn9z3oD009i+MCpuIdckBZo8p.6L3c8C6S+W26OafcI79z.JQRu539kuE28KqixwIblqaEHE9w3XagikJny4IFNyhjmYnzh67c+t2bk4zxQMjB+r8v9pkIxnT7NrStnSooJ5.gzoJ5XzzdUvt.uCyoVOQIBg58ld0JbfPaHDCBIlBqyTW+46M6CrSdK7mQNhZ9XElpY2yLtq.dl4yoPgNcikUufuXwecZ+hEQS8WrXOOE.gNwDtLRHgHc9HAMj0Ad1hrfzyXQsIZQAoaQUI7hKsUTAszthc.WQN8tY8Lg0xKrEgWXwfwEVolrbuq4er11bcNbaJbx82S5ANFxYRtZkDHoel9MLUya3Xw0xK9iIw9PLzqPG8yWr4wEltlGK93lb5OgdsW76qOnyBSW6+WxCr+e+GzU30JkxvXalt2lsAZj.3JsAi2AmRWjIs3cxlBtHqI4wY.6Sgt860iVj0ZRGnzJiijb25YEcx8T+OE3wHwMMUNlIewU+awMw308SKj6pIRb+OItcsllcgOJe9o5Q4uyw6r+.8q4an.+4++Do+.LvoWy0Dtc+ue7953s+WG6QHwKV7JO6mLQSXbSiD3byM8fVB2TO1cBeizPnzyq77JtTmyvZypgOdVMbkY0vmLqF9zY0vUmUCe1kantyfz1d02Sf1kZss8o4N1NkLWYP+abY8roH
      

      About global cables:
      https://docs.hise.audio/scripting/scripting-api/globalcable/index.html

      If you want to cook that into your C++ node:
      https://docs.hise.dev/scriptnode/list/routing/global_cable.html

      posted in ScriptNode
      HISEnbergH
      HISEnberg
    • RE: Macro Modulator curve?

      @paper_lung You're example has a slight fade-in time to it. Otherwise I don't hear the difference between the two modulators.

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: SlotFX (Hardcoded) Persistence?

      @iamlamprey as Christoph says this is precisely how I do it:

      Engine.addModuleStateToUserPreset(var moduleId)

      Link Preview Image
      HISE | Scripting | Engine

      An API class for accessing global properties.

      favicon

      (docs.hise.dev)

      Once upon a time when I worked on my Modular FX system I overlooked this function, and ended up having to rewrite everything to incorporate it and base my system around it.

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Loading Files Into MIDIPlayer via script?? || SOLVED! ๐Ÿ™

      @Chazrox I think you need to set the path to the file there, not just the file itself:

      MIDIPlayer.setFile(midiFilePath, true, true);
      

      Essentially this is how I am doing it (you will need to change the file name, but this should load in your project).

      @d-healey is right though you want to learn and use the File API to get the path and extract all the midi files instead of writing it out like I do (it will save you a lot of time).

      const var mp = Synth.getMidiPlayer("MIDI Player1");
      const var Button1 = Content.getComponent("Button1");
      
      const var midiFile = "{PROJECT_FOLDER}kick.mid"; // the name of midi files
      
      
      inline function onButton1Control(component, value)
      {
      	if (value == 1)
      		mp.setFile(midiFile, true, true);
      	else
      		mp.clearAllSequences();
      		
      };
      
      Button1.setControlCallback(onButton1Control);
      
      HiseSnippet 968.3ocsV01aaaCDlxNZaVaqXEn+.H7mTJBRsbRpaPQvbieY0a4EiXuh8s.ZJpXBSQpJQ0Uih7ec+D1+fsiRx1RYdcAFq9CF9d4g2yc7tidbrhxRRTwHKmoKiXHquydxRoddu4DtDMpOxpgM6ijvHACc9xHRRByGYYU+mLlsZrGJ6ye9imSDDIksQEB8NEmxtfGx0azNt6uvEhgDe1TdXIuOt6HpR1SITo.Upa2BEQnKH2wthXbqlM5sjj4Hqma2hMalevriNk01yq8omz5jNyZCpNhQIsC5brWqNmzo8o.I+pA9bsJdhlnYIHq8NW4ubxb0uKyCv63I7YPVABdnIPjyUOTI7MonQKp2btve7pZTBBNkwapX0yqXOy9RtOes9MUteHy.dChxEPqZUoW8JzyqL8ZUhdagR0JQoud0kXFkDjkr3Lp7D6KG0eDNWiWEhzKMNlI0SXuOk8favBSSig6hxW1WnTQCjDfd9kUaN8YfqShXUMXU+Qmqde1bEYRqgbAy76Ro8d4o8SsmPi4Q5MVL492ZORpYwADZ0V3beQ0dUM6dJvCo9vPxB1vXPXMB2W1p0AX3q8esiCzhlnwefDiCivmgyFTN7NldSw1sY45bS.zFLmmp0JoG.bU3.n8TgQJIH31rvdyGDohLFf07Siu45edPuo2N75K5O3l6WvoKNDbn4qwu3EX8bFVBiKXUPFJbfoP433vkBtjgCRkTMWIwJYQnL7HVIboqHwAPHEor8c9jSCd.1MSBe1YXu8cZzHL5vDl1PF2Ur5.rNNs3af2MXhDVtmTAiD+FgXUeUhqwdCm6grqH7lSqfB8HBgo0w8gbC.Uh2WozrqktY7y4dG7CMEDrUaEmk.te1lYypn3OGPWYZ3LVb4piwQnuqZes8iqulle8WxQkbjjquNhI+2V7fJ5Yf4cqBVAtpyZ6eRQaedkCwMyd1EkQTFkKOTi90Q8IZxpCBNSHNQrXM2jBV8Ye.VamOO0vtOKYgVEk4aQOBj0Ohv9w0g7Otq6x0Bcm1cKysvhRkepfnqt8z7FSgA35nxrqY9Tlv0Kqrl4+qUpOVJ9T6wbMc914XssvQy15u.br3gnu2dPP.ip2Pv8rG9aeYd0AciJUyk2cIQGygKa6qRCm.OdSYPzkRXO.nyplowMWtkQ1TAlvj9YB+E7ovnmQ1pvn2JinPBMVcKMuc27T22joA3jL6uEzv9RiLdKc4lET2RoUOp+Av16Jvi1UfGuq.OYWA9xcEXmcE3q9uAZdw7MoZUX9XC7v93AYakrrV+GKrpi9ajyj2aC
      
      posted in Scripting
      HISEnbergH
      HISEnberg
    • RE: Loading Files Into MIDIPlayer via script?? || SOLVED! ๐Ÿ™

      @Chazrox Hey hopefully this will help you out. It's a whole MIDI project I was working on that sort of never came to fruition but I started building a MIDI browser for loading into a MIDI Player. The script is pretty huge but hopefully you can find useful parts to salvage. Maybe try running it through an AI with links to the HISE docs about the MIDI Player and extracting the useful info for your use case.

      Let me know if loads/works for you correctly.

      HiseSnippet 4621.3oc27r1baibjf1laVqb6lcq6wGxmvppNejVTv7gjkr05rhhOjnsHEMIs7CUJt.IGRBIP.Z.PIQ6n6Rc+RteF2GyOostue0ccO.fX.v.RJZoToBSJsFyzS28zS+blAntgdGhootgPrUZMYDQH1+P7lSzrFTXfrhlPkhBw9WhOToqxdF5WZRL12PoadCC4IB6MYjroIoqPrX2eeD1XO7ABze+5urmrprVGhWSBBGqqzgbnxPEKuVqu6qTTUKK2kzRYHCzarakN5ZEzU0GC708imVXjbmyk6SpIifcu3BGHaNPH1iimlztc2dsy8LR1LYx9rMSu4VsyBMkizQNaus1HS5s1bqrOCXxuoTWEKcilVxVDSgXOXO8tSZNP+RMaBbrhoRaUB9PFgl.ksatrtZWbJhsJTXfhZ25tBLSA.K08De22V78OEuJHsl1tmX7GncH5MBVAXr64m8tuO1KCK6klg83vR2mgk9MtqnTVRUdBwfxJee7pUJVQztkL9XjBiMLHZVMIeZLw2J3u9KNc0x.VKXa+Pc8QkzjA1qKayH1aCf1bDweGwt+BOWyLy4p.NsJqnRv4cL2G.nw4HnjTT1RVH1gw2LmjVqm9psKzn94kjjZUodyV8K+dI3WYo5RREuXCsOW7MWYVFZ4hWJIU40mU5f1RMJVuzdkjVas8jxKU+kM2nh.R.akvee7uTuwQurTgVer7QGVrTiqOWoy4RfoBvKn5bSk9ZxViM.X+lZiGtmLvxLRgZ5CUf9wkI2F+gcKRz30LJgAokgEqAksX2mjsEY3HcuF9i6JbSUFx922JC2KQr3Yyrki5PFo7edXdoCLuR0XudUJKUHW+5adQ98U+TgICtJ6k8aLZ+2o7gKZou1YkmbVtCRK+Vs2t1qk2SRtW6JmU67wC2ebuWYUn7YUZ7rsOt26K95IeBzALKja6MkpuU0q1uowy13kExU7M4e8kmqV8fbkdakypV73wkNO8G5kUdi9oKdwa00y2nWk8KM53ZWo1+rIuq94EMTe6kkKk8f0FXV7SFkKU3xMq7tssTq9xtiG+dRwielRwWZU5Sqs+f5ubuO8tsSmO2ZepPiWmugzEV0+v1Gew6e03AYJ8J4Iet39m0+YpenXw85r8q2R4cGlu4659tOW+se1b3gadw9VpMkJ.LZ5CdYK07RLZ5oBooWsZ80KUsd10OPYzA5ixr914ZOZ3hp6+C6dmp6+G+eK++bu+RKe59OvV2+Gi2rigxHKudPkiea7JZVDidxfFNq1uMrB26+94wKnCPnYIMT9bRYC3goiHwSSmNkH7mj6rxJO4Ihu317GhvBGUs9Q0JUqkXiRkK0nTsBkZJ9Hwiy2nR98NrTyaehBgdMsDuP1PDcLX6WvT7EhmrhH7ilbfTehkmajDqxFNY0joVH.ytZxUNEDZdjajl5Go.KaARWMLUCfrtxd.SEzg0XM3gDqxA1Ugk.Ojo11F.W83LQhpPP5GQtT5XExkvzatbjCb9QRaKsOh7XcCxEQhAVf3O7Zjqrl6vQfBKKpCoOUQqm9LECt.El5NKtyj3SU.3O3rKvfyhCdEMXUvDR4iHV0KyyU9xJOzfzWTtikxEDOkpJZcIWAnN8N182wNxjG.PeLJxmvc7m5L39f7qAPNXLavzDjJJ1TNmlrzsjUappagMNcHOdJn94DTnxvelDURGKRWGMWW1e8LN8OP+BhQzcyL8B02PZlmjK.MvBxcFfT8KWC8sxCu0cRfXr5aNrUk0qeX92WpgXy22rUop2ETRQSUQiH1arFrxoqIZdohUmAszY7qLxakL4JODTTPGPJ8DY6P7O.qAhO5Qhrs8yrpFRpDs9VCRZObGrf+hRkiAS63A8Rq.5h.u+UTKnggbVZUbXrY0Oi9ZX5vwuqjAYDTjiUhjLiX7ntPBct9S70UH+sRlDvIfE51Jk3p0zEcPtXSmI0pI4xKgDzRfaGMXDszqKqQTSDvkbxYsHgLQC6IxQZ00MUPcMn5Ms9jDVFiItC95Ud302YVT62nRQwxuoVgVUNpVy+ZXLANhw0vBDU08zGq00LgheqHU8NxphczUAUBZWh+qr947.A7RiJ5xPP+dp55F1HR7ISgNoOv6.T7sJcsFf1QbTp.Fi1chjLnHDFNfnzefUznvt+o3.8S6CGij61UQqui6dO0KCBj8pFjximBCHAdLCWul6XS4ACJBdLKewCHOTr9Tx+XwrAfvAA9.wFBzSAUCjyRYAOKXGAgYhfKklXxzt1+rl7OlItV.gjMpvb.O0eOTSGzPFH2.SODxXW4jAHBzgJlddIr+aOcCwDJT2MhJf6XFVPTYs0B6K1lvCY7gwLgVSTgwFGC.3A3OGja86tO.Yn95bl2RiFaNHQfNweq1yAWq97fH+joD9zTbFHlgyLGjj431lVFvJehvCmxbQOTpg2Q8Rr50qlbsLoDWdDfkzsZxviOIu4TeU81xpTT.SsonyOjWy5D9Zu+IQ0jrfKDZiUU4fkq4X+5NvYYxfwU6V0KPaBmAExEHB3qHS.MN94Crl3pebUpIOc7RLxCep7nZ4OoXVjzC3ktIBFi+DWBcZxvZ+bCagqgtbsjqJYJQLpUJwdxfj0W3W5rgbAfFzdLJa1Rt.jfevWbVLEINlRh+AwzQaNE8DESqgiBEE8lftzT5vSsihkt.T37Mfx1Rnqs7b4Im90yd7ThilihRstqg7kLZzUzvv6I5aHOZfRGyTtZnonQZrC6GTa+BkOa2Asveeglra+jzmB55ACa4zWlYzW1SgnZavuubXeYYBz4ILXLB6h6kGV40rrdCYx4MTI6kLWk1W7BeZs1RcNzVS2hz.xtjeXNH0SntMOylV50bfGRgTkXFl9o7DxyNl3TB6vwQDYbJXmnbJc04EdD.ddGNZXnbIH1YLh4D1UCmU.qkI6Vg7oLT9JmdYqcfNaPh.oO5wiQ6lvSXWa7P.W3+BTn1InYpKmPy3DdLgSSobGaxfCYJ6YOD4qR3zD2gbMOudLZBXkAr3BBz5Rg0cYO9tNWNIhtgReEMY02GoLwk4LFJqp7YnVPcTUMg2.83KHe3oSBtXwfLTdzHRWjZdZQT6Z+D3whI75mZ+tQxchZEcZ55SkZYYrBvg+DGERpzcMwLIABjV5oAQo+mb8rgACsO0vDouZ6sKS+EbnSAFhTp1.ILo6TyzDmPEsoOMkmDvV6.7akhYN.OjgeRHb8HGrb3.da+ZxidpsGhcSWYaGhhZB9I7BxXurrSFHS+9jV16w3pzZBv7YRvVj.cIAxzQTuGsSW55hFlMQzWY8tXN4N2k0OWOeEbixO5MspTqzcR8y7pyDlm0w8M.TlrfU8Dtq5I56sN2mptkGBCm9prYSS+42qOcul8pzJpp495pdBIhW7VaxDr9eV0ZFlBKx1gKf.LQlSnKz+D3kBSTORuZHpULc2hGOryl2LFal2NasCOTcf8Fmh6SANNN6i5LchfLuG+vonm99bu7zmVt7S2K2lAcufIW5fKGFZtnZiM36oxedp7Gatb90khvAIemcdZBoDyMaLDQJk7ykbN7BK+WtbDdooE1nimNPWRO4wpnSjLgll3JO5gwKWUeYnlJTRogR1LcJ+ImlBZ5zPLCN8yqpzGJXC8hMsZKrN9TLbPJHgevj0HvdVNao.iUvuHZKRPMKwmKZqlwW9frzrWQ4GhZtU.4eAJSlaaF.iQljdpDA1e1ncjJ64HUlwQZ5zdJ+tkL0Wbn5LJq0WR4z3nm.Z.v+2ZfhIylN50f6VHdJmRJBQAEyRCGYMIQRZUE3oMP4lYlZMpC6Kw5TKRlzT7Nauq+MZNztr1MNCZ6fQZDuc8M3ZT.fkuPVQEuKJMoGl3K7M5PYZtSXVLb9pamJHVw7S2ZARzeAVvleJ91L1WWB9HNXSuOT97rRo0YjCy1i1zkUv5BcDunIRyg6LGH2U+x.HBWiXPl8iK.B8+jr+Huo4G8Tle7RO9BhRHMmXtxAhyUZa7+sfTxUPt.zAEXCfItJN4uAxLL3WJeFeLZ7OAxG3zcl0DJWZ9wEhXB4iCg3B2To2yn+BSLtAg7I8BQLda0F00hdjEd4d80bOWvDXYoAhXria7ofo2vlknMCeHFbCHWJQ5eRKkNb3loq7NwJuSpWpzw3EK5f70JdXoF2I0KYeQAzGCIES2ZLyHKghBTAYUUTP6E5mtWYdg+WlpjltU0RzZBD+S+I6cTVhbkhU33wy3BXLisA2F2Q6eewJUKhAuLktElCoWAB+6fKjfhae+7KBs6t9201G8H9GjjMBlD.4YXP9j.HObl3bpQ5K7oFSMlXcnbpyL3O9qmJ6veDsMHxmyouqCr28yIIGp4bvKFw070J6npz47o0I9k.4OrP5LbRl3lpqbmpmbGniDgIx71shEauJliRXD21lnO4uf+3bUbV7AOWTtfGMH60ZI3uYeIcXK+M4MhKCVxGu6ND6Ot1QyvtLJS3qmQYnPDJ7bcmS7oB5ZliGR5BfV2fXZRLS3bvXeY0yISJn2EOQ+mlKatMtNkHfy7F38A4PROK9fkkEr2LxUhEDrMYAqAlb.e3xwBWQ8K0BCVlbWSk.Xje7BLuxCO0eg3AlxtS0vQk0aeVRQlaZG1.T7aY8NiMsuzTy9D0tYgwotyr62YO0PGYtFNQuQe1+ElsU5gI2N.uGMNPKNg.oGRu5HhxVhoCUTeXBg4.jLzQwyggRGZppg6XluabSvgEjisWFgkNymKd1XSKwgv..qAh8D.uJVJcv6JuXh9Ffxaa8qR5MGvUCmkcjuoJknq1n3YbeIPp5orROPw4x0PMDtoEMceO4P6MmEsYCqg3ixHL54KHmr1BwIYmoT3Ed2UMjIdynanrHv0TaVLRtafHwGS4YYuvBl.rUXcLpx0PXvN5Z1mVkslVJwt5Z+aVhp5xcoWiUlSN1k3+TzTGuustwgcgOXRayM2a2Ati8phGyYeiDoUt5DSFbNcSRBy0SHJEdNdudFCt5lXOYQiMmoEzjqeCmYyrWgyPWd4MY9IzKhOoBGnlg.JhTb3gDt0q.S3ZvhtyJLNEmJ2vMRhtYXnuDQYstAWyW5LetwY670bgmBlUyxkIS3a77rxXIJEMmDLBdZv5ZrupG36DggtZhNtuPDofUY0wD+2jcZSTcKFOGzijk6lJy.v5quys182Npy21aFgu8I2zYTTW2juliE+16nwCjX.Ul+ydXccwLQWHFyXVas.ojtnKEy45zecn6kdgiZznTgVv+sXIdKU648t5rjqTTOAgeMLRmbmH0O7HZ1aWhlYJQWj2pJmL4Q5OMqVtliHVWj2ypYiPFqgYivou6T7wW3krEAcYmO5xxft6nMYrRsJspj+vJeHO9VMbWPjk4EAYodAPBaFd8JqvnjiG8xQZIRhuqZPWhA6pWOt84rFnBZy75FeiZMl0.SnMdXaLUMGyHG.Eh8.+ub0wWrWt5N1pUL.pCA5UrNZDQKpOEBBN5h3GEAGtB.0h9Z298Nu1s6M1xRWS.eKg+93rlbBT9l8E7U3FgCzJa4vw2Emw3KHJ90e4lhhrb3h2Tg9pmKDKliHBDaiHFVJ3JRrhjKT5Pre8jeX7hDyyszGID6amZOKD62XS5uy8kWF0noT9eNNmPHBWwR8IrObIdPESa3u7et6.5YMLskc+O1EbQneoqiBf+9cwyqpJ50f.Ce8MQwW+X7.1aQwS69m2cd7jPqcEhVVbnbaGZ9OFOTddrTUY2IrSSL4OXBDG+jMDPr.fFjE1vGK7sKpRMC4euexqXVUGK2R1Xhs8jM+rRb5sqQerY.d5Oe7s.OQMRX3oIKDO8Mwoi6FxOQtL88wYugfLry+0+NuUneWbZ1VYvaa3FRou8DK9s6iR8zkMPwQ.sjJbHsgbWE88MzGOJfOjaHCkkkgprKWFJ6WACE9CivODupd2wp39Iw9AqA+r93zADuw2GGA7CffFDibhuOlG2VeEaVTV7GiWGyGjOOdON7H3F9tfGc91+7cwK0qGj1gGC9f3ke2cyG5GA6KIUenjFCEPeIdswCapO1nCAyYAbEiw6icOLLn8yowmQIPShVW5C+evOmNyfOGyoyLtcJLTtig9G6XGDD+vp7szV.dRi9oA4gwqhOKlIbbO7sV4ic53GUgFX1kcf4V1AtwxNvMW1A9zkcfasrCb64OPLRY9wV5CsMaDDpVuj82KoXS+78D69B++.nXSG..
      

      ScreenRecording2025-08-29at6.06.02PM-ezgif.com-video-to-gif-converter (1).gif

      posted in Scripting
      HISEnbergH
      HISEnberg
    • RE: Loading Files Into MIDIPlayer via script?? || SOLVED! ๐Ÿ™

      @Chazrox You should be able to use the {PROJECT_FOLDER} Wildcard here.

      Link Preview Image
      HISE | HISE | Project Folder

      A overview of the Project Management in HISE

      favicon

      (docs.hise.dev)

      posted in Scripting
      HISEnbergH
      HISEnberg
    • RE: Sample Map + Display Buffer? (c++ nodes and sample maps)

      @griffinboy Does this work for the sampler?

      Link Preview Image
      HISE | Scripting | Synth

      The Synth object

      favicon

      (docs.hise.dev)

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: FFT Analyser Path - Need help drawing the magnitude to height

      I made some progress towards solving the UI lag from the FFT. @Consint & @oskarsh @Oli-Ullmann this may be of some interest to you.

      Basically I found that if you run the FFT inside of a scriptnode network, you need to script the buffer size in order for it to take effect (editing the buffer size within the scriptnode will not work).

      Now in my case I need to drop the size to at least 4096 samples which is barely tolerable, but it seems to have cleared up the UI lag issue. The minimum the FFT will accept is 1024 samples (which is virtually useless imo). There's also a direct correlation between the size of the FFT on your UI and the lag you experience (smaller ones don't seem so bad).

      You can kind of see the refresh rate slowing down here:

      giffymetimbers.gif

      I created a script to resize my visual/buffers, and I use sliders to control their sizes. It looks something like this:

      namespace BufferManager
      {
      	reg isUpdating = false;
      	const var BUF_SIZE = [1024, 2048, 4096, 8192, 16384];
      	
      	// FFT Buffer Properties
      	const var FFT_BUF_PROPERTIES = 
      	{
      	    "BufferLength": 1024,
      	    "WindowType": "Blackman Harris",
      	    "Overlap": 0,
      	    "DecibelRange": [-100.0, 0.0],
      	    "UsePeakDecay": false,
      	    "UseDecibelScale": true,
      	    "YGamma": 1.0,
      	    "Decay": 0.5,
      	    "UseLogarithmicFreqAxis": true
      	};
      	
      	for (i = 0; i < fftBuffers.length; i++)
      	{
      		fftBuffers[i].setRingBufferProperties(FFT_BUF_PROPERTIES);
      	}
      	
      	// ----- CONTROLS -----
      	
      	// Control - FFT Size
      	inline function onknb_fftSizeControl(component, value)
      	{
      	    if (isUpdating) 
      	    	return;
      	    
      	    isUpdating = true;
      	    
      	    // Stop all processing
      	    for (b in fftBuffers)
      	        b.setActive(false);
      	    //Engine.allNotesOff(); // I was using this but doesn't seem necessary
      	    
      	    // Updates  
      	    local newSize = BUF_SIZE[value];
      	    FFT_BUF_PROPERTIES.BufferLength = newSize;
      	    
      	    // Apply to all buffers
      	    for (b in fftBuffers)
      	        b.setRingBufferProperties(FFT_BUF_PROPERTIES);
      	    
              LafFftAnalyser.createReadBuffers();
      	    
      	    // Restart processing
      	    for (b in fftBuffers)
      	        b.setActive(true);
      
      	    isUpdating = false;
      	};
      	
      	knb_fftSize.setControlCallback(onknb_fftSizeControl);
      
      posted in Scripting
      HISEnbergH
      HISEnberg
    • RE: Issues with plugin latency and oversampling

      @ustk it's a really new feature (couple of weeks old) after I bugged Christoph long enough for it! Testing with an impulse was my way to go too (actually this is exactly what this new feature does). It's quite a time saver.

      This actually had me thinking how great (and advanced) it could be if HISE introduced some new tools for analysing phase and magnitude response (as well as other nifty features that PluginDoctor offers). Food for thought....

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Issues with plugin latency and oversampling

      @Bicrome This is your best friend here:
      https://docs.hise.dev/scripting/scripting-api/engine/index.html#setlatencysamples

      There is Engine.setLatnecySamples() and there is also a Engine.getLatencySamples(). Setting the latency will report the latency introduced by your plugin to the host so it can correct the output to align correctly.

      You probably know this already but you can test the latency introduced by your plugin in HISE (Tools>Check Latency of signal chain).

      I presume these come from JUCE's AudioProcessor class, and it explicitly says "The processor should call this as soon as it can during initialisation, and can call it later if the value changes.":
      https://docs.juce.com/master/classAudioProcessor.html#ac902e27eb0950adac57bb69680b6e709

      I.e. you want to call this early in your script, and yes, you can change the latency set by your plugin. I've experimented with this in Ableton and Logic and it worked properly for me. It probably depends on the host's ability to detect that type of change, so I imagine a host like FL Studio is going to miss this (though I could be mistaken).

      So in your case, some pseudo code would be:

      if (btnOversample == 0) // oversample is off
           Engine.setLatencySamples(0);
      else (btnOversample == 1) // oversamples is on
           Engine.setLatencySamples(11);
      
      
      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: FX plugin Dev needed

      @d-healey It's also a pain to deal with them. I've been waiting a month and a half for a confirmation on my application and they have virtually no customer service.

      On the other hand, assuming your credentials are right (and I presume) your documents are in English, you may have an easier time setting it up.

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: FX plugin Dev needed

      @dezertaudio sent you a dm, check your messages :)

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Has anyone used CSS to create a Combobox UI?

      @CatABC Looks like there are a few examples in the docs already?

      Link Preview Image
      HISE | UI Components | ComboBox

      A ComboBox to select different items from an indexed `items` list

      favicon

      (docs.hise.dev)

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: FFT Analyser Settings...

      @DanH do you recall what edits to the source code you made to get these properties to stick? I feel like it should be included in the xml data of the Scriptnode Network.

      I'd propose a bump on this topic as it has really tripped me up recently. I'm finally solving the issues related to my FFT and this was one of them.

      posted in Bug Reports
      HISEnbergH
      HISEnberg
    • RE: Choose Sampler 2025 " sample import VST "

      @tsempire this was the tutorial I used to get started. Once you get the hang of it you will find it is quite simple to create the installers.

      Link Preview Image
      Package your app or plugin for distribution - JUCE

      Tutorial: Package your app or plugin for distribution Learn how to prepare your audio application or plugin for distribution on various marketplaces. Create installers for all plugin types on different OS platforms. LEVEL: Advanced PLATFORMS: Windows, macOS Plugin Format: VST, VST3, AU, AUv3, RTAS, AAX Introduction So you just finished implementing the perfect plugin, bug-free [โ€ฆ]

      favicon

      JUCE (juce.com)

      Personally once I figured it out I saved a template with all the code signing/notarization in order to expedite the process

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Limiter, (dynamics or scriptnode) causes delay when rendering audio

      @BWSounds This was my go to alternative for a while (if you have Faust enabled):
      https://faustlibraries.grame.fr/libs/compressors/#colimiter_1176_r4_stereo

      posted in General Questions
      HISEnbergH
      HISEnberg
    • RE: Flex Envelope - No UI control for Hold

      Here is a LAF I was working on for anyone who is interested. It would be nice to be able change the square handles for controlling the lengths, but otherwise this new FLEX Envelope is quite sexy. ๐Ÿ’ช ๐Ÿ˜ฐ ๐Ÿ‹

      flexsex.gif

      HiseSnippet 3363.3oc2arriabbbnjFEy0OfsShkSN0fHFgxZEEI2m1BFh6KJsN6CJwUR1XAgbuyzjryNbZlYFpcWKH.cJWctjDja4CHGxmfAxgjiw.9ZB7kb1F4GPoptmG8vkuVFoH4PIsKmpqp5pptd0cOplmvh46K7LxLydmzkYj40LqehaP60ZS4tFattQlrlUcXGuEsowpmzk56yrMxj472DGNS1KXH+7c2XUpC00hk.xv3dBtEaKdGdPBzZU9EbGmpTa1d7NZXOekMsDtqIbD8.Q47lEM5RsNj1hsCEQ6blF2h521Hy6aVjcvA1MOXtOfUtToxevBEWXoCJCfliYQK2bo4KUboEVp7G.B4E2vlGH7pGPCX9FYtvpB6Sp2VbjqZBtG2mefCCenjQcXlUfqJbrQUDgZrVaticsHajugQFyZIVryqrX+Hys417X3IVt2TN.IgBcCXlykV7NeJwqjt3UTS7FfHkQSjtfRjdKy5Vd7tAIifxyqZtoa.yqIEVmzEEEtFm6OcIy0D.FtAE5POjU0CdHlh7KVr3rj4KV7xWelYf0J+.xCodjlAO.cOHeDIhzVrf0Dc5JbgGxmKb7b.UID4Pa9flooxxiA1gsDVTmsDhCWw0tJi4jGmLWvEvGbGXDjSqbq0qemaQcscXdy7nryj8ZWirJ3qzxSzy0lbDOnMokG2dlrQyRAOVKtOnFU64ZEvEt4yY6QORxr119dITmaVRyHbZMKQbvu7xyj8Qyjk.eZUvmEbSOpMGD2pfSb98Kdb0pkn3elkTT82zP.FTfBJ19y0.3L0wm0.TnP10D3wcXVA4ivBG5w3Oj5TMJnHGcMxbj5AdhCY9DPmAMSI.Dj5IWEq1ywAY3nUvC.l3tE8DlW9.udrHQUS+UAn4Kd7bvmUVoZ0D0AmObJjpSW3KJ0G+1JfxMKY4BEGEGWXgyLGmezbrZ0yLGKOJNp9kegiZyCXmAlV5zLk4ZqrywCf+.W1uY5EXDrLLCxXBYJ7BfPFctueoFjqjFxbMHuOoXgEuNYDNtKTTYaRKq6Wrwr8y9YCYy.9T73hEaJ+L.1DKwC1yeDVrzwAq0y6gLRWAGrIskg89jI2wWRcMj3Q45iVX4LTm+4LvBu70Sf2l5zLDbBJWiTtuUzgD6j1ib9462iDMEa33v65yxuOZDrhEXvJRtZxzeUxbJyjFFkNMFCbwJQvuBYwYS+n15xo8JGUluEWb0UibfFlTOZId1Q3YA4QWYoUVasAw+qLR9qOJtTzXJr1iQtSrfZeswYOWzyOYAx5jVbPWYtqKyKzWdtq2G7aALDfmfShOdZUY4kqJ+bFLqwSvf0Esgimdsu1HcBgMcs4Oja2i5P7Ys5f4J8.OWlG2skp7OEhxgbF9XmU.ar4VTLrexyZTWw2wkxviY2yhYi4r.K29wU6ktnKqU9uT+.JipcoES0gfDRiTKZ7lDU2ARE5xJfOJIpYzYWFZxVM4VG2gw2kVZP7c.k8z3apRoOV8KFTEXLpPoEldU3wo5dR3yw0snkegGjLnM2mzEqgB+dkMmb2gHlMN+gNTuCiCvJM+fKhngTRDlr.TOv9bZjtBYaPiK3ycyugKTiggMXe2tAv1mxeYnR+x3ONEeBilS3Y+Ur.azt8.UlzxQbDzPNj1eJKkgrZUmdLImFZJAYpoccwkQUNgDw7pj4Ca.PCmRC.mAWaKVEkgXodb701.YeaX6ZI8UyTB8DW46T5U5z1mRkN6095aFtxnmgyR0uoV107O0+diSYak9EhdANfe6TVV7YtPhMjuvojz6iM0SrDdLRadq1Nv+BRhoP3CnvIBNLRKFigU1rZ0wV17TpZD+GhplLbzrm7s9JZtE8.1YX+h6wNd7MLSsswRteDobQMaR.P5fqH1W0uhEwHbES5uVYL3R3gNLWwFWmLgejBR7pJpGZKFUE3QRrhGm5.ZWoxW95StS4JfKgKyF4nrNDpmyFqsyRx4gtL4zL6gG8Ax6SctFQKDwKP6.YgOhQbYLaRf.VFgterBfZVLBL6sZQOvA9F2uKjpFQnWWar6Fb7CcEG3SfZcRFgP7kGnCt3b2MK.MLQDdP+QHY1Bhu.lnetiComOiPIG3In1VTzY.nkFHYBHIzf.pUajFJfahL.EPocX.1pCjnO4.bAfPdexQsYtHvSjrCVXIVvl2ZwrKf5axIAs1taWa2c1Xm8pC9KfyU1Uvo8vOj.V9AefRJDxcYHAZ1aIbrATGJt33JLWmYQOYTnJQPga8dPmib2QHCgXnP+NLGF0mMBzCwPSRjaK8CIiTXj3nnQoyQDMJ6hFQgyZHUiTxN0TsE6gLmwLURbxA4Ddbe9vGzi6XK8HbfbLDQSceFveBO3QnuL3aHNZ9e5NF0V4Nqr8F6swcPGi8anBnDd46BTp40.Se1DTKzsme67ciCpjc7A+cDyC5XupVHvGQB6xRcfjZCkGcO4f+VNLvc8zzkCscTuV9eHYeRNNdRh4h0Z7AYbQtF54jCiv3AjPSQGgcuzQXfsCGPdVoLWvdK5B0Q6SlKnXzdhskzWKh774pt0FeBL4IFHPPPhCOHEOY1pPgIcrrUzpcT.MjdIVtBikKPtOKZwTRzGWe2cTIgfDjX1K4twRyNOVSFrcMK77L8UKPgHCqtP5HHepGERCRCH9m3FPON6.zWa6svpWv9Cym3J.5VnBb2MU4D0qfwsgdCmUoMp5XYwIe+tMv7y2CAmWMXbB7GOC7IhAfAXGQ.aW27WdlGIGjz+PMaNvwvXHOgiC164.FFuGDuQQXd2dcNf4EK6gHZj4Bou.AygeAB52ugkJjVCQg6lt7fc6xbG1sdXDlGvvHS1PoBPMPdUCuQ3UMT2gC0XL31FYdESUFBCoDGdIO+w+4WHpXLATeQSLscJZqb0+5uahn8GXJSclhXxW+o+9Ih3rlgoCSS92szuchH+0M0xKlhEO4i+Me6MlLIHrxRJx+rr+6u9FmEIPlNOMKB9p+0DwhWyLo1SZNboFSlP7Fl5EURwCi26u8Wtgwc2bcZ.Eu2pPuJvSqKyKfiNwYVm8PtEScKVYAgw+v.QWiLyDW9AjwfvqcSM2UcDTrWm83fytxJF14kwwwWv3SpT4jjaarPkCZEcWiYuH.3oHTXC.cRf9zm9zeZZnkCA+DDL13WJVH+bD2Nnc77T4IUZyvtBSDiCqDpzJM7MMiuRKXalcaaHMMY90lOZFBIWbH3l14fxNpr43.a5ZyNF.UT9TUH4h3n6K7NTdKY.b4AtKGK47u2S.YfvqnEFubwBJRuqOjQisNjBx0GR5fE0hHelGig8wF8YFez9w5Wmah09y5ToCMYrs9GU5vsgpOQmpRh45KpzMQiwDAnFaDW1YS8ICpUxPTjWirMqIsmiJKdhP7ypnq.YGWBGMw2VS7q7rT7CmpTB+jYkixrkHIeo2zHkFe53kxn4Z71XPFlLwOI2pVL4iddYlSlsmgpP576Zpw8zSs3MdoKMiTR36XtivqC0A14tcMlmEHKzVLC+dMaxOFKK+dFCaA8atwfc++taLoKMQEcRzIxQmQcJgIO2zmu4Fms0IU8mgjT5I8l70IEidgqWoJMOjz.ShZkhOuv0p9ZWXHYGlD8pON87TyN8KbyaZJ27EdQC5u+O3aIU3.Hu0eoavWrFnnavI5QrOydoflTQ7sLqwCrZOXY7bCPFg91ddHiguJUut4FMaBaFLQ.ufY0O44y6Mk9zeI0z+pl2m9Pl78eSN4+X4yvFS6PtItaSz1UZDuFb+8I80fq6D+ZvsqU.HB6Act42U3yJoy45rN78fHL+TP6ihxCjhTPWmEzyMl0Ulate3Wp.kBKzTTELEZS1qTIBXYcf0ntZH8oeI7bY8FP1lerd3zFt3AKVmAZt8t9VfgAsy5gE0vK049Xu0kzILAbYcv2h5YCqgVobZO+ndY.KMkuLfW7ktWFvuGjZJ06qX1HYrNuSWG1FgmwkTFeanPkLAbDzzgdaKbEcaKb4oVnuCKvi2pEKk+y.UnvMRjhVUSiQft8etxVbWF0aaYsjoxVT5L+taNv0q2MrWDBluf782RJm++qKoLHW621rlv4DkiZUtCzrRzaUs7gQUNwvnpG6W0i4ZEYsp7sUVnxsiNQs+vm+ZUR6Z9tUtcOnYmzV2U4cENTu+a8NFim7ElP2i2wLVodY2OFWMd4VF+IlgKtDznRdwmO+shZjJ9bsjxYX+5SY56PcbnpRpL4xyYVdJKZmcr57LzNO3ncqpcBqoy9KO129y6quucsi1UeahZm2p11rzNC0TaRQ6bQelEINo9Nug4se414F6X53WtEwKYBMrVlHK3QdwTw6Nhd3oeuMEBbf1pM2oWm5vtGrXfT55xbvaFJy4v6vQ8bQ7Y0dAbskO7T3S3fkvmyDNXonA+exbzgZ4Idfk5BFvzJuhDBn2tx+K.k0ba7YRozWo.9A1AO+AVVoY0oHr7zR3bSKgyOsDtvzR3hSKgKMsDt73ID22yJ8BDcTwFFFaWaC08bjQs0OYXhw+APh6k1o
      
      const var ft_Flex = Content.getComponent("ft_Flex");
      const var laf_flex = Content.createLocalLookAndFeel();
      	
      	// Background 
      	laf_flex.registerFunction("drawFlexAhdsrBackground", function(g, obj)
      	{
      	    g.setGradientFill([0xFF1a1a1a, 0, 0, 0xFF1a1a1a, 0, obj.area[3], false]);
      	    g.fillRect(obj.area);
      	});
      	
      	// Path w/ 3 Strokes and gradient fill
      	laf_flex.registerFunction("drawFlexAhdsrFullPath", function(g, obj)
      	{
      	    g.beginLayer(true);
      	    
      	    g.setColour(0x3333AAFF);
      	    g.drawPath(obj.path, obj.pathArea, 8.0);
      	    
      	    g.setColour(0x5533AAFF);
      	    g.drawPath(obj.path, obj.pathArea, 4.0);
      	    
      	    g.setColour(0xFF33AAFF);
      	    g.drawPath(obj.path, obj.pathArea, 2.0);
      	    
      	    g.setColour(Colours.white);
      	    g.drawPath(obj.path, obj.pathArea, 1.0);
      	    
      	    g.endLayer();
      	    
          	// Gradient fill
      	    var fadeStart = obj.pathArea[1] + obj.pathArea[3] * 0.6; 
      	    g.setGradientFill([0x5033AAFF, obj.pathArea[0], obj.pathArea[1], 
      	                       0x00ffffff, obj.pathArea[0], fadeStart, false]);
      	    g.fillPath(obj.path, obj.pathArea);
      	});
      	
      	// Curve point handles 
      	laf_flex.registerFunction("drawFlexAhdsrCurvePoint", function(g, obj)
      	{
      	    var pointSize = 8;
      	    var halfSize = pointSize / 2;
      	    
      	    g.beginLayer(true);
      	    g.setColour(0x4433AAFF);
      	    g.fillEllipse([obj.curvePoint[0] - halfSize - 3, obj.curvePoint[1] - halfSize - 3, 
      	                   pointSize + 6, pointSize + 6]);
      	    g.endLayer();
      	    
      	    g.setGradientFill([0xFF66BBFF, obj.curvePoint[0] - halfSize, obj.curvePoint[1] - halfSize,
      	                       0xFF1A7ACC, obj.curvePoint[0] + halfSize, obj.curvePoint[1] + halfSize, true]);
      	    g.fillEllipse([obj.curvePoint[0] - halfSize, obj.curvePoint[1] - halfSize, pointSize, pointSize]);
      	    
      	    g.setColour(0xFF33AAFF);
      	    g.drawEllipse([obj.curvePoint[0] - halfSize, obj.curvePoint[1] - halfSize, pointSize, pointSize], 1);
      	    
      	    var innerSize = 3;
      	    var innerHalf = innerSize / 2;
      	    g.setColour(0x88FFFFFF);
      	    g.fillEllipse([obj.curvePoint[0] - innerHalf, obj.curvePoint[1] - innerHalf, innerSize, innerSize]);
      	});
      	
      	// Individual segment rendering with active state indication
      	laf_flex.registerFunction("drawFlexAhdsrSegment", function(g, obj)
      	{
      	    var reducedArea = [obj.area[0] + 8, obj.area[1] + 8, obj.area[2] - 16, obj.area[3] - 16];
      	    
      	    if (obj.active)
      	    {
      	        g.setColour(0x4433AAFF);
      	        g.fillPath(obj.path, reducedArea);
      	        
      	        g.setColour(0x7733AAFF);
      	        g.drawPath(obj.path, reducedArea, 2.0);
      	    }
      	    else
      	    {
      	        g.setColour(0x1533AAFF);
      	        g.fillPath(obj.path, reducedArea);
      	    }
      	});
      	
      	// Position indicator, this part is AI
      	laf_flex.registerFunction("drawFlexAhdsrPosition", function(g, obj)
      	{
      	    var markerSize = 14;
      	    var halfSize = markerSize / 2;
      	    var pulseSize = markerSize + Math.sin(Engine.getUptime() * 8) * 2;
      	    var pulseHalf = pulseSize / 2;
      	    
      	    // Outer glow layer
      	    g.beginLayer(true);
      	    g.setColour(0x4433AAFF); // Blue glow
      	    g.fillEllipse([obj.pointOnPath[0] - pulseHalf - 4, obj.pointOnPath[1] - pulseHalf - 4, 
      	                   pulseSize + 8, pulseSize + 8]);
      	    g.endLayer();
      	    
      	    // Main gradient ellipse
      	    g.setGradientFill([0xFF66BBFF, obj.pointOnPath[0] - halfSize, obj.pointOnPath[1] - halfSize,
      	                       0xFF1A7ACC, obj.pointOnPath[0] + halfSize, obj.pointOnPath[1] + halfSize, true]);
      	    g.fillEllipse([obj.pointOnPath[0] - halfSize, obj.pointOnPath[1] - halfSize, markerSize, markerSize]);
      	    
      	    // Blue outline
      	    g.setColour(0xFF33AAFF);
      	    g.drawEllipse([obj.pointOnPath[0] - halfSize, obj.pointOnPath[1] - halfSize, markerSize, markerSize], 1.5);
      	    
      	    // White core highlight
      	    var coreSize = 3;
      	    var coreHalf = coreSize / 2;
      	    g.setColour(0xFFFFFFFF);
      	    g.fillEllipse([obj.pointOnPath[0] - coreHalf, obj.pointOnPath[1] - coreHalf, coreSize, coreSize]);
      	});
      	
      	// Label
      	laf_flex.registerFunction("drawFlexAhdsrText", function(g, obj)
      	{
      	    var padding = 20;
      	    var textArea = [obj.area[0] + obj.area[2] - 100 - padding, obj.area[1] + padding, 100, 30];                                        
      	   
      	    // Text
      	    g.setFont("Arial", 12);
      	    g.setColour(0xFF33AAFF);
      	    g.drawAlignedText(obj.text, textArea, "right");
      	});
      	
      	ft_Flex.setLocalLookAndFeel(laf_flex);
      
      posted in General Questions
      HISEnbergH
      HISEnberg