Forum
    • Categories
    • Register
    • Login
    1. Home
    2. dannytaurus
    • Profile
    • Following 4
    • Followers 1
    • Topics 106
    • Posts 1,136
    • Groups 0

    dannytaurus

    @dannytaurus

    495
    Reputation
    194
    Profile views
    1.1k
    Posts
    1
    Followers
    4
    Following
    Joined
    Last Online
    Website meatbeats.com
    Location Los Angeles

    dannytaurus Unfollow Follow

    Best posts made by dannytaurus

    • Happy New Year! πŸ₯³ πŸŽ‰

      Just wanted to wish everyone a happy, productive and prosperous new year!

      posted in General Questions
      dannytaurusD
      dannytaurus
    • AI is the future

      Until you spend hours debugging an inaudible filter node because Claude set the smoothing to 20 seconds instead of 20ms! πŸ˜‚

      posted in AI discussion
      dannytaurusD
      dannytaurus
    • Goals for 2026? πŸš€

      Anyone care to share their overall plans and goals for the coming year? πŸš€

      My main goal is to start releasing HISE plugins. I've been learning HISE for a while and it's time to start exporting my efforts!

      1. A series of 4 free synth plugins, first one Sublime posted here for design feedback, and another 3, each based around one simple preset concept. Sublime is all about bass.

      2. Then I have 2 collaborations I want to work on, both with UK house music producers. One is a multi-output drum plugin based on a series of expansions, the other is a chord synth with some interesting features.

      3. I also have a lot of vintage reverb impulses recorded and processed, which I'd like to turn into a suite of free reverbs.

      My user base is mostly house music producers & related genres - rave, techno, classic house, etc. I've built a decent brand and I think my customers will love the move from Maize-based ROMpler plugins to way more fully-featured HISE-based plugins.

      What are your goals?

      posted in General Questions
      dannytaurusD
      dannytaurus
    • [PR] Overlay image toggle button

      I like using overlay images to ensure my Figma design is translated properly to HISE. Currently, the only way I know to toggle the image visibility is to select/unselect the image, or quickly slide the alpha slider, which is difficult because of the 'invert' half of the slider.

      This PR adds a toggle button between the image dropdown and the alpha slider. It uses an existing image icon for the button and respects the alpha slider value.

      This allows me to toggle the image without taking my eyes off the interface, making it easier to spot changes.

      PR here: https://github.com/christophhart/HISE/pull/825

      HISE-Overlay-Image-Toggle.gif

      posted in General Questions
      dannytaurusD
      dannytaurus
    • RE: Look & Feel - ComboBox Background.

      @David-Healey I just had a go at fixing this. Is that what you mean?

      HISE-PopupTransparentBackground.gif

      HiseSnippet 1112.3ocsVs2aaaCDmJIJKwacqEne.H7e4roYH+pIcACMO8pwxCi4rhMDDTPKcxhKRjFRTMwXneH12z8MH6ndXKO6klZfI.av6Eue2wi2w9QRGHNVFQLpb0jw.w3qLGLQn7O1mwEjdmPL9ZyyYwJHhlw5nIiYwwfKwvX8eRyvX6MHoe+8aNhEvDNvLVDx6jbG3LdHWMia+C9YdPPWlKbEOrj1sOnmiTbrLPlf3YcSaxXlysrQvELsZqYRdKK1mX7sl1scX60zqSqVu9061wcH330.FtqCytCyqCC41l0tSi1DiMO0kqjQCTLEDia5QR2IC7k2Ixbv63w7gAflnAY.54L1ji84At8KRNwDhwF8mkpVOKU8Ryy4t7o7mkxddp.5LKJmzLV6wfTiOCHYTBRajAoWXNvIhOVMShFOeoYOAdB5wvylxPISWxZ+05lGKQMDp5gragtQHwTKp0z11hh+sy9UpfmOwJZ.yi9izBSbh.LRNS5vBNSJu8PgaW.BpoUGUrdDLhqqe5lHbTbonVU2H1c8kiSFeNHRNBOhGEISDtUsndE5LxhJG9G6T4OqPwuQ0iAUVcQsp12am+UEcQlXOrd5W.GUsqssrsz.F+cCJ9iOQTzSAg+29+CrHJCiXjUcFFs3dVvdLy8PjCJ7Z1012P+NZSKJ65FSW07F52SaqW0Jc0M6uPHo2Vd7a4i7CveJvk9FZln35ih.PP+gozCCRf4CacpCb0QOSLJ.pkiHK5d6TBmJ3dUAPy0HCt6YUDCHnmsNE1Md0LFstYIHu.U24yUyfEJuKVaTq5IfGKIPgI1FsqaOUtNyeHFpBv8JDVowuFeVSQoEsZ.3opVbBlU1crLbn7H48MJU7MRikvwRAnc3TMzVNkPCnEJOwhhc1u37lJEWHUvkhZ5i7sq7wJz+sHOukJSiiHYP.DsTw5FbQOlg0DIgCgHK7PRexVnHdgd9tDa9z5R3jkVJonTzSvUWNFxo6JCb0290qWrmBIOup6tjiPTUUZukmm2aoHuR3t5VKSSyjzPnbyexu16DlhUrY39h9ZLDo35Px3D3C3vgrFWaadBDeqRNF6yO8.kXrUlqeVQaMl.BR86VloqaPturCmTl.KICKFlr8lDxCOLO2lkYeG2U4OyZ9A9f9tXYNjR35KdhoDDclFMyPlowKwEgrTdqunO+8CzXCSLei4kBnxU2IqbkOd8GGXtPedbBizMIfoleridfbt.rJatd8594hXtZR4A1eFyhrezYQOUH9By9bki+xw3ZKAiXsy+GXLeB9yLO0yC6bNCfaX182V0w0eB2icpUbwnyYpHttF3hjvAXYnCfdWf0xw55h0z2Ayns0z5Lv.P3lR7.9kKrgl1HWXiBgX0kSj78NY2b0uQXqTNHlDougZa7wbHMcIWVCwmr7dGm42pELr4pZXqU0v1qpgcVUCe0pZ3tqpg68oMT+hxCSTxvrqMDx48OMs4pgwoBFVAlVsR9GztgJYG
      
      Content.makeFrontInterface(200, 200);
      
      const laf = Content.createLocalLookAndFeel();
      
      laf.registerFunction("drawPopupMenuBackground", function(g, obj)
      {
          g.setColour("0x00000000"); // any transparent colour
          g.fillRect([0,0,200,200]);
      });
      
      laf.registerFunction("drawPopupMenuItem", function(g, obj)
      {
          var a = obj.area;
      
          var padArea = [a[0] + 2, a[1] + 2, a[2] - 4, a[3] - 4];
          g.setColour(obj.isHighlighted ? Colours.green : Colours.blue);
          g.fillRoundedRectangle(padArea, 8);
      
          var textArea = [padArea[0] + 8, padArea[1], padArea[2] - 16, padArea[3]];
          g.setColour(Colours.white);
          g.setFont("Default", 14.0);
          g.drawAlignedText(obj.text, textArea, "left");
      });
      
      const ComboBox1 = Content.getComponent("ComboBox1");
      ComboBox1.setLocalLookAndFeel(laf);
      

      The drawPopupMenuBackground object should probably include an area, and the popup menu items still have a subtle drop shadow. But they're both fixes for another day.

      PR here, if it's useful: https://github.com/christophhart/HISE/pull/805

      posted in General Questions
      dannytaurusD
      dannytaurus
    • RE: Turn a unit on/off

      @bendurso Today I learned that right-clicking a module in edit mode shows a different context menu to right-clicking not in edit mode. πŸ˜€

      posted in General Questions
      dannytaurusD
      dannytaurus
    • Prevent Waveform Floating Tile paths clipping at the tile bounds

      Posting this in case it helps anyone else. I just banged my head against a brick wall for too long before I realised how simple this was! πŸ˜‚

      When using a Floating Tile with content type Waveform (to display the waveform of Sine Wave Generator or Waveform Generator, for example) the default waveform path is a filled shape.

      You can override this with LAF function drawAnalyserPath and draw a line path instead of a filled path:

      laf.registerFunction("drawAnalyserPath", function(g, obj)
      {
      	g.setColour(Colours.white);
      	g.drawPath(obj.path, obj.area, 5);
      });
      

      However, this means that the path is clipped at the bounds of the floating tile, especially at wider line thicknesses:

      CleanShot 2026-01-14 at 23.30.35@2x.png

      To prevent the clipping, I fudged around with it for longer than I want to admit before I realised the answer is to simply reduce the area that the path is drawn in, by half the thickness of the path:

      laf.registerFunction("drawAnalyserPath", function(g, obj)
      {
      	g.setColour(Colours.white);
      	g.drawPath(obj.path, obj.area.reduced(2.5), 5);
      });
      

      Voila! No more clipped paths! πŸ™Œ Top row is using obj.area, bottom row is using area reduced by half line thickness:

      HISE-Unclipping-Waveform-Paths.gif

      You might want the left/right of the path to bleed out of bounds, in which case change the reduction from all-round to y-only:

      obj.area.reduced(5) πŸ‘ˆ all-round
      obj.area.reduced(0, 5) πŸ‘ˆ y-only
      

      Note: you might need to compile with HISE_USE_SCRIPT_RECTANGLE_OBJECT=1 for the reduced and other Rectangle helper functions, as per the docs: https://docs.hise.dev/scripting/scripting-api/rectangle/index.html. Not sure if it's still the same, or if it's built-in to all new builds.

      posted in Newbie League
      dannytaurusD
      dannytaurus
    • RE: Soundsync Beta: HISE Ecosystem | UPDATE: Auto-Detect + Dynamic GUI Sizing

      @David-Healey In a conversation with ChatGPT today, it said to me

      Your mockup surprised meβ€”I expected to dislike it. I don't.

      AI is getting cheekier! πŸ˜‚

      posted in General Questions
      dannytaurusD
      dannytaurus
    • State of the Independent Audio Plugin Companies PDF report

      Don't know if this has been posted before, but it's a good read from Moonbase:

      State of the Independent Audio Plugin Companies PDF
      https://moonbase.sh/reports/state-of-audio-plugin-companies-2025/

      Not too many shocking conclusions in there. Mostly what you'd expect, but good as sanity check.

      posted in General Questions
      dannytaurusD
      dannytaurus
    • RE: Where are we with Hise currently?

      @Lindon Fixing regression issues seems like it should be high(est?) priority.

      posted in General Questions
      dannytaurusD
      dannytaurus

    Latest posts made by dannytaurus

    • RE: Saving MIDI CC assignments in user presets?

      In hindsight, I think adding the HISE_MIDI_AUTOMATION_IN_PLUGIN_STATE preprocessor in the same PR as HISE_MIDI_AUTOMATION_IN_USER_PRESETS was a mistake. 🀷

      I don't think I'll ever use it, since USER_PRESETS and some simple save/load MidiMappings.json in script gets me exactly what I need.

      The PLUGIN_STATE is more complex and messes with the state of the plugin instance, which I think is Christoph's main objection.

      posted in Scripting
      dannytaurusD
      dannytaurus
    • RE: Saving MIDI CC assignments in user presets?

      @David-Healey I think maybe the HISE_MIDI_AUTOMATION_IN_USER_PRESETS preprocessor is more mergeable than the HISE_MIDI_AUTOMATION_IN_PLUGIN_STATE?

      The system might be built around a certain state that has repercussions when it changes.

      For the USER_PRESET one, on preset save the MidiAutomation state manager is skipped, so the preset file gets no MidiAutomation node at all and on preset load the MidiAutomation restore step is skipped entirely, so nothing is overwritten in the UI.

      The mappings are still persisted in the DAW session chunk and embedded plugin data.

      So maybe that change to the preset format - the missing MidiAutomation node - could cause some issues?

      posted in Scripting
      dannytaurusD
      dannytaurus
    • RE: Saving MIDI CC assignments in user presets?

      @David-Healey I have it set up like this. Works for me so far, but it's one of those things with a lot of use cases.

      The only scripting I have is to load and save the MidiMappings.json file. The preprocessor handles the rest.

      I had Claude write this (hence the em-dashes 😜), to catch all the states:

      The three persistence layers

      1. Plugin state (the DAW session) β€” per HISE default, every instance's current CC assignments are serialized into the plugin state chunk the host saves with the session. This is the day-to-day layer and it's completely automatic.
      2. User presets β€” new preprocessor HISE_MIDI_AUTOMATION_IN_USER_PRESETS=0 in project_info.xml ExtraDefinitions means presets neither store nor restore mappings. Switching or saving presets never touches CC assignments.
      3. Default map file β€” AppData/MidiMappings.json, handled by Scripts/MidiMappings.js via Engine.createMidiAutomationHandler(). Only ever touched by the two buttons in the MIDI Control panel ("Save As Default Map" / "Load Default Map"). Nothing reads or writes it automatically β€” there is no auto-load in onInit or anywhere else.

      Use cases

      First launch after installation β€” No plugin state exists and MidiMappings.json doesn't exist yet. The instance starts with zero CC mappings. If the user clicks "Load Default Map" at this point, loadDefault() returns false (no file) and the button flashes "No map found"; nothing changes.

      New instance in a fresh DAW session (plugin already in use on this machine) β€” Same as above from the plugin's perspective: a fresh instance has no state, so it starts with no mappings, even if a default map file exists. The default map is opt-in per instance β€” the user clicks "Load Default Map" to apply it. This is the intentional trade-off of the design: no surprise mappings, at the cost of one click per new instance.

      Reopening a DAW session where mappings were set β€” The host hands back the saved plugin state, and the exact assignments from when the session was saved are restored per instance. The default map file is not consulted, so it can't overwrite or drift from what the session had.

      Reopening a DAW session where no mappings were set β€” The restored state contains an empty assignment set and the instance stays empty. There's no fallback to the default map file; saved state is authoritative.

      Loading / switching user presets (any time) β€” No effect on mappings in either direction, thanks to the HISE_MIDI_AUTOMATION_IN_USER_PRESETS =0 flag. A preset saved while mappings existed doesn't carry them, and loading one doesn't clear them.

      Clicking "Save As Default Map" β€” Writes the current instance's entire assignment set to AppData/MidiMappings.json (temp-file + atomic rename, so a failed write can't corrupt an existing map). Flashes "Saved!" or "Error!". Attempting to save with zero assignments shows "No mappings to save" and doesn't save an empty default map.

      Clicking "Load Default Map" β€” Replaces all current assignments in that instance with the file's set. If the file is missing or doesn't parse (hand-edited/corrupt JSON), current assignments are left untouched and the button flashes "No valid map found". A successful load gives no flash; the MIDI learn table updating is the feedback.

      Multiple instances in one session β€” Each instance's mappings are fully independent (per-instance state). The only cross-instance channel is the default map file, and only via explicit save in one instance and explicit load in another. Changes in one instance never propagate on their own.

      One subtlety worth remembering: since the default map is per-machine AppData, it's shared across all DAWs and sessions on that machine, but versioned by nothing β€” the last "Save As Default Map" click from any instance wins. There is no "Save over existing map?" kind of confirmation.

      Also note that the HISE_MIDI_AUTOMATION_IN_USER_PRESETS preprocessor I added is unlikely to get merged, per Christoph's responses earlier in this post.

      posted in Scripting
      dannytaurusD
      dannytaurus
    • RE: VST/plugin GUI design + launch graphics β€” ads, motion, web

      @lalalandsynth Yeah, really like that! πŸ‘

      posted in General Questions
      dannytaurusD
      dannytaurus
    • RE: Bug? Inline function locals/params shadow namespace members - Palette.text resolves to local text

      @ustk Yeah, definitely be good to get the nod from Christoph on a lot of these PRs.

      Claude does a great job of making and testing bug fixes, but only Christoph really knows where the dragons are hiding in the code! 😜

      posted in Bug Reports
      dannytaurusD
      dannytaurus
    • RE: Bug? Inline function locals/params shadow namespace members - Palette.text resolves to local text

      And PR fix https://github.com/christophhart/HISE/pull/998

      posted in Bug Reports
      dannytaurusD
      dannytaurus
    • RE: Bug? Inline function locals/params shadow namespace members - Palette.text resolves to local text

      @David-Healey Issue created https://github.com/christophhart/HISE/issues/997

      posted in Bug Reports
      dannytaurusD
      dannytaurus
    • Bug? Inline function locals/params shadow namespace members - Palette.text resolves to local text

      Inside an inline function, a local or parameter whose name matches a namespace member hijacks even the fully-qualified access (cases 2 and 3 below print the local value instead of 123).

      Cost a lot of time and tokens today, since there's no error. 😫

      Am I doing something wrong here around namespaces, or is this a bug?

      HiseSnippet 1059.3ocsVstaZbDEdVr2nx11nFo9.Lh+TnwwFvXLIn1Fa.2fZrMJ3Fk+kLr6P1Id1YVsyPrQQQpOD8IrOA8Mn8L6rvB1Degpt+.wbt9ctLmyLHQ5SUJYBxw6rowTjy23NbpPG1IjvDn9cQNOz8XhRSSvVRGNMlnTz.jiyF+pgfSwMQoe+8ubHgSD9zbRHzqkLe5KYQLcN03m+aLN+HR.8LVzBR23488khNRtbBfmMbqhhI9mSdO8DhQrBtnWPTgHmezsUypMCnjliqG7TexdiaTuVq8GETqQvnVT+Qs1eu8CZ0jzD47fdALsLYnlnoJvnGJClNLTdgv5fWyTrQbp4PMzPvyVxnNgLdvfYIGEB4r4f7T0F1T026dLKfMmddJ66RYfy0XwjlSgaBR0tGPxYAHsoEROxcneBKVmywfmu1su.pfiIPsYQnXkEU3gttcjfDB81QjyoGk.GlqQ4lUqtEF9oRaOuc1A+BlhZU7YXlfyDzmLdhvWyjBLW5S3pchIIjHEVERBjWfEP0SAURJNhFMhlnvGz4UmNbH9.b2SOaaiMGX5v.qokXh.Sih0SwwIxOP80+fxP2BErTzWvzfLAX+Pp+4XcHEC8LJImlZndWFC5PCdFlv43wPiD1fPEXMvJ3Z02EW1nSNlLZqqrsmWNoADNUqodepnWwT13ORRvZ5kZ7OYLQauOmlIpUAefPJlFImnvyyA+0e7mFipSjbubsIfff1yjpbEuO4UbAyVJM0AhxmPK01CCecxhqTnWtD3MRt2D34eO4mwkvOdFp2N0fOFHgwkoYoCCpqTBJfetsmwHkypk0qf6mVByg+ELcHlXqjooo.76Ll7cdrUH4KMhYCFqF24vAbs0fak4KqWtmgi2BfvFR69ECoztRpYR1sFVCLhV1v2DZq.86li9Ty9e.8VeUxZFaBKKTZ7EBEgLMBftLNGFVbkdtqFOBYmYxUdVzXy3R3lPxcpX0HObAmm626Y3tDTZOGgRwIRM8zrKEfb3qxZ73UxqiMj4zjUx1rcI4lTrrXhYfzV1PetfvzzkGQ+f61HZe6LzEDzNu5zXZ14ij7.ynWy+u9.cT1PX3e+d+tDMwLiOiFHWLMQyLvwoK8ivVU6D+htcopy0xXD55qCfEQxfIbhd4sSl81YLf7wRqDLi8EJld5h60uGqrpdiqrtqP7QtCXZ+vUiwBq.iPl5+CLlsn+ac6MdLzLmCvMcO5Mq6V8aw8uRNQyDu+XhNgcIxw8jIQCg8X9Tv6BAkCF20ofoawdtp4rICLjJBRO7OvWFyZlyNYLqMiIJh3mHea1DCySI9pTJ.lDoO0pH7lO3LtFJ8lwh44H3kMu02eYScMEqutJt65pXi0Uw8VWEattJt+5pXqaWQyCOOXhVFYu1fPGOnW5nDGmdBBzAl1sh9W.hI72f
      
      // Inline-function locals/params shadow namespace members ACROSS A DOT.
      // Expected: all four lines print 123 (the namespace const).
      
      namespace Palette
      {	
      	const var text = 123;
      }
      
      // 1. Anonymous function β€” control
      const var anon = function()
      {
      	var text = "local value";
          Console.print("1. anonymous function    -> " + Palette.text );
      };
      anon();
      
      // 2. Inline function with a local named `text`
      inline function withLocal()
      {
      	local text = "local value";
          Console.print("2. inline, local `text`  -> " + Palette.text);
      }
      withLocal();
      
      // 3. Inline function with a parameter named `text`
      inline function withParam(text)
      {
          Console.print("3. inline, param `text`  -> " + Palette.text);
      }
      withParam("param value");
      
      // 4. Inline function with no name collision β€” control
      inline function noCollision()
      {
          local other = "local value";
          Console.print("4. inline, no collision  -> " + Palette.text);
      }
      noCollision();
      

      expected 123 for all four functions but get:

      Interface: 1. anonymous function    -> 123
      Interface: 2. inline, local `text`  -> local value
      Interface: 3. inline, param `text`  -> param value
      Interface: 4. inline, no collision  -> 123
      
      posted in Bug Reports
      dannytaurusD
      dannytaurus
    • RE: New Release - RustEQ le bleu

      @ustk Hmm.. I think I'll keep away from it for now. Don't need it for a while yet, thankfully.

      posted in General Questions
      dannytaurusD
      dannytaurus
    • RE: New Release - RustEQ le bleu

      @ustk So the Modulation Matrix is working properly in HISE now?

      Last I read, there were some issues with it, still being ironed out.

      Was it something to do with macros? Trying to find the post...

      posted in General Questions
      dannytaurusD
      dannytaurus