Implemented "3D" circular delay

So you can do this in the box already with the Dual Delay type.

Example:
Type: Dual Delay
Feedback L: 50%
Feedback R: 50%
Feedback L->R: 33%
Feedback R->L: -33%

Basically you want your "feedback matrix" to be:
Code:
|    a    b    |
|   -b    a    |

The value of 'b' determines how fast the echoes "circulate".

If you change the sign of 'b' the echoes will move in the other direction.

If you invert the phase of one of the channels the echoes will start behind you.
Thanks a lot!! Gonna try this as I get home
 
For those who are interested in how I derived this:

A feedback delay network with a unitary feedback matrix will have no "loss". A "circulant" feedback matrix circulates the data through the delay lines. This is just math-speak for cross-coupling of the delay lines.

So start with a lossless feedback delay network.

First you want a unitary matrix. A unitary matrix is such that A* A = I.

If we let A =
Code:
|  a    b   |
|  c    d   |

Taking A* A we get:
Code:
| a^2 + b^2    ac + bd    |
| ac + bd       c^2 + d^2 |

To get the identity matrix we need ac + bd = 0 and a^2 + b^2 = c^2 + d^2 = 1.

if we let c = -b and d = a we get
Code:
|  a^2 + b^2    -ab +ab   |
| -ab +ab       a^2 + b^2 |
=
|  a^2 + b^2     0   |
|  0       a^2 + b^2 |

Now use just need a^2 + b^2 = 1 which is simply the quadratic equation.

If a^2 + b^2 < 1 then the echoes will decay. If a^2 + b^2 == 1 the echoes will continue on infinitely. If a^2 + b^2 > 1 the echo intensity will increase. Therefore you need to be a bit careful as you can introduce runaway feedback at high values of 'a' and 'b'.

I could make this a dedicated type with parameterized controls to simplify programming and protect against runaway feedback. Not sure if there's enough interest though.
 
Last edited:
friends fail GIF

img GIF
 
For those who are interested in how I derived this:

A feedback delay network with a unitary feedback matrix will have no "loss". A "circulant" feedback matrix circulates the data through the delay lines. This is just math-speak for cross-coupling of the delay lines.

So start with a lossless feedback delay network.

First you want a unitary matrix. A unitary matrix is such that A* A = I.

If we let A =
Code:
|  a    b   |
|  c    d   |

Taking A* A we get:
Code:
| a^2 + b^2    ac + bd    |
| ac + bd       c^2 + d^2 |

To get the identity matrix we need ac + bd = 0 and a^2 + b^2 = c^2 + d^2 = 1.

if we let c = -b and d = a we get
Code:
|  a^2 + b^2    -ab +ab   |
| -ab +ab       a^2 + b^2 |
=
|  a^2 + b^2     0   |
|  0       a^2 + b^2 |

Now use just need a^2 + b^2 = 1 which is simply the quadratic equation.

If a^2 + b^2 < 1 then the echoes will decay. If a^2 + b^2 == 1 the echoes will continue on infinitely. If a^2 + b^2 > 1 the echo intensity will increase. Therefore you need to be a bit careful as you can introduce runaway feedback at high values of 'a' and 'b'.

I could make this a dedicated type with parameterized controls to simplify programming and protect against runaway feedback. Not sure if there's enough interest though.
+1
 
Just tried this and it works perfectly (obviously). Also tried the formula to obtain infinite repeats and it's a bit tricky to get values that sum exactly to 1, but it works quite good too.
By messing with those parameters you can get some cool combinations, like this "rotating ping-pong" by setting "b" to much higher values than "a".
And by panning the signal to one side before entering the delay and setting Spread to -100%, you can get the first repeat on the opposite side.


Just when you think you've found something the Axe can't do and it turns out it can actually do that and more... :sweatsmile:
That's one of the outstanding pros of using a Fractal device!
 
If you change the sign of 'b' the echoes will move in the other direction.
What would happen if 'b' was attached to a LFO that slowly swung from a negative number to its absolute value, then returned back? Would it slow down, reverse direction, accelerate, then slow and reverse again?
 
What would happen if 'b' was attached to a LFO that slowly swung from a negative number to its absolute value, then returned back? Would it slow down, reverse direction, accelerate, then slow and reverse again?
Yep, but the problem is the feedback changes while doing so, so to keep it constant you'd need to attach the same LFO to 'a' too and with a curve that matches the results of that quadratic equation
 
Cool tie in with infinite repeats and the "rotating ping pong" is that the matrix required will be a 2x2 rotation matrix

| cosθ sinθ |
| -sinθ cosθ |

Time to bust out the old trig tables!
Thanks to the identity sin^2 (θ) + cos^2 (θ) ==1 for all θ.

Time to bust out the old trig tables!
 
Cool tie in with infinite repeats and the "rotating ping pong" is that the matrix required will be a 2x2 rotation matrix

| cosθ sinθ |
| -sinθ cosθ |

Time to bust out the old trig tables!
Thanks to the identity sin^2 (θ) + cos^2 (θ) ==1 for all θ.

Time to bust out the old trig tables!
I though of that but it would require putting a Hilbert Transformer in the feedback paths. The Axe-Fx III has a Hilbert Transformer in its toolkit (used in the Ring Modulator) but it uses a fair amount of CPU.
 
Now how about 3D rotating reverb….
Reverb is already "maximally circulant". The feedback matrix in the reverb block is designed to circulate the data as much as possible. That's why it sounds good and isn't metallic. Old reverb algorithms suffer from metallic sound because the delay lines aren't cross-coupled which results in peaks in the frequency response.
 
Back
Top Bottom