Forum
    • Categories
    • Register
    • Login

    MAJOR UPDATE // NEW: Online KNOB BUILDER for HISE!! // Factory/User Preset System

    Scheduled Pinned Locked Moved Scripting
    lafknobsknob designerscalable knobonline editor
    96 Posts 17 Posters 21.3k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • David HealeyD
      David Healey @Oli Ullmann
      last edited by

      @Oli-Ullmann said in NEW: Online Knob Builder for HISE!! by Me :):

      But I’m sure Sir @David-Healey also has a good idea for how to fake shadows... :-)

      I use the built in drop shadow, I haven't hit any issues 😕 but maybe you guys are using more than I am.

      Free HISE Bootcamp Full Course for beginners.
      YouTube Channel - HISE tutorials
      My Patreon - More HISE tutorials

      Oli UllmannO 1 Reply Last reply Reply Quote 0
      • Oli UllmannO
        Oli Ullmann @David Healey
        last edited by

        @David-Healey
        Oh, okay, yeah, I had a pretty big project (the one I sent you a while back) with a lot of UI elements, and I had to fake the shadows because otherwise it was causing performance issues...

        1 Reply Last reply Reply Quote 0
        • ChazroxC
          Chazrox @Oli Ullmann
          last edited by

          @Oli-Ullmann

          Screenshot 2026-06-25 at 4.05.57 AM.png

              // -- DROP SHADOWS --
              g.drawDropShadow([ox + stableSize * (1 - 0.45) / 2, oy + stableSize * 0.4 - stableSize * 0.35 / 2, stableSize * 0.45, stableSize * 0.35], cShadowsHighlight, stableSize * 0.35);
              g.drawDropShadow([ox + stableSize * (1 - 0.5) / 2, oy + stableSize * 0.65 - stableSize * 0.45 / 2, stableSize * 0.5, stableSize * 0.45], cShadowsShadow, stableSize * 0.35);
              g.drawDropShadow([ox + stableSize * (1 - 0.5) / 2, oy + stableSize * 0.65 - stableSize * 0.45 / 2 + 4, stableSize * 0.5, stableSize * 0.45 + 10], cShadowsShadowSoft, stableSize * 0.35);
          
          

          Works great with shadows and highlights.

          Oli UllmannO 1 Reply Last reply Reply Quote 0
          • Oli UllmannO
            Oli Ullmann @Chazrox
            last edited by

            @Chazrox
            Yeah, it works great in general! :-) I just had some issues with it, as I mentioned, when I had a lot of UI elements...

            ChazroxC 1 Reply Last reply Reply Quote 0
            • ChazroxC
              Chazrox @Oli Ullmann
              last edited by Chazrox

              @Oli-Ullmann ahh I see. We'll see how this works out. There possibly could be a limit. Probably has to do with the modulation repaints.

              1 Reply Last reply Reply Quote 1
              • ChazroxC
                Chazrox
                last edited by Chazrox

                Just updated the app to include 'Noise' parameter for all face layer elements WITH rotation. :)

                https://rox-knob-builder-for-hise.netlify.app/

                KnobDesignerNoiseWIthRotationUpdate.gif

                David HealeyD 1 Reply Last reply Reply Quote 0
                • David HealeyD
                  David Healey @Chazrox
                  last edited by

                  @Chazrox How are you drawing circular noise?

                  Free HISE Bootcamp Full Course for beginners.
                  YouTube Channel - HISE tutorials
                  My Patreon - More HISE tutorials

                  ChazroxC 1 Reply Last reply Reply Quote 0
                  • ChazroxC
                    Chazrox @David Healey
                    last edited by

                    @David-Healey multiple layers. Theres a 'cap' in front of the ellipse that has noise applied to it.

                    David HealeyD 1 Reply Last reply Reply Quote 0
                    • David HealeyD
                      David Healey @Chazrox
                      last edited by

                      @Chazrox This will probably be useful to you when Christoph merges it: https://github.com/christophhart/HISE/pull/936

                      And maybe this one: https://github.com/christophhart/HISE/pull/943

                      Free HISE Bootcamp Full Course for beginners.
                      YouTube Channel - HISE tutorials
                      My Patreon - More HISE tutorials

                      ChazroxC 1 Reply Last reply Reply Quote 1
                      • ChazroxC
                        Chazrox @David Healey
                        last edited by

                        @David-Healey Niiice! 🕶 I can definitely think of some cool ways to use that already..

                        1 Reply Last reply Reply Quote 0
                        • ChazroxC
                          Chazrox
                          last edited by Chazrox

                          Update:

                          https://rox-knob-builder-for-hise.netlify.app/

                          Just added the option to inherit 'obj.text' for 'Component Label' element. You can still set a text for mockup and placement in the designer ui but ticking the box will inherit obj.text on compile.

                          Screenshot 2026-06-25 at 5.14.03 AM.png

                          ILIAMI 1 Reply Last reply Reply Quote 2
                          • ILIAMI
                            ILIAM @Chazrox
                            last edited by

                            @Chazrox Thank you so muhc man, This is amazing,
                            any chance we could have this Offline?

                            ChazroxC 1 Reply Last reply Reply Quote 1
                            • ChazroxC
                              Chazrox @ILIAM
                              last edited by

                              @ILIAM Possibly soon. 🙏 How are you liking the web version?

                              1 Reply Last reply Reply Quote 0
                              • T
                                thewind433
                                last edited by

                                @Chazrox said in NEW: Online Knob Builder for HISE!! by Me :):

                                https://rox-knob-builder-for-hise.netlify.app/

                                THANKS BROTHA

                                1 Reply Last reply Reply Quote 1
                                • C
                                  ccbl
                                  last edited by

                                  Is it possible to do sliders? Or is that a future feature maybe?

                                  ChazroxC 1 Reply Last reply Reply Quote 0
                                  • ChazroxC
                                    Chazrox @ccbl
                                    last edited by

                                    @ccbl Working on it. 👍

                                    1 Reply Last reply Reply Quote 1
                                    • A
                                      Anhuarcin @Chazrox
                                      last edited by

                                      @Chazrox

                                      I loved it! Are you planning to add a button creator as well?
                                      MadeWithRoxKNFH_snapshot.png

                                      const var MadeWithRoxKNFH = Content.createLocalLookAndFeel();
                                      
                                      MadeWithRoxKNFH.registerFunction("drawRotarySlider", function(g, obj)
                                      {
                                          var a = obj.area;
                                          var range = obj.max - obj.min;
                                          var stableSize = a[2] * (1.0 - 2.0 * 0.15);
                                          var ox = a[0] + (a[2] - stableSize) / 2;
                                          var oy = a[1] + (a[2] - stableSize) / 2;
                                          var cx = ox + stableSize / 2;
                                          var cy = oy + stableSize / 2;
                                          var sw = stableSize / 200.0;
                                          var startOffset = 2.5;
                                          var totalSweep = 2.0 * startOffset;
                                          var endOffset = -startOffset + totalSweep * (obj.value - obj.min) / range;
                                      
                                          // ============ COLOUR CONTROL ============
                                          // -- Skirt --
                                          var cSkirtFlat = 0xff121212;
                                          var cSkirtHover = 0xffFFFFFF;
                                          // -- Arc Track --
                                          var cArcTrackOuter = 0x00000000;
                                          var cArcTrackBackground = 0xff000000;
                                          // -- Arc Value Basic --
                                          var cArcBasicGlow = 0x4d007BFF;
                                          var cArcBasicLow = 0xff004FA3;
                                          var cArcBasicHigh = 0xff2D61C8;
                                          // -- Body 1 --
                                          var cFace1Top = 0xff555558;
                                          var cFace1Bot = 0xff2A2A2E;
                                          var cFace1Hover = 0xffFFFFFF;
                                          var cFace1Outline = 0x4d000000;
                                      
                                          // -- skirt --
                                          var skirtR = stableSize * 0.49;
                                          var skirtcx = cx + 0 * sw;
                                          var skirtcy = cy + 0 * sw;
                                          g.setColour(cSkirtFlat);
                                          g.fillEllipse([skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2]);
                                          g.beginLayer(false);
                                          g.setColour(cSkirtFlat);
                                          g.fillEllipse([skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2]);
                                          var skirtnp = Content.createPath();
                                          skirtnp.addRoundedRectangle([skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2], skirtR);
                                          g.applyMask(skirtnp, [skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2], false);
                                          g.rotate(endOffset, [skirtcx, skirtcy]);
                                          g.addNoise({"alpha": 0.03, "monochromatic": false, "area": [skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2]});
                                          g.rotate(-endOffset, [skirtcx, skirtcy]);
                                          g.endLayer();
                                          if (obj.hover || obj.clicked) {
                                              g.setColour(Colours.withAlpha(cSkirtHover, 0.03));
                                              g.fillEllipse([skirtcx - skirtR, skirtcy - skirtR, skirtR * 2, skirtR * 2]);
                                          }
                                      
                                          // -- ARC TRACK --
                                          var trkW = 0.45 * 2;
                                          var Ktrk = Content.createPath();
                                          Ktrk.addArc([(1.0-trkW)/2, (1.0-trkW)/2, trkW, trkW], -startOffset, startOffset);
                                          var arTrk = Ktrk.getBounds(stableSize); arTrk[0]+=ox; arTrk[1]+=oy + stableSize * 0;
                                          g.setColour(cArcTrackOuter);
                                          g.drawPath(Ktrk, arTrk, {Thickness: stableSize * 0.08 + 0 * sw, EndCapStyle: "rounded", JointStyle: "curved"});
                                          g.setColour(cArcTrackBackground);
                                          g.drawPath(Ktrk, arTrk, {Thickness: stableSize * 0.08, EndCapStyle: "rounded", JointStyle: "curved"});
                                      
                                          // -- ARC BASIC (gradient) --
                                          var basW = 0.45 * 2;
                                          var basR = stableSize * 0.45;
                                          var Kbas = Content.createPath();
                                          Kbas.addArc([(1.0-basW)/2, (1.0-basW)/2, basW, basW], -startOffset, endOffset);
                                          var arBas = Kbas.getBounds(stableSize); arBas[0]+=ox; arBas[1]+=oy + stableSize * 0;
                                          var basGlowW = stableSize * 0.08 + stableSize * 0.08 * 20 / 10;
                                          g.setColour(cArcBasicGlow);
                                          g.drawPath(Kbas, arBas, {Thickness: basGlowW, EndCapStyle: "rounded", JointStyle: "curved"});
                                          var gx1 = cx + basR * Math.sin(-startOffset);
                                          var gy1 = cy - basR * Math.cos(-startOffset) + stableSize * 0;
                                          var gx2 = cx + basR * Math.sin(startOffset);
                                          var gy2 = cy - basR * Math.cos(startOffset) + stableSize * 0;
                                          g.setGradientFill([cArcBasicLow, gx1, gy1, cArcBasicHigh, gx2, gy2, false]);
                                          g.drawPath(Kbas, arBas, {Thickness: stableSize * 0.08, EndCapStyle: "rounded", JointStyle: "curved"});
                                      
                                          // -- face1 --
                                          var face1R = stableSize * 0.41;
                                          var face1cx = cx + 0 * sw;
                                          var face1cy = cy + 0 * sw;
                                          g.setGradientFill([cFace1Top, face1cx, face1cy - face1R + (2 * face1R * (0.5 - 0.5)), cFace1Bot, face1cx, face1cy + face1R + (2 * face1R * (0.5 - 0.5)), false]);
                                          g.fillEllipse([face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2]);
                                          g.beginLayer(false);
                                          g.setGradientFill([cFace1Top, face1cx, face1cy - face1R + (2 * face1R * (0.5 - 0.5)), cFace1Bot, face1cx, face1cy + face1R + (2 * face1R * (0.5 - 0.5)), false]);
                                          g.fillEllipse([face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2]);
                                          var face1np = Content.createPath();
                                          face1np.addRoundedRectangle([face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2], face1R);
                                          g.applyMask(face1np, [face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2], false);
                                          g.rotate(endOffset, [face1cx, face1cy]);
                                          g.addNoise({"alpha": 0.04, "monochromatic": false, "area": [face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2]});
                                          g.rotate(-endOffset, [face1cx, face1cy]);
                                          g.endLayer();
                                          if (obj.hover || obj.clicked) {
                                              g.setColour(Colours.withAlpha(cFace1Hover, 0.07));
                                              g.fillEllipse([face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2]);
                                          }
                                          g.setColour(cFace1Outline);
                                          g.drawEllipse([face1cx - face1R, face1cy - face1R, face1R * 2, face1R * 2], 1);
                                      
                                      });
                                      
                                      ChazroxC 1 Reply Last reply Reply Quote 1
                                      • ChazroxC
                                        Chazrox @Anhuarcin
                                        last edited by

                                        @Anhuarcin said in NEW: Online Knob Builder for HISE!! by Me :):

                                        button creator

                                        Glad you love it! Most definitely working buttons also. I'll let everyone know when thats done. 👍 Thanks for giving it a go! 🙏

                                        1 Reply Last reply Reply Quote 2
                                        • ChazroxC
                                          Chazrox
                                          last edited by

                                          Pointer Grips?

                                          Screenshot 2026-06-26 at 4.50.51 PM.png

                                          1 Reply Last reply Reply Quote 1
                                          • ChazroxC
                                            Chazrox
                                            last edited by Chazrox

                                            I just pushed a couple of really cool updates!

                                            Updates:

                                            'Star Body' Layer Elements x 3

                                            Screenshot 2026-06-26 at 7.41.04 PM.png

                                            Fully Customizable Star knob shapes:
                                            Screenshot 2026-06-26 at 7.43.38 PM.png

                                            Examples in HISE:
                                            Screenshot 2026-06-26 at 7.46.21 PM.png
                                            Screenshot 2026-06-26 at 8.00.08 PM.png

                                            'Pointer Grip' Layer Element
                                            Screenshot 2026-06-26 at 7.41.21 PM.png

                                            Pointer grip parameters:
                                            Screenshot 2026-06-26 at 7.41.56 PM.png

                                            Examples in HISE:
                                            Screenshot 2026-06-26 at 4.50.51 PM.png
                                            Screenshot 2026-06-26 at 4.46.15 PM.png

                                            Enjoy!

                                            Here's the link again:
                                            https://rox-knob-builder-for-hise.netlify.app/

                                            1 Reply Last reply Reply Quote 2
                                            • First post
                                              Last post

                                            16

                                            Online

                                            2.4k

                                            Users

                                            13.9k

                                            Topics

                                            120.6k

                                            Posts