Time Stretching
-
Is this a possibility? :D
-
There is one Timestretching library called Rubberband which may find its way into HISE one day, but it's also dual licensed so it adds some licensing costs for closed source projects (only if they use it of course).
The other libs (zPlane, Elastique etc.) are way too expensive and / or don't supply a GPL version...
-
What about the SoundTouch library?
-
It's not actual timestretching (but rather a very simple algorithm that doesn't sound very convincing) plus it comes with a latency of about 100ms so it's not really usable for real time streaming.
-
aha that's fair enough.
-
Time to dig up this ancient thread.
What's the latest with getting Rubberband into HISE, can we do it via some scriptnode magic?
-
@d-healey Third party node should be able to do it, IIRC it has a single .h file that has the entire library inside it for easy importing, I couldn't get it working but I really only tried for about 5 minutes before my goldfish brain kicked in
-
@iamlamprey said in Time Stretching:
@d-healey Third party node should be able to do it, IIRC it has a single .h file that has the entire library inside it for easy importing, I couldn't get it working but I really only tried for about 5 minutes before my goldfish brain kicked in
Oh interesting, I might have to give it a go.
-
-
Ah I think I'm getting a bit further, I forgot about the node template generator!
-
I think for now this is beyond my C++ level. I'll come back to it again at some point unless someone else implements it first (pleeeeaaaassseeee!!!) :D
-
@d-healey said in Time Stretching:
I think for now this is beyond my C++ level. I'll come back to it again at some point unless someone else implements it first (pleeeeaaaassseeee!!!) :D
Thanks for giving this a go, David! This is indeed an attractive feature for hise! Can't wait for this to work. My C++ is much worse than yours, but perhaps not this guys:
The Audio Programmer - "Implementing a TimeStretching Library (RubberBand)":
https://youtu.be/XhmM8HZj7aU?t=1721
(It's a live stream, so watch in 1.5x speed :) , not sure it gives you more insight than you got cause it's for JUCE. Perhaps the Hise part is more difficult)
-
@andioak Ah thanks, I'll check it out!
-
@d-healey I know somebody is working on it and has already implemented a node with rubberband so yes it‘s definitely possible and not too difficult to pull off.
-
I think I'm making some progress with this, thanks to the video @andioak posted.
However inside HISE, after I've successfully compiled my node, I'm not able to see it in the scriptnode workspace or in the Hardcoded Master FX. It tells me it can't find the dll. Any ideas?
Edit: If I remove this
std::unique_ptr<RubberBandStretcher> rb;
from my node it will show up in HISE. I don't know why though, or what to use instead. -
@Christoph-Hart What data is in data and how do I access it?
template <typename T> void processFrame(T& data) { }
-
//processFrame is the audiobuffer 1 sample at a time: template <typename T> void processFrame(T& data) { for (auto& sample: data) { sample *= .5; // Volume @ 50% // do other stuff } } //you can also do it this way (the method directly above processFrame): template <typename T> void process(T& data) { static constexpr int NumChannels = getFixChannelAmount(); // Cast the dynamic channel data to a fixed channel amount auto& fixData = data.template as<ProcessData<NumChannels>>(); int numSamples = data.getNumSamples(); //data also has some of its own methods you can call, like getNumSamples() for (auto ch : data) { dyn<float> channel = data.toChannelData(ch); for (auto& sample : channel) //For each sample, same as processFrame { sample *= .5; // 50% volume } } //now we don't really need this stuff, since we did it manually: /* // Create a FrameProcessor object auto fd = fixData.toFrameData(); while (fd.next()) { // Forward to frame processing processFrame(fd.toSpan()); } */ }
-
@iamlamprey Thanks! How did you figure it out? Any idea why my node won't show up in HISE?
-
@Christoph-Hart If you're really interested, I could arrange something with zPlane.
-
@clevername27 Elastique would be a good addition! We'd still need Rubberband as a baseline because the other algorithms don't have compatible licenses.