@David-Healey Thanks! That might work.... will have to try it out.
Posts
-
RE: mousewheel scrolling in a custom script panel - possible?posted in General Questions
-
47f54ba6f - remove Content.setColour & ScriptComponent.setColour - why ????posted in General Questions
In the HISE develop branch these commits perform a removal of the setColour
47f54ba6f - remove Content.setColour & ScriptComponent.setColour
0319df243 - remove Content.setColour & ScriptComponent.setColourIt looks like they've just been straight up replaced with .set() calls ?? Why the change?? Just curious.
-
mousewheel scrolling in a custom script panel - possible?posted in General Questions
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.
-
RE: Loading wavetables by drag-and-drop takes a long time??posted in General Questions
@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.
-
RE: Loading wavetables by drag-and-drop takes a long time??posted in General Questions
@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.
-
RE: Loading wavetables by drag-and-drop takes a long time??posted in General Questions
@dannytaurus Hilariously.... they don't sound the same!! The WAV file sounds markedly different to the HWT file here!
-
RE: Loading wavetables by drag-and-drop takes a long time??posted in General Questions
@dannytaurus You legend, cheers!! Will try it out!
Dohhh.. I was even posting in that thread, haha!
-
Loading wavetables by drag-and-drop takes a long time??posted in General Questions
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.
-
RE: Crash when loading files into Wavetable Creator (Resample Mode)posted in Bug Reports
For me it crashes whenever I try to load a 44.1kHz sample into it.
-
RE: Crash when loading files into Wavetable Creator (Resample Mode)posted in Bug Reports
Still crashes. Any word on this??
-
RE: Using custom preset system - as in the actual presets themselves, not a browserposted in General Questions
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??
-
RE: HISE Transformation to the new ageposted in AI discussion
@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.
-
RE: Agentic coding workflowsposted in AI discussion
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.
-
RE: Using custom preset system - as in the actual presets themselves, not a browserposted in General Questions
@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.
-
RE: Using custom preset system - as in the actual presets themselves, not a browserposted in General Questions
@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.
-
RE: Using custom preset system - as in the actual presets themselves, not a browserposted in General Questions
@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???
-
RE: Using custom preset system - as in the actual presets themselves, not a browserposted in General Questions
We're covering a lot of this in this thread:
https://forum.hise.audio/topic/13701/custom-browser-custom-preset-file-format/29Basically, 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.
-
RE: Third party HISE developersposted in General Questions
@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!)
-
RE: *sigh* iLok ......posted in General Questions
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.
-
RE: C++ External Node & XML Issuesposted in Bug Reports
@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.
