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

    Posts

    Recent Best Controversial
    • RE: mousewheel scrolling in a custom script panel - possible?

      @David-Healey Thanks! That might work.... will have to try it out.

      posted in General Questions
      OrvillainO
      Orvillain
    • 47f54ba6f - remove Content.setColour & ScriptComponent.setColour - why ????

      In the HISE develop branch these commits perform a removal of the setColour
      47f54ba6f - remove Content.setColour & ScriptComponent.setColour
      0319df243 - remove Content.setColour & ScriptComponent.setColour

      It looks like they've just been straight up replaced with .set() calls ?? Why the change?? Just curious.

      posted in General Questions
      OrvillainO
      Orvillain
    • mousewheel scrolling in a custom script panel - possible?

      Is it possible to have scrolling using the mouse wheel inside a custom script panel?? I have a scroll bar that appears on hover of course, but I'd really like to do mousewheel support too.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Loading wavetables by drag-and-drop takes a long time??

      @dannytaurus said in Loading wavetables by drag-and-drop takes a long time??:

      @Orvillain Weird. I'll try it out here again and see if I get the same result.

      Is yours a standard mono, 'power of 2' file?

      Yeppers.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Loading wavetables by drag-and-drop takes a long time??

      @dannytaurus said in Loading wavetables by drag-and-drop takes a long time??:

      @Orvillain To be clear, I was dropping a prepared wavetable WAV into the Wavetable Synth.

      I'm not sure about the Wavetable Creator.

      Are you dropping a wavetable WAV or just a plain WAV and hoping to make it into an interesting wavetable?

      I have no idea how the Wavetable Creator works, or what it's for! 😂

      A wavetable wav. It sounds different when it is saved as a HWT. Very odd.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Loading wavetables by drag-and-drop takes a long time??

      @dannytaurus Hilariously.... they don't sound the same!! The WAV file sounds markedly different to the HWT file here!

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Loading wavetables by drag-and-drop takes a long time??

      @dannytaurus You legend, cheers!! Will try it out!

      Dohhh.. I was even posting in that thread, haha!

      posted in General Questions
      OrvillainO
      Orvillain
    • Loading wavetables by drag-and-drop takes a long time??

      When I drag and drop a wav file into the wavetable synth, it takes quite a while to process it into a wavetable. Is there a way to only need to do this once, and then cache the result, or better yet, save the resutl out as a HWT file??

      I'm not having much luck with the wavetable creator. In resample mode it just keeps crashing. So I'm looking into other waves to convert my wav files into wavetables.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Crash when loading files into Wavetable Creator (Resample Mode)

      For me it crashes whenever I try to load a 44.1kHz sample into it.

      posted in Bug Reports
      OrvillainO
      Orvillain
    • RE: Crash when loading files into Wavetable Creator (Resample Mode)

      Still crashes. Any word on this??

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

      @Christoph-Hart

      It's like this ..... I have an external arppegiator triggering my synth... I click my left/right arrows to change preset.... and because I use a custom data model, I have to tap into the pre/post callbacks.... so here's what I get:

      synth notes triggering.... click the arrow....
      Interface: preLoadCallback triggered - no synth notes triggering when this is running
      Interface: onPresetLoad triggered - no synth notes triggering when this is running
      Once the onPresetLoad method is finished, a midi note does sneak through into the synth....

      Then this callback fires:
      Interface: postLoadCallback triggered
      This kills the previous notes, and triggers the new ones.....

      Here is my full loadGlobalPreset method:

      inline function loadGlobalPreset(obj) {
              local samplemaps = obj.samplemaps;
              local wavetables = obj.wavetables;
              local params = obj.parameters;
              local fxSelections = obj.fxSelections;
              local fxChainOrder = obj.fxChainOrder;
      
              lastLoadParams = params;
      
              // Restore samplemaps
              UISoundSelector.syncSamplerMenu(1, samplemaps[0]);
              UISoundSelector.syncSamplerMenu(2, samplemaps[1]);
              UISoundSelector.syncSamplerMenu(3, samplemaps[2]);
      
              // Restore wavetables
              UISoundSelector.syncSynthMenu(1, wavetables[0]);
              UISoundSelector.syncSynthMenu(2, wavetables[1]);
              UISoundSelector.syncSynthMenu(3, wavetables[2]);
      
              // Update all UI parameters - except the ones that are not tagged as saveInPreset
              UserPresetHandler.updateSaveInPresetComponents(params);
      
              // TODO: Restore custom samples
      
              // Fix-up FX menus by stable id, but only when they differ
              if (isDefined(fxSelections)) {
                  for (i = 0; i < fxSelections.length; i++) {
                      local sel = fxSelections[i];
                      if (!isDefined(sel) || !isDefined(sel.id)) continue;
      
                      local targetId = (isDefined(sel.idName) && sel.idName != "") ? sel.idName : "empty";
      
                      local menu = Content.getComponent(sel.id);
                      if (!isDefined(menu)) continue;
      
                      // what saveInPreset restored (by index)
                      local currentId = UIEffectDropDownMenu.getIdForIndex(menu.getValue());
                      if (currentId == undefined) currentId = "empty";
      
                      // only fire callback if mismatch
                      if (currentId != targetId)
                          UIEffectDropDownMenu.setMenuToId(sel.id, targetId, true);
                  }
              }
      
              // Restore FX chain ordering (pageKey -> [4 slots])
              if (isDefined(fxChainOrder)) {
                  for (k in fxOrderKeys) {
                      local key = fxOrderKeys[k];
                      local saved = fxChainOrder[key];
      
                      // expect an array of length 4 with unique 0..3
                      if (!isDefined(saved) || saved.length != 4) continue;
      
                      UIEffectReordering.pageOrder[key] = saved;          // update UI state
                      UIEffectReordering.applyVisualOrder(key);           // move panels
                      PluginEffectReorder.apply(key, saved);              // set DSP chain
                  }
              }
      
              // Update all UI parameters - except the ones that are not tagged as saveInPreset
              //UserPresetHandler.updateSaveInPresetComponents(params);
          }
      

      It is doing quite a lot... and ultimately what happens is when I switch a preset, I get one voice that sounds one way... and then another voice that sounds completely different... like a voice is being allowed to be triggered before the preset is fully loaded.

      It seems to be something related to my effect menus and/or effect re-ordering.

      It is hard to explain. Might have to make a video. But any immediate thoughts??

      posted in General Questions
      OrvillainO
      Orvillain
    • 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