Chorus algorithm

I managed to get all my FX to my liking, but the chorus still sounds flat.

What I am doing
I have a delay line with four different read locations. There is a basedelay of 10ms and then the four “voices” are read as sin, cos, -sin, -cos scalable from 0ms to 15ms by user.
So for example voice a is read at position:
10 + 15 * mod_depth * (0.5*sin(mod_freq*t) + 0.5)
The voices are then added up, while the dry signal is ommitted.

Am I doing this wrong? I expect the sound to be this warm choir-type sound, while it still rather sounds like a phaser.

I am not an expert, but did you try to shift delayed signals in panorama?
I played a bit with chorus and I also find out that it is not so easy to get rich sound.

Good luck. :slight_smile:

Thats a good Idea, I will try it thanks!

Add some dry signal, otherwise it is a phasor, isn’t it?
Do you use a fractional delay line?

From what I’ve read the phaser always has dry signal (50% dry, 50% allpass).
See this graphic from Wikipedia
Or is there other ways still to do the phaser?

The definition of the chorus is somewhat more ambiguous, sometimes its only two delay lines, sometimes more and sometimes dry signal as well.

It is also possible in my algorithm to add dry signal via DryWet control, but that doesn’t help :wink:

This one actually improved the sound quite a bit, thanks mate :slight_smile:

But yeah overall Chorus, Phaser and Flanger are very closely related (with the Flanger technically even being a Phaser)

By fractional you mean I can have delay times which are not an integer amount of samples? If so yes.

I have the feeling that the lines between Chorus, Flanger, and Phaser are very much blurred. All effects use cancellation and beats of delayed and mixed signals. For me, flangers use only small delays, creating comb filters resulting in more metallic sounds, whereas chorus has longer (still small) delays to create the effect of several instruments are playing with small time and pitch differences, but basically using more or less the same algorithm. Phasers use Allpass filters, which are modulates, creating cancellations for specific (tuned) frequencies. Flanger and chorus will lead to cancellations at frequencies with regular spacing (comb filters) → phasor more arbitrary.

My last guitar tremolo pedal I bought splits the signal into two bands and applies the tremolo out-of-phase to both bands. I can imagine that splitting the input signal for the chorus into several bands and delaying them differently (e.g. different mod depths) might result in interesting sounds.

What was meant by ‘in panorama’ ?

You’ll kick yourself when you read the 1st three letters of panorama :wink:

1 Like

Haha I remember myself in the very same situation when I first heard the full word.
I still think it sounds quite weird, like when your mom used to call you by your full name when you had forgotten to take the chicken out of the freezer :joy:


Just to move each voice a bit to the left or right in stereo. To simulate a “row of singers”.

It is not so oldish word, isn’t it? :smiley:
I am sorry, I am not a native English speaker.

I’m glad I helped a little.

1 Like

Hi there!. Did a bit of research on mod FX last year - this is what I came up with:

All of them (flanger/chorus/doubler/echo) are just modulated fractional delays.
What varies is the LFO amount and the time range.

VERY roughly and subjectively (also no overlapping is totally arbitrary):

  • flanger : delay from 0.01 to 5 ms
  • chorus : delay from 5 to 25 ms
  • doubler : delay from 25 to 75 ms
  • echo : delay from 75 to 1000 ms (and beyond)

LFO frequency may vary from 0 to ~20Hz. Depth according to taste and “Engine”. YOu might have more than one LFO per channel or use the same LFO out of phase on L and R

“Engine” means a particular combination of dry signal, wet signal, and eventually filtered dry or wet (bass boosted or cut) panned left or right. the delayed signal can be added or subtracted to the dry signal. this + or - on the wet signal makes a dramatic difference in the resulting sound

If you look around in kvr forum you’ll find some examples of “Engines”, here’s some links I used for my implementations. No idea how much they are historically correct but they were a good base for experimentation.




See will pirkle book “Designing Audio FX in C++” there’s a chapter on chorus with a description of the Triton chorus (it’s on the old edition a new one just came out dunno if it’s still there)

Flanger important note : the flanging effect can be made more “vintage sounding” considering that the interaction between dry and delay+LFO in the analog old days at such a small delay time was so called “through zero”. see
You can obtain this in the digital world by delaying the dry signal (remember to declare the plugin latency) and have the wet signal “go around” the dry, e.g.:

output = input(delayed 3ms) + modDelayOfInput(delayed at LFO peaks = 1ms and 5 ms)

Hope it helps. Please if someone has more info or reference please expand on this would love to know more myself. Cheers!


Wow, thanks for that compilation of knowledge!

I will experiment with these, but I think I won’t have time before next week.
I’ll let you know of the results :slight_smile:

Edit: You mentioned I needed to declare the plugin latency…? Is this about one of the VST3 features, where the plugin will go silent if no input?

You have to inform the host how much latency (in samples) your plugin introduces, pretty sure this is supported by VST2 as well as all the other formats.

Ok so this is not about the delay trail produced by delaylines, but about the initial latency?

What does the host care about that latency? Will it play notes earlier in the final render? :thinking:

Yes, latency is about you delaying the “dry signal”, i.e. shifting the “realtime” moment forward
for DSP purposes.

In short, the host gathers all the latencies “declared” by the plugins and aligns the tracks accordingly so no unwanted artifacts are heard and all the controls you set on the DAW make sense (e.g. if you set a delay in a bass track to be 1 beat long it’s actually in sync also with the drum track even tough on the drum track you might have tons of compressors introducing latency)

1 Like

Nice! I took some inspiration from the TAL and Hornet algorithms you postet and the result now is quite pleasing. I couldn’t believe my ears when two delay lines sounded more chorus-y than four.

My approach was: more delay = more fun :man_facepalming:
However it only made the sound completely washed out and unrecognizable.

I’m still having some trouble with beating when the two LFOs cross but from this point on it can be solved by being creative I think.

Thanks again, your post was a great help! :slight_smile:

1 Like

With respect, 15 ms is a tiny bit short for 4-voice chorus, whatever other people are saying. You can understand that from basic principles, thus: tThe lowest frequency we can hear is said to be 20Hz, well, not including subsonic that are felt rather than heard, that’s still rather low for adults, although children have better hearing, it’s more like 25-30Hz for most people. So that’s say, 50ms wavelength. That means anything more than 20-25ms wavelength is actually perceived as sound, that is, half a cycle of it, although we can’t discern it very well if there are many similar frequencies. So from basic principles, if you want a chorus of 15ms to sound good, so without going into all the math, as a rule of thumb four delays is really not enough, eight or more is what you want really, because we can’t distinguish more than 7-8 sine waves simulataneously, due to the distance between the hairs in the ear canal specifically. With only 4 delays, you need more like a 30~40msec delay to create the separation, otherwise its too much like a phasor. Hope that makes sense, I tried to say it simply.

I think the mistake here is to use a static delay and pretend it is a Chorus. Those are different things, and IMHO it matters more, how much you modulate the delay time…

Just my 2 pennies

You are very welcome to give me the ultra-verbose, math-y version (if you like, that is). I won’t be able to test anything for two weeks though.

What’s the alternative to a “static delay”? and how would you modulate it? you mean not by sine/triangle…?