Tom Wiltshire, January 2014
There is an updated version of this piece at electricdruid.net/investigations-into-what-a-bbd-chorus-unit-really-does/. This one is not being updated anymore, so perhaps you'd like to read that one instead? Thanks!
I've been curious about Chorus for a while, since I've been working on and off with chorus design myself. One of the problems with a typical chorus unit is the pitch modulation gets deeper as the BBD clock rate is reduced (e.g. as the delay is made longer). This makes the pitch variation very obvious – “seasick” or “warbley” are words often used to describe the sound. A typical chorus unit uses an LFO to modify its clock frequency, and that clock modulation is linear, so a given modulation depth will give (for example) +/-25KHz of clock modulation. “Aha!”, I thought, ”That's why the depth seems to go up“. If you consider a high clock frequency of 200KHz, a modulation of +/-25KHz is about 12%, or about 2 semitones. If you then consider what happens at a low modulation rate of 50KHz, the same modulation of +/-25KHz now shifts the clock by about 50%, or roughly an octave (50-25 = 25, which is 50% of 50KHz, 50+25 = 75, which is 150% of 50KHz).
So what's the solution? Use exponential frequency modulation like a synth VCO of course! Then the LFO mod depth would be specified as “an octave” or “4 semitones” and an octave shift at 50KHz is the same as an octave shift at 200KHz. So I tried it, and it doesn't work. It helps, but it's not the whole story. At this point, I realised that it was a bit more complicated than I was giving it credit for and I'd have to really think about it. This page is some of the results of those studies.
So what did I do? Well, I did what I always do when I don't understand something. I wrote a simulation of it. If I can write a sim of a situation, then I know that I understand it. If the sim doesn't work, there's something I'm still missing. Often the process of thinking about how to simulate something, and seeing how and why the simulation doesn't work gives me an insight into the real situation. If that doesn't work, playing with the simulation gives me a useful way to perform repeatable experiments that would often be awkward to do in reality.
My simulated delayline has 1024 stages, just like the SAD1024, MN3007, or MN3207 chip. Of these, only the last one is still available, so it's the chip likely to turn up in modern analog chorus designs.
My chorus also has exponential clock modulation, with a V/Oct character. The clock frequency at any given moment is:
clock_freq = clock_centre_freq * (2^(lfo_output * mod_depth))
Here's the LFO waveform (blue) and the Clock rate (grey). The horizontal grey line is the clock centre frequency with no modulation applied. You can see that with 1 octave of LFO modulation, the clock frequency goes up to 40KHz, and down to 10KHz. The LFO rate and Clock rate are just chosen to give a reasonable display. We can see 400msecs of signal here.
Ok, so far, so good. Let's feed some audio into it and see if we can see anything happening. Remember this is just the signal through the BBD (the “Wet only” signal), so it's not a full chorus. In fact, it's just a vibrato unit. But mixing the dry and wet signals together is easy, and that's not the bit I don't understand, so I'm ignoring the dry signal. This next graph adds a low audio ramp wave (red). You can easily see the pitch change caused by the clock modulation. Notice the initial delay before any signal comes through the delay line is clearly visible on the left hand side of the graph.
Now this is where things start to get interesting. What do you think is happening to that audio frequency? It should be varying up and down, following the changes in the clock rate, right? Let's have a look. The next graph uses a very simple count of the time between zero crossings to give an estimate of the audio output frequency at each moment. This is plotted in green. Ive taken the LFO off to stop it getting too cluttered.
Interesting, don't you think? The frequency modulation produced isn't a simple sine wave – it's distorted. Let's have another look at that without the audio:
So what's going on here? Think about how the BBD makes a pitch change. When the LFO output is rising, the clock frequency is increasing, and samples are being read out faster than they were read in – their pitch is shifted up. Likewise, when the LFO is falling, the clock frequency is decreasing, and samples are read out more slowly than they were read in – the pitch is decreased. The key here is that the pitch shift is not caused by a high clock frequency or a low clock frequency, but by an increasing or decreasing clock frequency. It's the rate–of–change of clock frequency that's important.
For a sine wave LFO input like we've been using, the point of maximum increase is the middle of the upwards slope, where our clock rate crosses the horizontal grey line. Similarly, the maximum decrease is on the downwards slope where it crosses the grey line.If we plot this rate of increase, we're plotting the differential of sin(x), which is just cos(x) – the same thing shifted forwards a bit. Here it is, in cyan.
But hang on a minute! Our frequency modulation isn't following cos(x) for our sin(x) LFO! It doesn't look like the cyan line either! Well, no. The problem is that there's also the overall delay. For the lowest output frequency, that's roughly the delay at the lowest clock frequency, so you'll see that the lowest point on the green line is quite a long way after the lowest point on the cyan line (to the tune of about 3 squares – 30msecs). For the highest output frequency, the delay is much shorter, since it is almost the delay at the maximum clock rate. Thus the highest point on the green line is also after where the highest point on the cyan line, but by much less (probably only one square – 10msecs). This changing delay is what distorts the modulation.
$clock_freq = $clock_centre_freq * pow(2, $lfo);
$delay_secs = $delay_stages/($clock_freq * 2);