Algorithmic Time Stretching for Samples
A New Dimension of Sound
Algorithmic Time Stretching for Samples
Hello HISE fam!
We're thrilled to share Lunacy's first product, CUBE, a virtual instrument in 3D space, built almost entirely with HISE.
This product has been in development for nearly two years and we couldn't have done it without this amazing forum and community. A huge thanks to @Christoph-Hart for developing this incredible open-source platform and for his help in debugging the product. Also, a big thanks to @d-healey for providing our impulse responses for the engine.
We really appreciate everyone's help and are looking forward to growing the HISE platform!
Find out more about the product here.
The Lunacy Team
This seems to be a hot topic with the new FileSystem API, so for those who need a starting place for building a custom mini-preset browser in HiseScript, here's a simple snippet showing how to achieve the most basic steps for:
Hope this is helpful!
A few extra things to consider:
How did you make the gui. Images or Vector or combination?
The 3D graphics are neither Image nor Vector. It's all OpenGL with JUCE, which means it's a real 3D interactive interface, not a vector illusion. This was the one element of the UI for which we had to add some custom HISE integrations. Fortunately, our graphics engineer is a total guru, so he was able to build a completely custom OpenGL interface in JUCE and then hook it up to HISE for interactivity.
Do you want to report a little about the genesis and the development ?
Sure! We come from the world of Kontakt development, but we were looking to make something more scalable and custom, so HISE was the perfect solution. I've always had a serious fascination with the intersection of visual technology and music production, so CUBE is our solution for blending those two worlds in a really fun, useful, and interactive way. All of us at Lunacy are professional composer and producers in Los Angeles, so we were able to record top musicians from around the city for the instrument, which was also a huge step in building the product. The graphical development, however, was very tricky, as it's really hard to get those graphics to work across all machines, but after many months of debugging we finally got there!
@beatskilz I hear you, but the product is actually 99% HISE Script (about 45k lines of it!), and the only part that isn't HISE is purely visual, not audio-related, so you could absolutely build the entire plugin with just HISE script if you didn't include the OpenGL graphics. We actually had a full version of the plugin built in HISE with just vector graphics at one point.
My point is simply to praise the HISE platform for its flexibility, and in particular, its DSP. You can do a remarkable number of things without needing any custom JUCE modules. But to satiate your semantic nitpicking, I just edited my original post to say "almost entirely with HISE".
And welcome to the forum! I see you joined yesterday and you're off to a good start
Ok, I will list you the order of events that I went through when trying to acquire a code-signing certificate:
I'm at about step 6 here and I think I'm going to give up. Agreed, probably not worth it.
Bug: Undo for ScriptPanels (would allow undo for all controls if this is fixed)
@DanH It's as if the contents of that file were right there in the script, but just replaced with that line of code
include. Definitely will make your life WAY easier!
In general, it's good to keep UI declaration and logic separated, so you might have different files for declaring different sections of your UI with other script files for their callbacks or other logic you might need. Though I'm guilty of breaking this all the time. It's hard to stay organized I think David probably knows the best ways.
Is there another way?
@DanH Are you using a text editor like Sublime? Or are you editing everything in one single file within HISE? The
include file call is your best friend here You can make your scripts more modular that way.
@iamlamprey Yup! The Orbits system is only timers and so far we haven't had any stability issues related to the Orbits system. We're running a fast timer in the
onTimer callback. The key for us was to really optimize any calls in the timer because every extra call can bump the processing up substantially. Use local variables, don't create new objects, avoid unnecessary API calls, etc. Also you'll want to make sure you set
Synth.deferCallbacks(false) so that the timer is in real-time and not deferred.
@orange Yes this was fixed. There was a timeout on the server call which would occasionally just not return anything if it timed out. Christoph fixed this a while back so you might be experiencing something different here.
@marcLab Hmm, it's hard to say without seeing a crash report or debugging on that machine. My guess would be that it's unrelated because we're only having issues on Cubase 9 on Mac, but everything works perfectly in Cubase 9.5 and above. It's related to updating the automation states of various knobs when preset switching.
@Christoph-Hart I'm sure it's a gargantuan task (but would be so awesome!)
We might have one of our JUCE devs add this for us. Maybe if you give us some guidance we can add it in a few months and merge into the public master repo later this year. I'm sure there are complications regarding which time stretching algorithm to use and how to weave it into the sampler component.