Best posts made by Christoph Hart
New Feature: SuspendOnSilence
I'm currently profiling a project I'm working on and noticed a rather significant optimization possibility: when there is no signal input, some FX can be suspended until a signal is detected and save some CPU. This might highly improve the idle performance of your plugin, which is important for big DAW sessions.
This is not a new idea (some DAWs implement this already) and in certain parts of the HISE codebase this is already implemented, but now I refactored it to a general system and also allow DSP networks to set the flag.
This is a simple overdrive going into a 16x oversample node. With the new
SuspendOnSilenceflag enabled, the CPU usage goes down to literally 0% if there is no signal present. You can try to disable the flag to check the effect (it's in the DspNetwork properties, next to the
HasTailproperties. The flag will be passed to the node compilation, so the HardcodedFX will inherit the behaviour of the network.
Be aware that this flag should not be used if your algorithm produces any sound from silence (eg. a test tone generator or a background noise player), because it will obviously mute the output when the input is silent.
You can also see the suspend state in the Module Tree, if a FX is suspended, it will show a S over the peak meters like this:
I've tested it rather thorougly and tried to cater in all use cases (polyphonic FX will also be suspended if the voice is not producing any sound), but please let me know if you find any issues.
There's also a preprocessor macro in the
HISE_SUSPENSION_TAIL_MS) which defines the time that the processing stays active after the first silence detection (the silence detection is pretty sensitive, so it looks for a -90dB threshhold), if you prefer a different default value, let me know.
In my project it yields a ~40% CPU improvement in idle mode and ~10% CPU improvement when in usage (because some channels of the plugin are not always busy). I also improved the performance of reading the peak values of routing matrixes, so this might also be a contributing factor though...
Who is back? The master branch is back.
After what might be the single most offensive violation of the
git flowbranching model in the history of software development, I finally found the motivation to merge the develop branch back into the master branch, which had a pre-pandemic state.
Also from now on, I vow to respect the traditions of software development:
- keep the master branch stable and build at all times so it can be a valid entry point for HISE newbies.
- use the develop branch for testing new features / daily development work.
- whenever I merge the develop branch into the master branch, I'll run a CI test that ensures that it builds HISE and exports a test project on macOS / windows so that @ulrik can stop being my human build bot for macOS and notify my that I broke macOS again... I will also try to bump the version numbers with each merge to master.
I'll expect the frequency of master releases to be a few weeks to months so the general advice that David healey gave in all videos since 2019 to use the develop branch for actual development stays valid.
Oh and I've thrown in VS2022 support so you don't need to crawl the web for an ancient version of 2017 anymore...
Faust is here...
I'm very thrilled to announce that the Faust integration is merged into the develop branch and ready to test.
The implementation of the Faust integration was a Google Summer of Code project that I was mentoring together with Stéphane Letz, @sletz from the GRAME Research Lab. The project was carried out by @etXzat which I would like to introduce with a warm welcome and I'm sure he's happy to answer some questions about the process or anything Faust related as he knows much more about the actual language than I do.
The Faust language allows you to write DSP algorithms using a very concise language. It's been around for quite some time and has a lively community of developers and a vast library of existing DSP algorithms that I know all of you are dying to play around with.
The current state of the Faust integration allows the full production cycle of using Faust within a HISE project:
- add the
- write / import Faust code using the LLVM Jit compiler. Parameters will be parsed automatically and show up as node parameters that can be connected / modulated like any other parameter
- export faust code as C++ nodes (a DSP network with a faust node will create a C++ class from the faust node and use the C++ class instead when you export the network to the DLL)
- reload them as HardcodedFX modules or nodes in scriptnode
@etXzat has written a extensive blog post about the integration process as well as the build instructions and a quick getting started guide:
By default Faust is disabled in HISE because it requires a few non-trivial configuration steps and let's be honest, HISE isn't the most easiest software to get started with so there's no need to make it even harder...
So if you want to dive into Faust development in HISE, make sure to read the build instructions on the blog post and let us know if there are any roadblocks (we've been testing it on all three platforms the last week but I wouldn't be too surprised if we missed some build issues).
Also we would like to start the discussion on what steps should be next as there are quite a few features that we couldn't realize within the projects timeframe but hopefully will be added over the next months:
- support for MIDI and polyphony (at the moment it's only possible to use Faust for audio effects)
- enhanced IDE features (editing within HISE, SVG path diagram preview, etc).
- support for complex data communication (tables / slider packs / audio files in Faust)
I've also added a new category in the HISE forum for anything faust related, so that this topic will not explode with all kinds of different questions.
- add the
RE: Ability to move sampler / synth / container modules around
Alright guys, here we go:
I tried to cover a few common edge cases, but I'm sure there's lots to discover when doing monkey testing, so let me know if you find glitches...
The definitive feature request & bug fix roadmap
this thread is the next attempt of organizing bug reports & feature requests. In order to keep it clean, I would suggest a few rules:
- Every post must be a distinctive bug report / feature request. If you want to emphasize a request / feature, upvote it or downvote it if you think it's a bad idea (but please do not downvote other stuff in order to bump your personal favorite). Any discussion about a certain bug / feature should be a dedicated thread (you can add a link to the discussion thread in the post).
- When I find the time to implement it, I'll sort the list in my head based on the number of upvotes and feasibility. If it's implemented, I'll edit the post with a link to the commit and strike it through.
- A feature request that is not feasible or not popular enough (number of upvotes less than ~5) will be removed after a grace period of a few days, so anything that survives this process can be considered to be implemented at some point. If you find your post to be deleted, please do not repost it.
Normally I don't to any redacting / moderating, but in this thread I try to keep it clean, so don't take it personally if I delete any post in here that violates the rules above.
Updated Build instructions
So time went on and I simplified the build process for Faust a bit so I thought I'll post the build instructions (or the link to the instructions) here and update the post once it changes:
No Projucer modifications necessary!
- Download and install Faust to the default path (
C:\Program Files\Faust). The latest version is available here: https://github.com/grame-cncm/faust/releases
projects/standalone/HISE Standalone.jucerand click on Save and Open in IDE
- Change the build configuration in Visual Studio to either Debug with Faust or Release with Faust. This can be done with a drop down menu in the toolbar (which initially says Debug).
- Compile this configuration. HISE will have a text label in the top bar indicating that Faust is enabled.
Then you just need to add the directory of the Faust installation to your HISE settings under
FaustPathso that it can find the Faust libraries and you're good to go.
I'll lock this topic and pin it to the top now.
- Download and install Faust to the default path (
RE: Scriptnode is fun!
Alright, I'm currently trying to improve the user friendliness of the export process to make it even more fun. Let's be honest, HISE will never win the "Most easiest app to use"-award, but this is ridiculous even for my low standards :)
So this is what I've done so far:
- You don't need the snex_workbench anymore to compile the networks - there's a item in the Export menu in HISE that opens the same dialogue. It requires you to have at least one DSP network in your signal chain when exporting, but there's an error message that will tell you this.
- There's a command-line option to do that process, so you can call
HISE.exe compile_networks -c:Debugand it should do everything for you.
- It will show which nodes are about to be compiled in the export dialog. After the compilation, you can query the state of the loaded DLL with Tools -> Show DSP Network DLL Info.
- You should not rely on the workbench like @dustbro suggested anymore - if you choose "Create a network file" in the scriptnode welcome screen, it should create a file-based network that you can export as DLL (just remember to save the network using the save button before hitting the DLL export).
- I am currently writing unit tests for scriptnode in this repository. This includes also a few test nodes that are compiled and tested against the interpreted node. All the nodes here are supposed to be compileable on macOS and Windows (at least with my setup). If you encounter a DspNetwork that throws a compilation error (or crashes on loading), please post it as issue in this repo, then I will create a test file from it and make sure that it works.
Latest posts made by Christoph Hart
RE: Transport + Synth.deferCallbacks(true)
@aaronventure You can control this individually for each callback and the deferCallback() for the other callbacks do not apply here.
You can specify the mode when you pass in the callbacks into the register functions. Be aware that each transport handler has two slots, so you can register two different callbacks for the synchronous and asynchronous execution.
RE: The made with Hise plugin company list
While I love a good detective work to find out who's using HISE, I think this company is using plain JUCE like suggested in the video (based from the screenshots I saw). The button on the top right is using the stock JUCE look and feel which is overridden in HISE so you would have to modify the source code of HISE to revert back to the default look and feel, which I think nobody would do (if they care about this, they would have implemented their own look and feel).
I haven't spend more than two minutes on this though, so if you have more incriminating evidence (usually the preset browser gives it away), I could be wrong.
RE: YAPTSA - Yet another Pitch./Time stretching Algo.
@aaronventure could mess with the tempo syncing of loops but it might be worth a try. I think the latency is independent from the actual pitch factor (so that even at 1.0 it requires some preprocessing) but I check again.
RE: YAPTSA - Yet another Pitch./Time stretching Algo.
@d-healey I'd rather try to find a solution for the initial CPU spike problem than put in another library into the HISE codebase - Bungee (non)-Pro sounds OKish, but the way that the voices are handled currently in HISE, it will cause the exact same CPU spike as the current signalsmith library. Also there's no information about how much the Pro license costs (just like it was with HISE for the first 8 years lol now I get why nobody is using it).
The problem is that it has to process ~50ms of samples before the timestretcher gets some output, so I have to do this all within the first audio buffer, which causes the spike. If somebody has a smarter idea of how to solve that I'm all ears, but it has to be dynamic to be able to cope with tempo changes / modulation values.
Maybe I'll open a github issue in the signal smith library, maybe the author has an idea how to solve that.
RE: Haha the easter bunny has delivered.
@d-healey It skips the reanalysis for files that have been analyses once (per runtime, there is no persistent cache). This improves some workflows a bit where you want to analyse once and then apply different functions on the analysed data.
Btw I‘ve changed the Loris integration to be included in the HISE build so you don‘t have to do this dynamic library hassle anymore (it‘s painful enough with Faust but I think here it is not really required). Does it work on Linux? I‘ve just tested Win and macOS.
RE: Thank you Christoph
wow, that escalated over night! VI-Control PTSD incoming...
There's too much to address here by now, but I'll try:
- There is no real argument to have against "HISE needs more docs" and I always have that eternal nudge where I try to do proper documentation (and I think that most of the new features I add to HISE are much better documented than the old / existing stuff as I tried to make it a habit of considering the documentation part of the implementation of a new feature). However I consider this forum the main source of information (after doing a quick search around in the docs and watching at least the introduction videos to HISE from Dave). Is this different than with KONTAKT? Yes, but it's a valid approach, there are many people present in this forum (with Dave being the OG) which offer super helpful advice that often goes beyond what a documentation can provide. Does that get me out of the obligation to write proper docs? No, but it's a very powerful band aid :)
- The growth rate of HISE is perfectly fine for my taste - I also think that using the marketing method of people having to find out about HISE instead of it being shoved into their face in their social media feed pretty much correlates with the follow-up user experience during development and the people who made it through this process are kind and smart enough to create a good community like here (just go over to KVR to see what kind of people exist outside our bubble lol). So in my mind the decision between marketing HISE or not boils down to "Do I need more money in my bank account but then having to deal with idiots on a regular basis?". So whenever you see HISE ads popup before a Youtube video you can think "Poor Chris, apparently he got a rent increase and now has to respond to people posting in all caps only"...
- I don't think that there is a single factor that prevents "big" companies from using HISE (and I have adjusted my expectations over time to accept that there is only a fraction of the market that might be interested in / benefit from a platform like HISE). I can imagine that it's simply a combination of a high Bus Factor as well as the availability of C++ developers that can implement things without any outside dependency if the budget is there that makes people avoid relying on a "high level" framework.