Making Digital Oscillators Sound Analog

Elimination of aliasing is the top priority in making an oscillator in audio software sound "analog." Once that's taken care of with e.g. PolyBLEP, there also exists a space of little flaws that are often cited as crucial to the sound of analog subtractive synths. Whether they're really that critical is hard to determine, but it's good, nerdy fun to explore deliberate oscillator flaws for their own sake, including gross exaggerations of design issues that are negligible in any competently designed circuit.

This is a topic that's been on my mind for a while, but an excellent blog post by Stargirl Flowers breaking down the DCO circuits in the Roland Juno line of synths inspired me to finally put some thoughts together in prose. There's also an awesome video by GOLT ! on YouTube.

The first three flaws we'll discuss are directly taken from Mutable Instruments Braids.

VCO temperature sensitivity

It appears that the main impact of temperature fluctuations is on the tuning of the circuit, and not so much its timbre. Focusing exclusively on resistors, their values change according to the following approximate formula:

`R = R_nominal * (1 + alpha * temperature_difference)`

where `temperature_difference` is a deviation in degrees Celsius from a reference temperature, and `alpha` is the temperature coefficient of the resistor. For typical conductors, `alpha` is usually no bigger than `5e-3 / degrees C`.

Frequency is usually roughly proportional to resistance, so:

`f = f_nominal * (1 + alpha * temperature_difference)`

As a quick calculation, if we use the aforementioned value for `alpha` and our VCO heats up by 5 degrees Celsius, the frequency will uniformly sharpen by `1200 * log2(5 * 5e-3)` = 42 cents.

Temperature signals can be generated using noise put through a slow one-pole lowpass filter. The one-pole lowpass is a model of Newton's law of cooling.

VCO capacitor reset time

In the classic ramp-core VCO circuit drawn in Flowers' post, you have a capacitor that linearly charges from zero up to a threshold voltage, and is then shorted back to zero by a transistor. Well, not completely shorted -- to avoid damaging the circuit, there's usually a small resistor in series. This small resistor gives the capacitor a little exponentially decaying reset stage.

The most important impact of this reset stage is that it increases the period of the oscillator by a tiny amount. This implies that the control voltage is no longer linear with frequency, and the frequency is distorted like so:

`f = 1 / (1 / f_nominal + 1e-9)`

VCO offset current

The op-amp might draw a little bit of current from its positive input, which can be modeled with a large resistor to ground. In Braids, this is modeled by subtracting a constant to the frequency:

`f = f_nominal - 0.6`

Notice that both offset current and capacitor reset time cause a lowering in pitch, and both impact high frequencies more than low ones. This I believe is responsible for analog oscillators sounding a little "droopy" in the high end.