I know that it would introduce delays and require a lot of DSP horsepower, but being able to use extremely short impulses for guitar cabinet modeling would be wonderful. I know there was some requests for iFFT capabilities before. Is this possible right now? Is it planned? Are there other ways to model cabinets with filters?
Short Convolution (Guitar Cabinet Modeling)
Was looking into making a reverb using FIR filters the other day. Didnt get as far as patching, only reading and from what I read you can probably use a FIR filter for short impulse response too. Need to read a lot more about it. BUt i think the FIR filters can open up another level in Axoloti. Just need to understand how they work first
Point 3.0 about reverb modeling got me on the track that it might be possible to use impulse responses with FIR filter in Axoloti.
http://musicweb.ucsd.edu/~sdubnov/Mu172/Lectures/ReverberationDevicesAndGettingStarted.pdf
Doing FFT convolution in a short buffer environment calls for partitioned FFT convolution, quite some work, and is low on my priority list. I have not worked out how much is feasible in Axoloti. And perhaps subject of active patents...
Other possibilities for cabinet modelling, perhaps a mix of tapped delay lines and biquad filters, but hard to match all the coefficients to a given impulse response.
Contributions would be welcome!
@jaffasplaffa
Direct FIR filters will not get very far in terms of impulse response length.
Ok thanks, Johannes
Still reading up on it. IIR filters would be needed for the longer relections? And FIR for the early reflections? But for amp modeling, maybe it could be used There was just a few things in the link above that caught my eye and made me want to study it a bit further, just as a new approach to do things and reach new areas
Also a piece of the manual for the Axe Fx from Fractal Audio also mentions something about FIR filters being a big part of amp modeling. On FIR and IIR and amp modeling, Page 4, "simulation basics":
http://www.fractalaudio.com/downloads/manuals/axe-fx-2/Fractal-Audio-Systems-MIMIC-%28tm%29-Technology.pdf
"FIR filters are complex filters suitable for a wide range of filtering tasks and most products use FIR filters (commonly called IRs) for their speaker simulations, sometimes in conjunction with IIR filters. "
I am focusing on the "sometimes": sometimes means it is possible to make amp modeling with FIR alone and will persue that idea But no idea how complicated we can go or how complicated it would be... BUT there are loads of impulse responses, copyright free that we could use without getting in trouble Maybe loading impulse respons in a table combined with the FIR filters in some way... Even more options for creativity in Axoloti
EDIT: ahh yeah I see maybe Impulse Responses are patentet and therefor that technique can only be used if you pay for it?
My attention turned to these filters, also the allpass, cause I wanted to create an EQ.. I got a 1 band eq with cut/boost function working using allpass filter, invertes and bandpass filters and thought I wanted to explore the FIR filter too. I think they can be used for all kinds of things that I am interested in. Like creating all kind of effects from scratch.
But now I am out. Second Axoloti boards output just died too Have no idea how to fix either of them.
But will have to rest on it and see what I can come up with tommorow..
Thanks for the information so far, jaffasplaffa and Johannes. I'd truly appreciate collaborating in this effort either way! I have plenty of opensource cabinet impulse responses and use convolution in this way regularly with VSTs and some apps on iOS. I don't think patents would be an issue, but the size of the impulses would definitely need to be very small. I have impulses that range in length, but I think 5-20ms would work well for this. How could we approximate with a FIR? Or how could we use delayed taps and use biquad filters? I think some if the opensource CAPS LADSPA plugins might also be a good start.
Yeah lets see if we can get anything going. Though again I think i am out for a while cause of the default boards. Two on same day.
Wil have to look into fixing the boards in some way first.
I suppose the limit on the FIR filter object (16 coefficients) is the same issue as with longer FFTs: that the sample buffer is 16 samples, so that is the longest you can do "easily". 16 samples is 1/3 of a ms, too short even for typical audio frequency filters.
Kassu, would you know how to use that to create an extremely short convolution capability? I'd even be willing to try that by slicing the impulse to 16 samples, but I wouldn't know what to do with it. Also, what do you think about jaffasplaffa's idea of chaining them in serial?
I don't know the best solution to this, but the algorithm linked below might be roughly what you need to do. I'm pretty sure you have to implement this as a custom object to stand a chance, and I'm not able to write it myself.
The idea seems to be chopping the input signal in pieces, and convolve each piece with the entire filter kernel (inpulse response). Then you need to add the result for each piece together, with a certain amount of overlap. If I understand the algorithm correctly, you need one extra memory buffer with the length of the impulse response + 16 samples (the piece length), which sounds feasible. I don't know what the limits on axoloti are, basically how big a convolution can you do in the time of 16 samples...
there is an example of an overlap add shifter in Axoloti.
Tutorial 22.
But I dont understand what is going on in the patch yet.
@kassu "partitioned convolution" removes the latency inherent to the method described in that wikipedia article. The term "overlap add" also covers other things than the FFT convolution described in that article.
That's a different "overlap add" than in that pitch shifter.
A rough estimate - implementing direct convolution (pretty simple, far easier than implementing regular fft convolution or partitioned convolution), should work out up to around a 1600 samples impulse response length, ~ 33 milliseconds) for mono in/out.
Sweet! So it should be possible as long as the impulse sample is 33ms or less! Can it be done with current objects, or would this be a future object or addition to the core code?
Reverbs creation
This can't be done with current objects, it requires development of a custom object.
Reverbs creation
Is that something you would consider implementing sometime down the road? Would be a great addition to Axoloti. No rush on it. Just curios if you have thought about it
Thanks.
I'm derailing the topic a little here, but I was just looking through the CMSIS DSP library documentation, and there is an example of a convolution setup using the library's FFT functions.
Assuming CMSIS DSP is available to custom objects, could this example be adapted to make a spectral morph between two s-rate audio inputs? If so, would it work with two 16-sample buffers, or would it be necessary to aggregate several buffers (and increase latency)?
a|x
I have pushed a convolution object and help patch to the 1.0.10 factory library, "filter/convolution", using version 1.0.10 "sync libraries" should get it to you.
I also added an example synth patch in axoloti-factory/patches/demos/synth/dreamy.axp
I haven't tried cabinet modelling with it, but should do fine
edit1: OOPS: the length is fixed to 1024 samples, working on a fix...
edit2: fixed...
Hey @johannes
Nice. Fun to play with. Thanks But I think the object would benefint a lot from having a modulation input for the coefficients, like the FIR filter has. I think that will help eliminate some of the "digitalness" of the sound of the object.
Johannes!
Fantastic work! THIS was what I was wishing for! I replaced the noise input sources with various cab impulses and rocked out! I put an awesome distortion with gate in the front and an eq, delay, and small reverb module in the mix and am running at around 80%. I actually tried a more lush reverb, but it used too much sdram.
The ONLY problem I have is that I have to push the button for the impulse to be read into the table, so it doesn't work in stand alone mode. Any ideas on how to have an impulse auto load to the table?