HISE Logo Forum
    • Categories
    • Register
    • Login

    How Can I Make Custom User Presets Extension

    Scheduled Pinned Locked Moved General Questions
    24 Posts 5 Posters 1.6k 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.
    • ulrikU
      ulrik @Tania Ghosh
      last edited by

      @Tania-Ghosh Yes it is possible if you construct your own preset browser and use "Engine.dumpAsJSON" to save the presets and "Engine.loadFromJSON()" to load the presets

      Hise Develop branch
      MacOs 15.3.1, Xcode 16.2
      http://musikboden.se

      1 Reply Last reply Reply Quote 0
      • ulrikU
        ulrik
        last edited by ulrik

        @Tania-Ghosh Here I have an excerpt from my custom preset handling, and it handles only "pan" and "gain" for a 16 channel mixer.
        Here I use the extension ".mix" instead of .preset
        And because Hise can not read directories I also save an object to store all preset names so Hise knows which presets there is in the "UserPresets" folder.
        I wish Hise could browse the directory even if it's not documents with the extension ".preset"

        I hope you can make use of the code :)

        var MixerNames = []; //All UserPreset names
        var MixerData = {MixerNames:[]};    // The object to store
        var MixerPreset = [];   //Preset to store
        var count = 0;  // Count how many times SavePreset button has been pressed
        
        //  If there is no "MixerData" in UserPresets folder, this will create it with a Default preset
        if(Engine.loadFromJSON("MixerData") == undefined)
        {
            MixerNames.push(MixerDefault[0]);
            MixerData.MixerNames = MixerNames;
            Engine.dumpAsJSON(MixerData, "MixerData");
            Engine.dumpAsJSON(MixerDefault, "Default.mix");
            MixerPresetsCmb.set("items", "");
            MixerPresetsCmb.set("items", Engine.loadFromJSON("MixerData").MixerNames.join("\n"));
            MixerPresetsCmb.setValue(1);
        }
        
        
        //  MixerPresetCmb -------------------------------------------------
        inline function onMixerPresetsCmbControl(component, value)
        {
            if(isDefined(value))
            {
                MixerNames.clear();
                MixerPresetsCmb.set("items", "");  //Empty Cmb menu
                
                local Object = Engine.loadFromJSON("MixerData");    //Get All saved user presets
                
                //  Set MixerNames items in Cmb menu
                MixerPresetsCmb.set("items", Object.MixerNames.join("\n"));
                
                //  Check which preset is "loaded" and set the preset name to "PresetNameLbl"
                local loaded = Engine.loadFromJSON(MixerPresetsCmb.getItemText()+".mix");
                PresetNameLbl.set("text", MixerPresetsCmb.getItemText());
        
                //  set all gain & pan values from the loaded preset
                if(isDefined(loaded))
                {
                    for(m=0; m<15; m++)
                    {
                        //MixerGains[m].setValue(loaded[m+1]);
                        //MixerGains[m].changed();
                        VolSliderPack.setSliderAtIndex(m, loaded[m+1]);
                        PanSliderPack.setSliderAtIndex(m, loaded[m+16]);
                        //PanKnbs[m].setValue(loaded[m+16]);
                        //PanKnbs[m].changed();
                    }
                    VolSliderPack.changed();
                    PanSliderPack.changed();
                }
            }    
        };
        
        Content.getComponent("MixerPresetsCmb").setControlCallback(onMixerPresetsCmbControl);
        
        
        //  Save new preset function    ----------------------------
        inline function onSavePresetBtnControl(component, value)
        {
            if(isDefined(value) && value == 1)
            {
                count = count + 1;
                MixerPreset.clear();
                // Store the presetname in "preset[0]"
                MixerPreset[0] = PresetNameLbl.getValue();
                
                //  Store MixerGains values in "preset"
                for(i=0; i<15; i++)
                {
                    MixerPreset[i+1] = VolSliderPack.getSliderValueAt(i);
                    MixerPreset[i+16] = PanSliderPack.getSliderValueAt(i);
                }
                
                //  Check if the preset name already exists
                MixerNames = Engine.loadFromJSON("MixerData").MixerNames;
                if(MixerNames.contains(MixerPreset[0]))
                {
                    //  Make WarningsPanel visible and display...
                    WarningPnl.set("visible", true);
                    
                    //  ...warning text
                    WarningLbl.set("text", "Preset "+"'"+PresetNameLbl.getValue()+"'"+" already exists!"+"\n"+
                    "Do you want to owerwrite?"+"\n"+
                    "Press 'Save' or chose another name!");
                    
                    //  Check if "Save" button is clicked once more
                    if(value == 1 && count == 2)
                    {
                        local WriteOverIdx = MixerNames.indexOf(MixerPreset[0]);
                        MixerNames[WriteOverIdx] = MixerPreset[0];
                        MixerData.MixerNames = MixerNames;
                        Engine.dumpAsJSON(MixerData, "MixerData");
                        Engine.dumpAsJSON(MixerPreset, MixerPreset[0]+".mix");
                        
                        //  reset "count" to zero
                        count = 0;
                        
                        //  Hide the WarningsPanel
                        WarningPnl.set("visible", false);
                    }
                    else
                    //  If Save button is not pressed the second time, abort!
                    {
                        return;
                    }
                }
                
                //  If the presetName doesn't exists already, save preset
                else
                {
                    MixerNames.push(MixerPreset[0]);
                    MixerData.MixerNames = MixerNames;
                    Engine.dumpAsJSON(MixerData, "MixerData");
                    Engine.dumpAsJSON(MixerPreset, MixerPreset[0]+".mix");
                    
                    //  Reset "count"
                    count = 0;
                    
                    //  Hide WarningPanel
                    WarningPnl.set("visible", false);
                }
                //  Get index in "MixerNames" of loaded presets name
                var idx = MixerNames.indexOf(MixerPreset[0]);
                MixerPresetsCmb.set("items", "");
                MixerPresetsCmb.set("items", MixerNames.join("\n"));
                MixerPresetsCmb.setValue(idx+1);
                MixerPresetsCmb.changed();
            }
            
        };
        
        Content.getComponent("SavePresetBtn").setControlCallback(onSavePresetBtnControl);
        
        

        Hise Develop branch
        MacOs 15.3.1, Xcode 16.2
        http://musikboden.se

        ulrikU Tania GhoshT d.healeyD 3 Replies Last reply Reply Quote 1
        • ulrikU
          ulrik @ulrik
          last edited by

          @ulrik I should say that in the first post I forgot some code so now it's updated, sorry about that

          Hise Develop branch
          MacOs 15.3.1, Xcode 16.2
          http://musikboden.se

          1 Reply Last reply Reply Quote 0
          • Tania GhoshT
            Tania Ghosh @ulrik
            last edited by

            @ulrik Fantastic.. :)
            Thank you

            Tania Ghosh

            1 Reply Last reply Reply Quote 0
            • d.healeyD
              d.healey @ulrik
              last edited by

              @ulrik You can browse directories with the File System API.

              Libre Wave - Freedom respecting instruments and effects
              My Patreon - HISE tutorials
              YouTube Channel - Public HISE tutorials

              ulrikU 1 Reply Last reply Reply Quote 1
              • ulrikU
                ulrik @d.healey
                last edited by

                @d-healey Really? Is it newly implemented?
                That is great news, I have to dive right in and explore, I realise I've been away much too long from Hise, thank you David! 😀🎶

                Hise Develop branch
                MacOs 15.3.1, Xcode 16.2
                http://musikboden.se

                d.healeyD 1 Reply Last reply Reply Quote 0
                • d.healeyD
                  d.healey @ulrik
                  last edited by

                  @ulrik It's been there for a while now - https://docs.hise.audio/scripting/scripting-api/filesystem/index.html

                  Libre Wave - Freedom respecting instruments and effects
                  My Patreon - HISE tutorials
                  YouTube Channel - Public HISE tutorials

                  ulrikU 1 Reply Last reply Reply Quote 1
                  • ulrikU
                    ulrik @d.healey
                    last edited by

                    @d-healey Yeah, I see now.
                    I'm trying it out at the moment and I'm not able to set absolute path to the UserPresets folder, I need that to check if there's any presets in that folder, and I mean presets with different extensions like ".mix" or other...
                    is it possible? I only find "set start folder"

                    Hise Develop branch
                    MacOs 15.3.1, Xcode 16.2
                    http://musikboden.se

                    LindonL 1 Reply Last reply Reply Quote 0
                    • LindonL
                      Lindon @ulrik
                      last edited by Lindon

                      @ulrik

                      FileSystem.findFiles(var directory, String wildcard, bool recursive)

                      so to get to the directory use:

                      FileSystem.getFolder(var locationType)

                      location types :

                      AudioFiles The audio file folder. In HISE it will be the repo folder, but in the compiled project it will be a sub folder in the appdata folder.

                      Samples The sample folder as specified in the settings (or the subfolder of the HISE project during development).

                      AppData The app data directory. This is the main directory for your project which will house the configuration files and user presets.

                      UserHome The user home folder.

                      Documents The user's Document folder.

                      Desktop The user's desktop folder.

                      Downloads The user's download folder.

                      so (guessing this would work)

                      var appD = FileSystem.getFolder(AppData);
                      var myDir = appD + "\User Presets";
                      var myList = FileSystem.findFiles(myDir, "*.mix", false);
                      

                      HISE Development for hire.
                      www.channelrobot.com

                      1 Reply Last reply Reply Quote 2
                      • d.healeyD
                        d.healey
                        last edited by d.healey

                        HiseSnippet 898.3ocsV01iSaDDd2bwThoAUj3GfU9jSUHxoEnUfP.I2kpn16HBCn9kVzF6MWVcq20x65ChNc+m4e.c1cchcJADDI7WhmWdF+LyNyrYdgLgpTxBDtyqVmSQ3ezKdsPuZxJBSflcLBeauSIJMsHvoZ75bhRQSQX7Q+gQAtSaj84COcLgSDIzZUHzajrD5ewxX5Zsye1ex37ojT5qXYM799OaVhTLQxkk.eNxKBkSRtfbN8LhwsVdH7MNIkokEwZhlp.eFKSWGuR9Ngy+2vTrEbpQXDJFBjSMZxJFOc9lbUgP31yqy7ibY9c8Nkkx1putB7SVCA0HZVCvs1kRs2gRi9bTZpjmZBvmgd3Fzqsid2wKNofkqqsX31s7lIfCmkDnr2jVNeQs9mVdSjfGB8vLxEzoEfvVDgOLJZPvChh5+3t9c8ghuRGbIoHfjmeLQSrjrH3IASYbZ7ZnKHa34TsScXCkO24uIL0AIufpnZ01frSPMwwl1lnD160Jvk4N.8brgI3LAMXYoHQyjh.oXgVLtP9NE0jQERdXhLKWJfba.7A4kz9c8upqemFDag0+vcnxffkDthNHn2O2av13GtDP0Onqe.7bk6GyC7sTRNcXdASnsNMTKi0fz4g8lVx4yI5U852+wVDWa390V9uoraRzM7Lr21bnW+gJiEalLgv4Kfd8vOMIMArQM3Lol9BQXe+q763esev+2zxk60VUv3vw19LalCK9R.CEkYKLkNWcdiiPy4tc+23qq6OwUaZ3nTLSvzuHmVIWOeLZOyGnphK71qmYZpLiLU5.+xoEZlgN3ioWB6ebCPc7NlptPKys9Vchfv+f1Z81UiWiK0Zo.wRMyVaOLPuGg8vOB9dqMu7uvKZ56Az2zqxAE4R5LgqE1L.xTmJyfO.o.Pfag9zAZXshLsjSz6tqwrTsx.bDryPsYvUnX50MW59Mr.JZuKf1aA9qjt2waNSmrZ+7s0d3KbP88luUqy65cxxkzDcMYa6M8uOzc2eCT4kxRMrc3TBrjvz1bVYVLbiVBEXhPP4JSGTKSSrSNxHapLwTQpU3ivSkwQFYbkwQaLhxHIEx2l3FNMWXbSqFfSB6ckcfKsA4fQH6.KfyKZXDJCtG6sIIlRw8.tueL+xAf4WO.L2+.v7fC.yCO.L+1Af42+hXL+EhmWpkYtwDPw7Sratv3SDDnKy1Qh9OYLTpIA�
                        

                        Seems Lindon got there before me :p

                        Edit: Actually Lindon's method won't work, that's what I tried first. You can't pass strings you have to pass file objects.

                        const var appDataFolder = FileSystem.getFolder(FileSystem.AppData);
                        const var presetsFolder = appDataFolder.getChildFile("User Presets");
                        
                        const var fileList = FileSystem.findFiles(presetsFolder, "*.mix", true);
                        
                        for (f in fileList)
                        {
                            Console.print(f.toString("FullPath"));
                        }
                        

                        Libre Wave - Freedom respecting instruments and effects
                        My Patreon - HISE tutorials
                        YouTube Channel - Public HISE tutorials

                        ulrikU Tania GhoshT 2 Replies Last reply Reply Quote 1
                        • ulrikU
                          ulrik @d.healey
                          last edited by

                          @d-healey @Lindon
                          Thank you both, now I get it :)

                          Hise Develop branch
                          MacOs 15.3.1, Xcode 16.2
                          http://musikboden.se

                          1 Reply Last reply Reply Quote 0
                          • Tania GhoshT
                            Tania Ghosh @d.healey
                            last edited by

                            @d-healey Tried your Snippet but unable to load my custom User Preset Extension (*.tania) to Preset browser. What am I doing wrong?

                            No PB.gif

                            Tania Ghosh

                            LindonL 1 Reply Last reply Reply Quote 0
                            • LindonL
                              Lindon @Tania Ghosh
                              last edited by

                              @Tania-Ghosh -er its not going to load a preset is it? its going to load a JSON file - which you are going to have to read thru and apply yourself in the code - so you will need to build a custom preset panel - if i understand it correctly.

                              HISE Development for hire.
                              www.channelrobot.com

                              Tania GhoshT 1 Reply Last reply Reply Quote 3
                              • Tania GhoshT
                                Tania Ghosh @Lindon
                                last edited by

                                @Lindon Ok... Got it. :)

                                Tania Ghosh

                                ulrikU 1 Reply Last reply Reply Quote 0
                                • ulrikU
                                  ulrik @Tania Ghosh
                                  last edited by ulrik

                                  @Tania-Ghosh After that Lindon and Healey explained the, for me, new implementation of the FileSystem I've been spending some hours on this and I wrote an example if it could help?

                                  HiseSnippet 2613.3ocuZs0baabEFPVHwj1Lw1woOugSmNTwxzTxxocFW6PIQpVNVRTifjS635j.BrTbsAA3.rTxLZzLY568WPeo+T7Oj9P+AzGx64A0ytKtr3FIEsUg83wXuc91y46bYWhC7bMw99tdJpkNZxHrh5s0zm3PGr8.ChiRmVJp2SS23TL5XerG5.OrOlpr0jQF99XKEU0a7mXiSszxJ7me4a2xv1vwDG2jhxKcIl3cICIz3VOn4KH116XXgOhLTZzazrioqy1t1tiALcCsFJiLLeqwI38MXCaIME0OosEg55oSMnXeE0k2x0Zh9.2ybDi+kDeROaL6k0TzgERz7Nt1VLDyZUY6ADaqCB269JvpbPrl3FBMw801iXQhZOVibGdGn3YHqOTWZZvaMY30X9gmpD7VV.u6poa5QFQi6ggsao0wgh85a.l.YXIFqxR+x8011EFgCs9Pi2h2wCdIZF09lFMVE8jFMV4oUJK9yidDB0BaZa3YPItN9H34gy3oRYvD5SQmZDxX74rmmgBE8IX51tCG45.uTqpzXpxjb5YyL8ywBDNrpBzGuJvj5S7Fx2.GX3fsKbgxLR9Zko05fzpU8Tgkr5pn9F193oI0c6MexDFW0PcOSyGMLeD0EAREY3Xgf4CRvdL1G02ycXQVjjfIZgdF5UymVb0JkQE7j+BrE0YsEaZquXS6wK1z1XAl1Kb5s1hMs0WroA6sWmhQQbHTgQhYDq9PdCnGBDvFY+qXx.IRGFNc.FUkM5pgDGfNYXaiLi4E9trgMA43RQmAwlQ8vnwNV39DGrE5rAXGjO0viRbNAAhsuqGeYAtK.OJDDuRYnsZD.aMdJhf9iRjt51XmSnCflevCVoR4yE5i39eE40LepWxvVs3sIz7JOs7Ew9CGABbGhMVehOECD+m8g7DDbi3gMg30Dr+pnQFzA90qWWzEOlSKCpAhGc1S1VXLZDqGQGAAmhQFybJ5plTiaJlSxPbiDA+RrPYVbN8fkTfsZ0pJkK1OQ7hti.qTWcjUvlZByN2yy8L+DIv8mcL7bhlvD.ORGfPWG6IbJfG1vhwH5C.aUD0aLqWVG9FmF1dkxDGafEg5O1wjElCl9VbPwvDyCvy0tVDUbUAGMlmP5WKrkP2lyS5QIojE61ZYTqAQoWEU8qqOj7NVT6.zTigwURtfmm0iEvouqMt9HOB3hxlScpqNEd6jZU2Yrs8A.4o5JLyg7ztPtAfJeA2bUProHkR0UX9CAplsAO0dPUP0xQskLSsbtDTuwTJf4UQceAiFXgswTvklQCDZmbxkmmop6agXlS2JUJxDwzbkXKLia6.4R.5PxDKr8bspT76nbpaor5V1zh5JigLou.WDO.UkaSWotXSx5oqWnm8jZQKlTkF0MGX3bB1plLHjSDKRxywIPZBzXUAYEJx.Mp0WEuOXaZVnPlSbamS.EYcSvCgxKx0qau2..JVf7QxDCu2HqbDuLVYlFdSuJjnoDH.p6HtD.IK56hzPfEWWLj0avp9qboYvT4bhhHoxDlDUyvNXfsPswhMHSEuhwhxxREK9hvTmWE6LUJQPnHESZLJqb10UDH0PDnNxC8gKxSdJHIt+rC4F0iPWPfHq9L2fpgQyhScsKwmlMAHT0.2A0OuHwQgfY4Kxtha5wVrW85fNRUUQRolpxhBheGst0GM1ePsjKAq3CaP6uoenC5qZ75TQsmhNIdseiKwoV0+lSbRfYm4JdWuuHXYrT.xUGPFGAQfpkNqR7z30m7rYElTRDwAKStoSIgPs9ZynVtzoIOO+ZcKnVu38.uVury8h7RDGsTMdchnzRqVJKH6eltyahCglu6aVOHYG3Vh7qGO07qKpyqXwE.3iUQSyaF5TEAM8Xkxdz4MoLIVCTa4je8aSH8KJMc6WZMTQFwBzjxVxuyC7s4mz1O5luBvmgOxk6urnQlmhMlcMae7svAm2SJd5Gh8mEUvDN2ojS37GCP.EQHXSlPDw.VYN76eziRVhH0iccUhELy7uZkLdFyZGDDLXASsdEU0XQiIJ51ZgiZFENjzxWDyMW9Qb8+Bt6PCyALdUmVqBoRFaawOFuOtOb.E94xLFSG.m18mDmQ.Mqi7kTsm7Dth+WGKlEThGuuKnOgpWKed4RkunLJcW86maeAaHaVcp4zcPErEOwZNiG1iUcgvoHbfJpKm7BY0J9BYkuuXSgkRZftNcbHT1QrK5ZZUBLuv+63NrzPratMnMXbivdTBCBpsvmRLwh6wsjVKr+agZzUT+hHNgh5Mo7dqDbKu6ZzCaqPrTT+L4VVW4cx2z9D4WNiXQGD0v6+6MGfImLP5N36zj4iqn9UZ5a9x1neGZ2ta1Bs8w5G0cOzw5sODcvgs0aejtReXOnS9oD2SuhDXKI.aHz1hexSNZusV7QVkw5usoDV2uYRrpPxf0VMI964NDjlgGLS0kXgl6DjRlcA2hsxWps0gc+N81IgeNPcF500JBqneb1Xci.8ZEMtBUfBkgisoDVLeF5w.kzfy5TuQNn6NAXA5om6VtuiCvJZRAYJBeuu27nKyW48YZIzZ7BbAhn1lPnitNKfVbihPYy2dUzhb14UQKd6Boi2QKYTzBojNKhZLEEUf+6IvujpkqYE+DWqCK2mbwgJ+JWDQMyZ8+9OEsxVk3VUTt7RtzmGiQIM1gGfRtJZa9i9WE6f.8n82bu1J8NIFSWF.oYPpyhu6nkrvihf4+hNOVCALKqEdu34F0JEt0macYBh8SJz8ax7qP+bsVs2s8QWMp8sJjZeOszk1VDHab9GMx88C2CSgdqnLNG5shx+9WSq7mubdOVZeALiojGo4aJjl7kZubycOtsN5ntnsZifTdG1tUNLlFIxy8oEp8+DM1u9kDxZNVNdWlrFOOCxddFM9UPxqWnjwWyR9wEJ42bMK4MJTxtejkrtMANIQfjY+RfxLvIxLvuOkje+2mSUWe.Rd8hj7O2+ZVxOtv8ryGpjuUR2d98JvE7Wnk49Fjio8b4.umkBE+meNCJ9qMSlK8xfDWYhWobYdwqDsJm.IrsSCOBglJ6U0aHs4pTHI9S03WTdgkfzZ1Qo6zbjgGHFI4kmNatBkuL.mzphc+57pL4x+gn0T4RyTWRwa8aoEcU3EFL++ya+aF.ob2UooBEva9yYxnUtnLZ2UK0shM2GjKGhcq4SOjW8Px0YHTD+Fsf65BNsLM523RQI6Wfzcz1y0ZrsAM4GGE6KBKnCPzI9JjXeoQN9D5D4uXrqkuXp4Et2U6.B0bP93cobvK3deci2fu+rJZs62GaRiA6xZ67Wt9+XyTNzcL62maOCpGAXkZ6OdnNPxMw.Rb.hD6RTTWhQzEu2HLvmN1wh+ByuIny0XuqFz4ZgcpLzvzy8GLEWcC6Kb6l7V.L4v+P+JosG6czZJ7qyAlmVi5MTFRrH+foISU7P.64Om0Wf473EXNar.y4IKvb9lEXN+9EXN+goNG1273liothHJfAcuCZyuiKU01NrPHbFox+Cf2OwUO
                                  

                                  I should say that this will only work if there is a folder named "User Presets" in the Users AppData folder.

                                  @d-healey is it possible to create a folder with this File System functions? I can't find anything about that in the docs?

                                  Hise Develop branch
                                  MacOs 15.3.1, Xcode 16.2
                                  http://musikboden.se

                                  d.healeyD Tania GhoshT 2 Replies Last reply Reply Quote 2
                                  • d.healeyD
                                    d.healey @ulrik
                                    last edited by

                                    @ulrik I think it's read-only, except for JSON files.

                                    Libre Wave - Freedom respecting instruments and effects
                                    My Patreon - HISE tutorials
                                    YouTube Channel - Public HISE tutorials

                                    ulrikU 1 Reply Last reply Reply Quote 1
                                    • ulrikU
                                      ulrik @d.healey
                                      last edited by

                                      @d-healey Ok, thanks!

                                      Hise Develop branch
                                      MacOs 15.3.1, Xcode 16.2
                                      http://musikboden.se

                                      1 Reply Last reply Reply Quote 0
                                      • Tania GhoshT
                                        Tania Ghosh @ulrik
                                        last edited by

                                        @ulrik Oh My God.... Amazing.. wow.. Thank you so very much. It is a New Year gift.

                                        :)

                                        Tania Ghosh

                                        ulrikU 1 Reply Last reply Reply Quote 0
                                        • ulrikU
                                          ulrik @Tania Ghosh
                                          last edited by

                                          @Tania-Ghosh I'm glad if it could be of any help, I had to learn it and document it for my self so why not share?

                                          Hise Develop branch
                                          MacOs 15.3.1, Xcode 16.2
                                          http://musikboden.se

                                          ulrikU 1 Reply Last reply Reply Quote 1
                                          • ulrikU
                                            ulrik @ulrik
                                            last edited by

                                            @ulrik I updated my test with saving, loading and deleting a preset via the OS dialog.

                                            However when deleting via OS dialog, on Mac it will say "Open" when it actually will be deleted.
                                            I don't know if it's possible to change the default OS dialog window text, anybody know?

                                            HiseSnippet 2893.3ocyaszbabbDdWJt1BfF1RJ1UpT4xXT4AnEEEHkrSpRVRfj.LAQjhrHnXEWJx1K1c.wHtXWjcGPJXUrJU4d9EjKoJ+GQ+Pxg7CHGxEcRGX5Yl8wru.VBRVwPuHlY5o+lt+5tmY1U655Xf87bbUTKs+3gXE0ORqyXaZ+M5qSrUZ2TQ8VZczOFidlG1EsqK1CSUVe7PcOOrohp509CrwoVZdE9m+6iWW2R21.G0jhxANDC7VjADZTq613IDKqM0Mw6SFHM562nsgi8FNVNi.LcMs5JC0MNR+P7S0YCaNME0OnkIg531gpSwdJpyuti43N8cNwVL9CHdjtVX1WVQoCLQhl2zwxjgXVqJazmXYtavZ2SAlkcirDWSXI9TssIljv1irH2f2AJRBY6g5bSBdqHCu5EGdpRvadA7toVGCWxPZTOLrsfVaaJ1smN3BjgkXrJys2uTaCGXD1zkGneDdSW3KgRT6qpWeIzWVu9hOnRYwut6cQnlXCKcWcJww1CAetyT9ToL3B8nni0CXLdb1yCQAp9PLcCmACcrguTqpzXpxzbRoYt9oHLaHUEnNRZPfdD2AbfuqtM1J2II0H4yUpVWFzTspGK7fUWB0S2xCOIstU2hoSXbUCr4LKd3v7PTGDnUjtsIBjGzf0HrGpmqyf77DwAS3D8PzymtEboJkQ47IagWmZuxrI1pylX2a1D69yfXOwt6JylXqNahAqsWjfMQrITgCh4.qdGdCn6.ju5o+sPXf.0AFNsOFUkM5pAjFfJoaYgLh3DdNrgMFY6PQm.4iQcwnQ1l3dDarI5j9XajGU2kRrODApsmiKeZAdK.OJj3tRYnsZD.a0e.hf9ZIB2xVX6Co8glu8sWrR4WKrGQ8+bxKXwSGvvVsnkIz7hOn7oQwB6CJbShEtyXOJFH8O7h7ILkFwEa.YoIXukPC0o84VGdVpl5TcDOcr6DS0I6kzGNjIlPJ+bcQXl4nEcUSpw0DxDOg2PQpvXSTpImSbXkHXyVspRUl8hkEYmgf+amNHS+E6X1ZrqqyIdwJm6M8L5Yr3YJnFOAH.QFwvEqax3I8.Psne+T2QAc6oerTuAPbKGcSeXfpsSmEKR4k7wDw1BHtndirMXYUQPhUX9OfnuSGVLmqiUsPx+RhnhHlIoWsfVBBTec7XXKGCcKD4AwaUxkJrs0R4D8qTrDp5Wr7.xqXUN7gXMe6g7D95zYNDZ1jwLeH2DtrErvVyamtuD7r0V7AoEIQbIS1DQjIk30YmwJmHV1DJhUSJvowmmSkQGz2obFZ14.CcWUWjoIem1FPVqtvt.qk1eJS2iwk1XjG0YvrymxhLIsOkoSmB6QroABvO7.Ge0pAlinv8sHdzzIMfbv7.bur3SgDIVDV5YbMW1j87W32QbhaBlQbLjCGIA2HTKKObjW+ZwmBFMIN8740eQBRvDrPQy8KcH10p9WrqtXfzSOFMxF3uqwHs.Ts1fN1G+pzQLQh0TDjkxlGOoqjJtMpJ2Wr3jiICr5qLk5jWrnxn0.O1rxzBNSLU0egvWPAaTnqfOaI7fr+Zxgxw1Te1AyoimjCm4m5LQogkm5mrhaYyzkVQ.FSwe+TRQXxdYCXOZRF0h6SESqHjxfYNE9zEKnebFJKwxdL6Uk.yomCTKZnKA737xRTmNT3aGVq5lirr1E1XU0LgOevm3Bw79gKh0dVCUhkrrQec6Cwl0l13BiGVI4HOMYCEt1THKJO5bRZVtj4nZS24B7IOltPKEqH0Ekty50VjmM5TjL6leJj7M1+zJXYJY6simme571hvYmLes.jwHG8jXjonCxzxlXKLclxxxjtMZDr6e94L4G0fYqpBm1P2x4P1QKI9GpzSerXDUQ3igwQ66L5v9gcaJ.gG7OFT3XmrbCAJvzw92RQGY6bBpO7G37KByIWq7i1vUF6RRXJQrdpBbJHwGraPmd9JNqfEwfu.EFl87tWviCvydJLaL0siavwYGW6mxYPkL34wXS6Sl.c8hsG+7oDW9YPOO4Hm5sNJuk+rDZqtVw1Emuc2OIGpJjIKHg1iio8SKUD+2zS6jiUL9kJKiXT2QTJrYhkP67DVrreFgQryD4i5z93r7e6bz5T6I6zJE5wXNpRE0CUJ8FdXhD104qBR9wtklT.aoo5pyvG6aMM+7n0AaAyt8N1gDaYeHXDW1vEqS4OKFWoCvvGMejL0v6MzOGlyJxPVH5a3klGJhuBnNC4Z.zrnuSSBA1UQJFxp0YOjhxklRFGNeHOZpLYI1kuyd9U9kkXWYkLM7BmgQL4yBKsnF1oZTBgPdFljXLdf6.ci9rEU6lKAGtdjkI+Ri8v8fM7yuoO8QPAdWxOHBsQS6ZDiGTE+VSE+TaS115jLhO0A1+EP7J+5xkJeZYTxt50Ky97WNVLJVFc6S9xWvZ1iFzkU9V3YBFnh57wejeZ4+H+jehjFBuiz.craaSnrMrj2CBTw2kB+zyZyNXN6YC52FLtgXWJgAA0l3iIFXwSJrjVSr2QP3kh5mExCTTuNk2aE+mi3V5cwVJDSE0xZ6Cav0BRtn7J4mi6X4ubBwj1Org292ZzGSNruzS3scCVRIE0OWqyZGzB8aPasyZMQa7rN6uy1nm0o0dnc2qUmV62QoGf+NjeH1SAVQBnkD.8i8A557hEbjtfV3EBJC0eUCIn9MMhCUERJn9nFDuscF.JS2EjTcNOXiys8ueB1SOUrRpnwWBGzdMXqmJxHrbdlxRb.lvRJCOz2Oc3ceeK4OWnegYCfvcEa.RYvHKJgkngAcLPE04rM0q08vfGjdoO3G+wyNhOaog8M7gMzSWm0cdEG4UzjpBkG5ea2hXby1Z9wZwHACzAcnoxDheSfJp+Zsfm1UY+c7sRvOrZvObOkhRTBOctBWOkiymIWhjDNc+7QRXfaBjj2XcdHIb8e4QRpjqQ8FZwOfYdvugyrvRRXsEqtaIVcRLGNaQrBVksDNcOk2q3ShhVX+m+gnU4E66d263plMyQsFjeqX7pJZRmXIKl0acuzXVehVyVa0Z+yG2ZAe.5ytRAOZwYV+h.8e4wsVHWC6szRdJhrfe8iuzXVeZvpaBbKEkQYvsTT9WuOGFSZ+wmnsuy53NvtEvlg9j+jJeQoo90oJr13koVPM88Gel1Aqs0yZ0As+Nn0agf5p60pYFESq2P1kTPTFcPn34kZL5bVaMf8.0SDzlmt11sTxhXbtQ4GIgxbg32VDFh.hk0Bqpj0VRjw7YmcVmj97OLWx7GnwdMYxChMvIg3iJ.I9bn4UyUyu7JVy2KWM6bEq46mmlQtWxZtiEANxuulYuxPRZ9eNVlJZlPyu8ayXSyW.MuZdZ9MGcEq46kql+qWTMuP7ne9Ie4J9mok5Dwxa.4QRn36eUBT7ueSJT7MMhuO.HB+r3458KAnbVVk.DsJmhHnsiCN8mlJ6qpWqP6s5C03WOQtmpo4zSq0twPcWPMR5KKaVgpNNO.mjlhs9hr1o0Y+8z6zJvVVrsUtfV3EPHSqn+eb4eceHk4pJIUHGdye784b7qzE1toVhK4qvmCOChcyhYGxphmbE4v8.F6xjCNg1iUTR+FJeCsscLGYoSi+xSydiw86.zdr2RY1ahrsGgNV9MJ+J4Mptnv8lZ6RnF8yFuykAdgH7qZ75+9oWQqUudXCZDXmWay+7U+KitxdNiXWL515TWBa+qOczfN.O2.CHwF3Rrq.ScNFWW785A495fsM4egE5324Jruq524JAcpLP2v046LDW7F6Mf+57V.LYy+OBPIssYeGshB+x3.4zpubckADSx2YXvLE2Avd1xr5LHy8lAYt+LHyWNCx7UyfL+tYPle+Dkg8+Ih0FAGGTDl.MraK9MTpp1xlkEgyHU9e.UN2XB.
                                            

                                            Hise Develop branch
                                            MacOs 15.3.1, Xcode 16.2
                                            http://musikboden.se

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

                                            34

                                            Online

                                            1.8k

                                            Users

                                            12.1k

                                            Topics

                                            105.8k

                                            Posts