The analog bucket-brigade delay

Programming applications for making music on Linux.

Moderators: khz, MattKingUSA

Post Reply
Established Member
Posts: 5
Joined: Tue Aug 13, 2019 6:18 am

The analog bucket-brigade delay

Post by jpcima »

Hi, I have made some research and implementation on the BBD, and I thought I will leave a word here about my work and findings.
It's in the context of string synthesizer emulation like Solina; since some chips like MN30xx have been used in guitar effects, there can surely be a broader interest in it.

The 2018 DAFX has a recent article on BBD emulation. You have my implementation at my repository.
It has received a fair amount of trial and refinement. some mistakes were corrected from the paper's algorithm listing.

It's also in my string-machine repository master branch, providing a chorus plugin which can be used in independence.

The idea of BBD is to be an analog sampled system. It will be driven by a clock tick which shift signal samples along a sequence of capacitors.
It will be this number of capacitors, or stages/buckets, which define the main characteristic of the delay IC.
(a Solina's TCA-350-Y would have 185, a MN3007 would have 1024)

For the digital model, it means to have a sampled system inside of another; it means for the effect to be a multi-rate.
It means to have a resampling at the entry of the BBD, and another at the output.

The older published method has used linear interpolation.

Usually, BBD will operate in a circuit with a pair of steep input/output LPF, 10 kHz typical, to limit the noise artifacts and aliasing.
The new paper suggest to perform to perform resampling inside i/o filter processes (a "combined" model).

The filter will be a time-variant with evolving coeffs according to the fractional delay. The processing will be decomposed:
for input, the b[n]*x[n] term will evaluate in the audio rate section, whereas the a[n]*y[n] term will evaluate under BBD rate.
(or vice-versa if for output filtering)
Varying filter coeffs will be precomputed in a matrix and interpolated, for speed.

My code is licensed under a liberal BSL-1.0 free software license.
I added a documentation which I think explanatory enough; to use, you modulate a clock which relates to delay by inverse proportionality relation: Clock=2*Stages/Delay

It has filter models of Juno60 documented in the paper.
For others, GNU Octave can create such filters using analog filter design, and the function "residue" part of the signal package.
Post Reply