One-Bit Delay
A DAW plugin inspired by the delay chips of the 1990’s.
A DAW plugin inspired by the delay chips of the 1990’s.
Skip the read, download the Plugin here: onebitdelay.com.
Or if you are using SuperCollider, get the UGen here: schollz/pt2399.
One-Bit Delay is a project I’ve been thinking about making for years. Essentially, I’ve had an obsession with the PT2399 chip - the chip that is responsible for dozens of guitar pedals and synthesizers. I wrote four albums of music1234 using synthesizers that are primarily based around the PT2399 chip.
For years I’ve thought that if there was one digital synth I would want, it would be a PT2399-based plugin. But, for years I tried, and failed to make one. Some of my attempts are close, like my norns script Icarus which features the kind of tape-style saturated delay I was looking for, but still ended up sounding too digital for me to continue down the path (which was a path of post processing versus emulation).
Get notified about One-Bit Delay updates.
My breakthrough for finding the right way for me to get the sound I wanted of this kind of chip was…reading the datasheet. I had before, of course, but I also read other similar datasheets (M51095P, for example) and read more about Delta Modulation when it occurred that the secret sauce was probably just in this ADC-DAC of the chip. So instead of just modeling the filters, I went for modeling the ADC-DAC signal chain.
The ADC-DAC of these chips is essentially using a comparator at a really high sample rate to turn audio signals (or in my case, 16/24-bit audio) into 1-bit data streams. This process can be done in a variety of ways to reduce the noise floor - I opted for Delta-Sigma Modulation which is simple enough to implement. Being able to do this digitally is CPU-intensive, but it is kinda neat that you can change the sampling rate on the fly and achieve different noise floors!
The other key is getting the right filters. There are anti-aliasing filters in the chips - essentially they usually have LPF -> ADC and then DAC -> LPF. So there are two low-pass filters that need to be modeled. There are great resources that go into the details of what kind of filters these might be, but for my case I just used frequency spectrums of the actual chip and tried my best to model its behavior. This “pretty good” approach is fine because really I just wanted to capture the darkness of the repeats over time.
The PT2399 and its family of chips are able to change the delay time by changing the sample rate, controlled by a VCO, which is controlled by resistance. This was pretty easy to model because it comes out of the Delta Sigma Modulation once the right constants are in place.
The other aspects are the harmonic distortion (measured as Total Harmonic Distortion). This was trickier and essentially I had to fiddle around with constants to find the ones that produced a similar THD-per-resistance. This also got to be very close!
The final routing, which I find to be quite pleasant to play with, is the following: Audio enters and splits into a dry path and a wet path that feeds into the core. The core signal is summed with feedback, filtered by an -18 dB/oct LPF, and then passed through a saturation stage. Then it is is encoded into a 1-bit stream using a second-order delta-sigma modulator. The resulting stream is written in to the clock-controlled 1-bit ring buffer and read back through a zero-order hold DAC. The reconstructed signal is LPF-ed through a -12 dB/oct filter before decimation and an additional -12 dB/oct output. There’s a HPF on the end, mostly for DC-block but I’ve found it fun to tune that on the go.
There’s a few extra goodies, like giving ways to change the modulation and demodulation filters (through “capacitors”, C3 and C6)and a generic parameter for “Brightness” (which scales a bunch of the LPF’s simultaneously).
And of course, feedback, which feeds back in gives the wonderful spontaneous crushing sounds that we all expect from the chip.
So I took all this knowledge into a C++ header file which I’ve used to create a JUCE plugin: the One-Bit Delay, as well as a SuperCollider UGen. The latter is open-source so you can dig into the actual code.
Firstly, I must acknowledge this is not a perfect emulation of the PT2399. I will save that for someone else. But for me, its darn close and sounds fantastic. Good enough that now I’m equipped to start building some of the digital synths I’ve always wanted (e.g. Make Noise Strega esque PT2399’s -> filter, and Monotron Delay esque, e.g. filters -> PT2399).
In addition to the datasheets, there are really authoritative and rich sources of information from Electrosmash and ihatemornings which I found super helpful to get a low level view of the inner circuit.