Forum
    • Categories
    • Register
    • Login

    Using custom preset system - as in the actual presets themselves, not a browser

    Scheduled Pinned Locked Moved General Questions
    26 Posts 6 Posters 755 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.
    • OrvillainO
      Orvillain @Orvillain
      last edited by Orvillain

      @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???

      Musician - Instrument Designer - Sonic Architect - Creative Product Owner
      Crafting sound at every level. From strings to signal paths, samples to systems.

      ustkU 1 Reply Last reply Reply Quote 0
      • ustkU
        ustk @Orvillain
        last edited by

        @Orvillain I'm not certain my brain gets all this so pardon me if it's not helping...
        But can't you do it the other way round, saving the module state with addModuleStateToUserPreset and then restore the UI components from it with updateConnectedComponentsFromModuleState?

        Hise made me an F5 dude, any other app just suffers...

        OrvillainO 1 Reply Last reply Reply Quote 0
        • OrvillainO
          Orvillain @ustk
          last edited by Orvillain

          @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.

          Musician - Instrument Designer - Sonic Architect - Creative Product Owner
          Crafting sound at every level. From strings to signal paths, samples to systems.

          1 Reply Last reply Reply Quote 0
          • DanHD
            DanH @ustk
            last edited by DanH

            @ustk clever - but possibly running through all the presets every time you load a new preset is going to take a while.... I'd need to cache them somehow.

            How does saving panel data work? Do you have to save the preset (bad for my use case)? Does it auto update / write to the .preset file? Where is the data in the .preset file?!

            EDIT - Oh it's not persistant... doh 😆

            DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
            https://dhplugins.com/ | https://dcbreaks.com/
            London, UK

            ustkU 1 Reply Last reply Reply Quote 0
            • ustkU
              ustk @DanH
              last edited by

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

              @ustk clever - but possibly running through all the presets every time you load a new preset is going to take a while.... I'd need to cache them somehow.

              No, only at init when for checking if new presets are present

              How does saving panel data work? Do you have to save the preset (bad for my use case)? Does it auto update / write to the .preset file?

              Yes true... but it should be possible to just write it in the preset dynamically without the need to save. but that would require some clever string handling, don't know if it's secure enough and/or doable, but that might worth a try...
              That might be where the already existing custom preset system is better...

              Where is the data in the .preset file?!

              Under the panel's value, like all other components

              EDIT - Oh it's not persistant... doh 😆

              Yes it is if in the preset..., it's recalled like any other value, that's what I do a lot in the things I've worked on

              Hise made me an F5 dude, any other app just suffers...

              DanHD 1 Reply Last reply Reply Quote 0
              • DanHD
                DanH @ustk
                last edited by

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

                that's what I do a lot in the things I've worked on

                of course 😆 Ok I'm obviously passing the data in wrong. Will take another look...

                DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                https://dhplugins.com/ | https://dcbreaks.com/
                London, UK

                DanHD 1 Reply Last reply Reply Quote 0
                • DanHD
                  DanH @DanH
                  last edited by

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

                  DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                  https://dhplugins.com/ | https://dcbreaks.com/
                  London, UK

                  ustkU OrvillainO 2 Replies Last reply Reply Quote 0
                  • ustkU
                    ustk @DanH
                    last edited by

                    @DanH Yeah that's where the biggest job resides.
                    might doable with some XML parsing, and save as XML but the object might live as strings that are difficult to read/write. I won't be able to make tests within the next days so...

                    Hise made me an F5 dude, any other app just suffers...

                    DanHD 1 Reply Last reply Reply Quote 0
                    • DanHD
                      DanH @ustk
                      last edited by

                      @ustk I think it's too risky. One mistake in a preset file and it doesn't load.

                      DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                      https://dhplugins.com/ | https://dcbreaks.com/
                      London, UK

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

                        @DanH what about with HISE's xml parser?

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

                        DanHD 1 Reply Last reply Reply Quote 0
                        • DanHD
                          DanH @David Healey
                          last edited by

                          @David-Healey don't know anything about it

                          DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                          https://dhplugins.com/ | https://dcbreaks.com/
                          London, UK

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

                            @DanH These two

                            45560452-a98c-43ef-b1fc-6123cf2a9e08-image.png

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

                            ustkU 1 Reply Last reply Reply Quote 0
                            • ustkU
                              ustk @David Healey
                              last edited by

                              @David-Healey I tried in during my testing and even if I could make it work, the parsing of an array that contains strings is bad bad bad. You need to rework the result to remove the escape char and other things.
                              This might just be normal, but then what about rewriting it back? Might work, might be risky, this I'm not sure until further testing it

                              Hise made me an F5 dude, any other app just suffers...

                              1 Reply Last reply Reply Quote 0
                              • OrvillainO
                                Orvillain @DanH
                                last edited by Orvillain

                                @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.

                                Musician - Instrument Designer - Sonic Architect - Creative Product Owner
                                Crafting sound at every level. From strings to signal paths, samples to systems.

                                DanHD 1 Reply Last reply Reply Quote 0
                                • DanHD
                                  DanH @Orvillain
                                  last edited by

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

                                  Why do you want to do this?

                                  Because it kills voices and I want to silently update some metadata like tags and author for presets.

                                  But.... your method seems to be working!!! I feel like I'm going to have to remove certain characters in case it messes up the preset code....

                                  DHPlugins / DC Breaks | Artist / Producer / DJ / Developer
                                  https://dhplugins.com/ | https://dcbreaks.com/
                                  London, UK

                                  1 Reply Last reply Reply Quote 0
                                  • OrvillainO
                                    Orvillain
                                    last edited by Orvillain

                                    @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??

                                    Musician - Instrument Designer - Sonic Architect - Creative Product Owner
                                    Crafting sound at every level. From strings to signal paths, samples to systems.

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

                                    43

                                    Online

                                    2.2k

                                    Users

                                    13.5k

                                    Topics

                                    117.2k

                                    Posts