Hi Fons,
Here is a quick solution using Faust :
import("filter.lib");
line(i) = vgroup("line %i", *(g) : fdelay2(1024, d))
with { g = vslider("gain (dB)", -60, -60, 4, 0.1) : db2linear :
smooth(0.995);
d = nentry("delay (samp)", 0, 0, 1000, 0.1) :
smooth(0.995); };
process = hgroup("", par(i, 10, line(i)) );
The first line imports a library of filters (written in Faust by Julius
Smith) that includes several fractional delays based on Lagrange
interpolation.
Then we define a 'line' that combines in sequence (':' operator) a gain
and a fractional delay encapsulated in a vertical layout. Here we use
fdelay2 a fractional delay with a second order Lagrange interpolation.
It can be replaced by fdelay3 or fdelay4 if better interpolations are
needed.
The gain value g is defined by a vertical slider (in dB) which is
converted in a linear value and then filtered to avoid clicks during
rapid movements. The delay value d is defined by a numerical entry box
also filtered to avoid clicks. The parameter m is the maximum size of
the delay and should be a power of 2.
The last line defines process, the equivalent of main in C, as a
parallel composition of 10 lines.
A fully functional jack application can be easily generated using the
faust2jack command or by pasting the above code in the online faust
compiler (
http://faust.grame.fr). The performances on my Vaio laptop
(Intel Core 2 CPU T7400 @ 2.16GHz) is approximately of 2%.
Cheers
Yann
Fons Adriaensen a écrit :
On Fri, Jan 25, 2008 at 12:57:19PM -0500, Stephen
Sinclair wrote:
Also, nice in the fact that you can do per-sample
computations easily,
How ? I seem to have missed something...
Because you can wait in a 1-sample loop?
Yes, it will use your whole CPU for a loop like that, but this thread
is about prototyping. Obviously you'd rewrite in C for a real
application.
I never claimed chuck is perfect, but I've been liking it a lot
lately. Sure, it can have performance issues depending on how you use
it, but the nice thing is having the option to abuse it that way when
necessary.
This is one of the things I wanted to create a 'rapid prototype'
for recently. I needed a jack client implementing:
- a delay line,
- allowing high-quality fractional-sample delays,
- at least 12 outputs, for each two controls: delay, gain,
- smooth 'crossfading' between two control sets, both delay
and gain, controlled by a GUI or by OSC.
It should not take more than 20% CPU on a 2G P4
(other things have to run at the same time).
If you know how to get this faster than by actually
writing it in C++, please let me know !