Hey, i am trying to create a Convolution Reverb, for my Synth Plugin I am currently working on.
I have a couple of questions, which are probably not that smart, because i am relatively new to C++ and dsp, but having a blast learning it. Just feel a little stupid sometimes, but this forum helped me a lot in the past, so i thought I`ll just ask.
I’ve read that it`s a good idea to use a non-uniform partitioned convolution algorithm for a reverb. So i tried an external library (FFTConvolver from HiFi-LoFi) as well as the JUCE one. But it seems like i am using it not right.
In both cases i had an CPU Usage that was extreme High (up to 90%), depending on my BufferSize, but never lower than 16% (On 1024 Samples BufferSize). In the intialisation, i tried multiple headsizes (and tail sizes on FFTConvolver) but it did not really change much. I have the feeling, that i probably use it wrong. As mentioned in multiple posts , the JUCE convolution is not the best for long IR’s, CPU wise, but that high of a CPU Usage seems a bit heavy, especially running in the same problem with JUCE as well as FFTConvolver. So here are a couple questions:
- Does the JUCE Convolver (in non-uniform “mode”) have multiple convolution Engines, and splits the Impulse response according to the defined head size or do I have to do it manually? (probably a dumb question, depending on the non-uniform part, but because nothing changed for me from uniform to non-uniform i ask it anyways)
- Is it generally a good Idea to set the maximumBlockSize in the specs high or to the host buffersize?
- Is there anywhere a good example or tutorial on how to implement it properly, to function with a longer Impulse Response?
- Does the MessageQueue help to optimize the performance, if I don’t load new ir’s or specs and if so, how do I use it properly? Probably also a dumb question, but I honestly don’t understand for what it`s needed, because I dont know what engine-updates the convolution engine sends. Pretty new to this field, as I said^^
- Is creating an audioBlock or a processContext realtime safe? My current understanding is that it`s some kind of pointer, but that could be completly false^^
6.Would it be a good idea to split the impulse response into a head part and a tail, and use one convolver without latency, and one with latency? Or is that (like I think) what the non-uniform convolver does?
If you have any recommendations for how to use this or another library efficiently, or where I can learn about this topic i would be very thankfull. I hope to somehow set it up in a way that has no heavy latency.
As a sidenote, i also wanted to try the wdl library by cockos, but it was super confusing to me, and i have not found any documentation. If there is one out there I would appreciate a link to it ![]()
Thanks a lot in advance, and sorry again for the probably noobish questions.
If you have anything to say to this topic, even if not asked or mentioned in my post, i am very happy to hear about that.
