Expansion User Presets
-
HI_ENABLE_EXPANSION_EDITING
Ah that one, it's the gate-keeper so that "normal" plugins will not be cluttered with all this expansion stuff.
Alright, small homework assignment in C++ coming in...
You need to somehow redirect the folder that the user preset browser is "listening" to - just like most things in HISE (and JUCE) it follows the listener paradigm). In order to do so, you need to register the preset browser to the expansion handler to be notified when an expansion is changed and then rebuild the preset list:
- Inherit the
PresetBrowser
class fromhise::ExpansionHandler::Listener
- Register it to the global
ExpansionHandler
in the constructor of the preset browser (and deregister it in the destructor) - overload
expansionLoaded()
and set therootFile
to the user preset directory of the currently loaded expansion (currentExpansion->getSubDirectory(FileHandlerBase::UserPresets)
is your friend - Call
rebuildAllUserPresets()
to recreate the preset structure.
Disclaimer: I am not sure this is enough, but just from looking at the source code it might work.
Make sure that it compiles with the
HI_ENABLE_EXPANSION_EDITING
flag disabled (you will need toifdef
your additions).The master class is to make this a property of the floating tile (with the default being deactivated) so that you can turn it on and off depending on whether you want it or not...
- Inherit the
-
@Christoph-Hart Thanks for the detailed explanation. I shall get to work!
-
It bloomin works!
The missing piece to get the preset browser columns to refresh properly
File cat = PresetBrowserColumn::getChildDirectory(rootFile, 2, 2); File preset = PresetBrowserColumn::getChildDirectory(rootFile, 3, 3); bankColumn->setNewRootDirectory(rootFile); categoryColumn->setNewRootDirectory(cat); presetColumn->setNewRootDirectory(preset);
Tomorrow I will tackle the
ifdef
part and see if I can make this thing accessible through the scripting API so I can get back to my beloved HISEScript.I'm thinking the
HISE_ENABLE_EXPANSIONS
flag would be more appropriate than the expansion editing one, but tell me if you think otherwise. -
@d-healey said in Expansion User Presets:
and see if I can make this thing accessible through the scripting API so I can get back to my beloved HISEScript.
Well it turns out that was easy to do! But how do I get my new function to show up in the API collection in HISE?
-
I am using this batch script that runs doxygen over the scripting Cpp files and converts the XML output to a ValueTree that will be embedded into HISE.
It's only available for Windows (where I do the bulk of development) though
-
@Christoph-Hart Shall I make a pull request once I've finished tinkering and tested everything? Then it will be picked up next time you run your script.
-
Seems that
Engine.getExpansionList();
doesn't work if callbacks are deferred, what is the reason for this? -
False alarm, it seems that it's just being weird and complaining sometimes when I open the project. If I can pin it down to something specific I shall let you know.
-
It might be possible that
ExpansionHandler::createAvailableExpansions()
is being executed after the deferred script execution.What you could do is to add some logging code to this function as well as to the script function wrapper around the
getNumExpansion()
function to see in which order they are executed and if this varies if the scripting callback is busy with a complex onInit function (btw, I saw you usingstd::cout
, but the JUCE way for logging stuff is theDBG
macro). -
@Christoph-Hart Ok cool, I'll run some tests.
-
Do expansion sample maps need to be loaded in a special way?
Inside my HISE project it seems to find them just fine but when I run the exported application I'm getting errors
WARNING: Not found: {EXP::Kazbek}duduk_staccato.xml JUCE Assertion failure in ExternalFilePool.h:1124 JUCE Assertion failure in ModulatorSamplerData.cpp:762
-
@Christoph-Hart said in Expansion User Presets:
It might be possible that
ExpansionHandler::createAvailableExpansions()
is being executed after the deferred script execution.I did some simple tests and it seems that everything is fine, I also haven't noticed the problem in my project happening again so I think it was some mistake I was making.
Get list always seems to be called after create available :)
CREATE AVAILABLE EXPANSIONS GET LIST OF EXPANSIONS GET LIST OF EXPANSIONS Resizing interface Change scale factor GET LIST OF EXPANSIONS
-
I think I might have solved the samplemap thing.
I was loading the sample map as
{EXP::Kazbek}duduk_staccato.xml
in my script. But it seems that I only needduduk_staccato.xml
and HISE automatically works out that it's a sample map that belongs to the active expansion and fills in the rest.So in my HISE project I need to specify the full sample map name but when I export I don't need to.
There's still some other funny stuff going on in my exported app but at least I seem to have figured out this one :)
-
So in my HISE project I need to specify the full sample map name but when I export I don't need to.
Well that's bad. You definitely shouldn't branch the script logic whether you're in HISE or in the compiled plugin. I'll take a look why it doesn't work.
-
Also it seems I was premature when I said my test show everything as fine. I've now tested it with my larger project (probably should have done that before) and the scripts are being called before create expansions. I'll look into this some more.
This is the same with deferred callbacks enabled or disabled (which makes sense I guess since it's the init and control callbacks).
Compiling all scripts Unknown function 'loadDataFile' This expression is not a function! no iterable type Adding plugin parameters Restoring global settings Setting disk mode Samples are validated. Skipping reference check Loading samples CREATE AVAILABLE EXPANSIONS
Edit: Actually the get list function is being called first. I'll shut up now until I figure this out :p
-
Ok, after lots of poking around and head-scratching, I figured it out (as you thought)
createAvailableExpansions()
isn't being called until aftergetExpansionList()
. So what I've done is put a call torebuildExpansions();
inside the expansion handler constructor, do you think it would be more appropriate/better to call it from thegetExpansionList()
function, or somewhere else?The other piece of the puzzle was I had
HISE_ENABLE_EXPANSIONS=1
but notHI_ENABLE_EXPANSION_EDITING
. So theHelpers::isValidExpansion
was returning false. I've modified this to check for file based expansions as well as encrypted without needing editing enabled. Let me know if there is a better way to handle this too.Also now I got around this issue I noticed my sample maps weren't loading again :( so I reverted to the previous format and it works, so not sure what was going on before but the correct format both in HISE and the exported app is
"{EXP::" + expansionName + "}" + sampleMap + ".xml"
-
I've created a pull request. I noticed that my text editor seems to have saved every blank line as a change which unfortunately clogs up the changelog a bit :( I'm assuming this is due to the line ending difference between Windows and GNU/Linux so next time I make edits I'll switch to Windows style line endings and see if that solves it.
-
Yeah I try to figure out how to show the actual diffs, because I can‘t check in stuff into the precious codebase without reviewing it ;)
-
Not sure if you noticed, but I merged the request and ran the API generator over it so you can use your script functions now in the "official" branch.
-
@Christoph-Hart Oh excellent, I noticed the merge but forgot about the API generator :) I shall rebuild.