Forum
    • Categories
    • Register
    • Login
    1. Home
    2. Orvillain
    3. Posts
    • Profile
    • Following 1
    • Followers 0
    • Topics 94
    • Posts 758
    • Groups 0

    Posts

    Recent Best Controversial
    • RE: HISE Transformation to the new age

      @David-Healey said in HISE Transformation to the new age:

      @dannytaurus said in HISE Transformation to the new age:

      Nah, this is the start.

      Tell me that again in 5 years

      I'm not quite as cynical as I seem, I use AI all the time, I'm just cautious.

      I also am concerned about AI inbreeding which is a real problem with limited solutions at the moment.

      Honestly, this stuff isn't going away. It really isn't. This is the future of coding. Developers in future will be systems architects. They won't be solely opinionated language purists anymore.

      posted in AI discussion
      OrvillainO
      Orvillain
    • RE: Agentic coding workflows

      I've used Antigravity to get myself up to speed with JUCE. I've built quite a few things outside of HISE using it. To the point where for my own company, I don't think I will need HISE. For freelance work, HISE is still a solid option. But I saw a competitor today show off his AI plugin generator, and it was very impressive.

      In terms of HISE specific code I've been doing, certainly not entire namespaces or anything to do with the UI. But methods and functions here and there, that I knew what I wanted to do, but I just wanted AG to write it faster for me.

      I've had more success with AG than ChatGPT on this stuff. Although ChatGPT is actually quite good at writing prompts.

      And on a tagent slightly, but one of the biggest hurdles to writing complex projects in HISE is just how many languages and approaches you need to take command of. In C++ I can focus on JUCE and C++. In HISE, I need to learn HISEscript, C++, SNEX, simple markdown, and even css. This is a barrier to speed.

      posted in AI discussion
      OrvillainO
      Orvillain
    • RE: Using custom preset system - as in the actual presets themselves, not a browser

      @DanH said in Using custom preset system - as in the actual presets themselves, not a browser:

      @ustk ok got it working. Is it possible to update the .preset file without using Engine.saveUserPreset ?

      Why do you want to do this?

      I'm doing this when I save my custom fx chain format:

      inline function saveFXChainPreset() {
              FileSystem.browse(FileSystem.getFolder(FileSystem.UserPresets), true, "*.fxchain", function (f) {
                  if (!isDefined(f) || f == 0) return;
      
                  PluginSharedData.presetMode = "FXChain";
      
                  // Get the data object directly from our custom save logic
                  var data = PluginUserPresetHandling.onPresetSave();
                  f.writeObject(data);
              });
          }
      

      the key being setup a file reference, and then call f.writeObject(blahblah) on it.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Using custom preset system - as in the actual presets themselves, not a browser

      @ustk Yep, indeed you can! the XML data you get from the module state call isn't pretty, but it does work. I think you'd do that if you had some module that did not have any UI controls, but you still wanted the preset to dictate its internal state when loading or saving.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Using custom preset system - as in the actual presets themselves, not a browser

      @Christoph-Hart along these lines....

      Calling:
      updateSaveInPresetComponents(params) does indeed have the effect of setting any non specified parameters to their default value. This is not optimal for all use cases, for example my fx chain use case. Because what is happening is my synthesis generators are being reset to their default state, and the only way I can see how to avoid this is by iterating over all controls I do want to edit, and calling .setValue and then .changed() on them... which is actually quite slow it turns out.

      Could anything be done about this???

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Using custom preset system - as in the actual presets themselves, not a browser

      We're covering a lot of this in this thread:
      https://forum.hise.audio/topic/13701/custom-browser-custom-preset-file-format/29

      Basically, you've got this:

      namespace PluginUserPresetHandling {
      
          const UserPresetHandler = Engine.createUserPresetHandler();
      
          inline function onPresetSave() // this is your main preset save method
          {
              Console.print("onPresetSave triggered");
          }
      
          inline function onPresetLoad(obj) // this is your main preset load method
          {
              Console.print("onPresetLoad triggered");
          }
      
          inline function preLoadCallback() // things you want to happen before loading a preset happen here - looking for samples, looking for graphical assets, etc.
          {
              Console.print("preLoadCallback triggered");
          }
      
          inline function postLoadCallback() // things you want to happen after loading a preset happen here - updating preset name labels in your UI, triggering other UI updates, etc.
          {
              Console.print("postLoadCallback triggered");
          }
      
          inline function postSaveCallback() // things you want to happen after saving a preset happen here - copying samples to an external location, removing any dirty flags you might've setup in the UI layer, etc.
          {
              Console.print("postSaveCallback triggered");
          }
      
      
          inline function init() {
              UserPresetHandler.setUseCustomUserPresetModel(onPresetLoad, onPresetSave, false); // this line is essential
              UserPresetHandler.setPreCallback(preLoadCallback);
              UserPresetHandler.setPostCallback(postLoadCallback);
              UserPresetHandler.setPostSaveCallback(postSaveCallback);
          }
      }
      
      

      You can achieve a hell of a lot with this, without discarding the HISE preset system.

      For example, here is my onPresetSave method in my current project:

          inline function onPresetSave() {
              Console.print("onPresetSave triggered");
              PluginSharedHelpers.forceAllOuterSlotsEnabled();
      
              if (PluginSharedData.presetMode == "Global") {
                  return saveGlobalPreset();
              }
              if (PluginSharedData.presetMode == "FXChain") {
                  return saveFXChain();
              }
          }
      

      In this way, I'm able to gate different save functions based on a master type, which means I can either write the HISE .preset file, or I can write a custom file using my own data model.

      My load one is this:
      inline function onPresetLoad(obj) {
      Console.print("onPresetLoad triggered");
      PluginSharedData.isRestoringPreset = true;

          if (PluginSharedData.presetMode == "Global") {
              loadGlobalPreset(obj);
          }
          if (PluginSharedData.presetMode == "FXChain") {
              loadFXChain(obj);
          }
      
          PluginSharedData.isRestoringPreset = false;
      }
      

      The loadFXchain method is this:

      inline function loadFXChain(obj) {
              if (!isDefined(obj)) return;
      
              Console.print("we are now attempting to load an fx chain");
              PluginSharedHelpers.forceAllOuterSlotsEnabled();
      
              local fxSelections = obj.fxSelections;
              local fxChainOrder = obj.fxChainOrder;
              local params = obj.parameters;
      
              // Set effect menus by stable id (this loads the networks)
              if (isDefined(fxSelections)) {
                  for (i = 0; i < fxSelections.length; i++) {
                      local sel = fxSelections[i];
                      if (!isDefined(sel) || !isDefined(sel.id)) continue;
      
                      local idName = (isDefined(sel.idName) && sel.idName != "") ? sel.idName : "empty";
                      UIEffectDropDownMenu.setMenuToId(sel.id, idName, true); // fire callback
                  }
              }
      
              // Restore FX parameters for the current fxchainScope, skipping selectors (already set)
              if (isDefined(params)) {
                  for (i = 0; i < params.length; i++) {
                      local p = params[i];
                      if (!isDefined(p) || !isDefined(p.id)) continue;
                      if (!_isFxParam(p.id)) continue;
                      if (p.id.contains("EffectSelector")) continue; // handled above
      
                      local c = Content.getComponent(p.id);
                      if (!isDefined(c)) continue;
      
                      c.setValue(p.value);
                      c.changed();
                  }
              }
      

      And you can hopefully see, that what that is doing is skipping userPresetLoad altogether - and instead is manually iterating around whatever data exists in the file, finding the right UI component, and setting the value. This allows me to circumvent some of the HISE assumptions; namely that if a UI component is not specified when loading a user preset, it gets reset to the default value. Which is super no bueno.

      Bear in mind some of this stuff can be asynchronous. So I don't think you can always rely on the order of things.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Third party HISE developers

      @HISEnberg said in Third party HISE developers:

      A bit abashed posting here with so much talent but here it goes!

      Wouldn't worry about that, you've been very helpful in getting me up and running in various threads! So thanks! (and to everyone else also!)

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: *sigh* iLok ......

      Nope, and unless my arm is twisted up behind my back, snapped in 3 places, and someone smacks me over the head with a cueball in a sock, I won't be either.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: C++ External Node & XML Issues

      @Christoph-Hart said in C++ External Node & XML Issues:

      @Orvillain I think the problem is that HISE converts Parameter IDs into actual attributes. This is only the case with hardcoded modules, script processors or DSP networks properly escape that in the value string.

      <Processor Type="Hardcoded Master FX" ID="HardcodedMasterFX1" Bypassed="0"
                 Network="No network" YourParameterGoesHere="0.5" TryValidating(That)="nope">
        <EditorStates BodyShown="1" Visible="1" Solo="0"/>
        <ChildProcessors/>
        <RoutingMatrix NumSourceChannels="2" Channel0="0" Send0="-1" Channel1="1" Send1="-1"/>
      </Processor>
      

      I do a bit of sanitizing at some place though (eg. remove white space for the XML attribute, so all my ramblings might be moot because I sprinkled a character sanitation in there too.

      ahhhhhhhhhhhhh, gotcha. Yes, then that does make sense that parenthesis would possibly break things... and now I'm going to do a sweep through my code to see how many landmines I've invented. 😆

      posted in Bug Reports
      OrvillainO
      Orvillain
    • RE: C++ External Node & XML Issues

      @HISEnberg said in C++ External Node & XML Issues:

      @Orvillain Strange, I am inclined to agree with you since I've done this with other nodes, but removing them in this particular context seems to have solved the problem. Still I can't find the root issue here so I'll keep digging...

      That is very odd. There's nothing in the XML specification that says you shouldn't use parenthesis in an attribute name, so far as I know. The only character to definitely be wary of in my experience is an ampersand.

      posted in Bug Reports
      OrvillainO
      Orvillain
    • RE: Third party HISE developers

      I'm actually moving into more JUCE C++ based projects now. But I've spent 18 years in music tech. Used to work for FXpansion, then ROLI, then inMusic until mid last year when I made the transition to developer. I've got a couple of HISE projects on the go right now - more synths and effects than sample libraries at the moment, but I've done sample libraries throughout my career, with a specific focus in drum libraries. I have a few Kontakt ports in the pipeline for this year too.

      Eventually will launch my own plugin company as well. That is the goal.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Custom browser - custom preset file format???

      @Christoph-Hart

      Can I sanity check this:

      namespace PluginUserPresetHandling {
      
          const UserPresetHandler = Engine.createUserPresetHandler();
      
          inline function onPresetSave()
          {
              Console.print("onPresetSave triggered");
          }
      
          inline function onPresetLoad(obj)
          {
              Console.print("onPresetLoad triggered");
          }
      
          inline function preLoadCallback()
          {
              Console.print("preLoadCallback triggered");
          }
      
          inline function postLoadCallback()
          {
              Console.print("postLoadCallback triggered");
          }
      
          inline function postSaveCallback()
          {
              Console.print("postSaveCallback triggered");
          }
      
      
          inline function init() {
              UserPresetHandler.setUseCustomUserPresetModel(onPresetLoad, onPresetSave, false);
              UserPresetHandler.setPreCallback(preLoadCallback);
              UserPresetHandler.setPostCallback(postLoadCallback);
              UserPresetHandler.setPostSaveCallback(postSaveCallback);
          }
      }
      

      In what order are these called, and which ones are synchronous versus asynchronous??

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Hamburger menu - custom panel or combobox with custom LAF/paint routine?

      @David-Healey Thought so, cheers Dave!

      posted in General Questions
      OrvillainO
      Orvillain
    • Hamburger menu - custom panel or combobox with custom LAF/paint routine?

      As the topic says really.

      I know you can use the script panel to do a custom menu as it says here:
      a881e889-f38f-4883-ad6a-bc5836528251-image.png

      And I'm also fully aware of the combobox widget and its workings.

      What I'm wondering is... say you want a hamburger menu that slides open when you click it, folds away when you click away, and generally just looks a bit niftier.... am I right in assuming the way forward there is to go script panel??

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: UI feedback on tiny control

      @dannytaurus said in UI feedback on tiny control:

      @ustk said in UI feedback on tiny control:

      Could also be a 3 pos knob

      Yeah, I tried a 3-pos knob but since all the other knobs are continuous, having one that only has 3 positions feels a bit weird. Especially since I don't want to put markers around that one knob to denote the positions.

      You could make the wavetable blend between the 3 different shapes, meaning a continuous knob still makes sense ??

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Custom browser - custom preset file format???

      @David-Healey I'll implement that a bit later on. Right now I'm trying to figure out why when I load my fxchain "user preset" it peforms a full state reset!

      updateSaveInPresetComponents

      I think it is this call.... I'm willing to bet it has a default fallback mechanism where it resets controls to default, if it isn't specified in the data you feed it.

      So I change my FXchain load mechanism to iterate over the components manually.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Custom browser - custom preset file format???

      @David-Healey said in Custom browser - custom preset file format???:

      @Orvillain You can simplify your chain by including multiple directory levels in the .getChildFile calls.

      Ohh, more like this I guess?

      const base = FileSystem.getFolder(FileSystem.UserPresets);
      
      base.getChildFile("FXChains/" + PluginSharedData.lastSavedFXChainFileName)
          .move(
              base.getChildFile(
                  "FXChains/" +
                  PluginSharedData.lastSavedFXChainFileName.replace(".preset", "")
              )
          );
      
      

      ??

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Custom browser - custom preset file format???

      Here's a handy line:

              FileSystem.getFolder(FileSystem.UserPresets).getChildFile("FXChains").getChildFile(PluginSharedData.lastSavedFXChainFileName).move(FileSystem.getFolder(FileSystem.UserPresets).getChildFile("FXChains").getChildFile(PluginSharedData.lastSavedFXChainFileName.replace(".preset", "")));
      

      I've got this in the post save callback. It's job is to take the FXchain file I just saved, and rename it to take off the .preset extension that HISE automatically adds whenever you use Engine.saveUserPreset command.

      So now I can save two types of user preset: a global state preset, with a .preset extension... and an fxchain preset that collects module information for each of my FX slots, UI parameters, and bundles it all up into a .fxchain preset.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: C++ External Node & XML Issues

      @Christoph-Hart Wouldn't cause a corruption in XML. So far as I know, it is perfectly legal to do so. I've used parenthesis in parameter id's for ages and not had any errors in xml files like what @HISEnberg is reporting.

      posted in Bug Reports
      OrvillainO
      Orvillain
    • RE: How to get numbers from strings

      @ulrik are you parsing dodgy data from somewhere?? Because grouping numbers and text strings like that into a single array seems like a poor design.

      posted in General Questions
      OrvillainO
      Orvillain