Warm saturation: the sound pushed into a soft curve that rounds its peaks off rather than cutting them, so it thickens and grows a gentle edge instead of buzzing. Drive is how hard it is pushed. Low down only the loudest moments are leant on and the sound is fuller rather than different; turned up it compresses, sustains and rasps, and at the top of its range what is left is close to a square with its corners worn off. A plain saturation of that kind adds only odd harmonics, which is what makes a clipped sound hollow and hard. Warmth is what adds the even ones: it leans the curve to one side, so the top of the wave is rounded sooner than the bottom, the way a valve stage is, and the second harmonic that puts under the note is an octave above it and sits with it rather than against it. At nothing the curve is symmetrical and the sound is clean-edged; the more there is, the rounder and thicker. Leaning a curve to one side moves the middle of the sound as well, so the module takes back exactly where silence would have sat, and the drift that is left while a loud note sounds is filtered away below anything anybody can hear — silence in is silence out, at every setting. Tone is a gentle slope over the top of the driven copy, where the fizz a harder drive makes lives: down at a kilohertz or two it is a dark, woolly amplifier, wide open it is bright. Dry/wet keeps the sound that went in beside the driven one, which is how a saturation sits under a clean sound instead of replacing it, and Level is how loud the driven copy is, because driving a sound harder also makes it louder. The curve is worked out at four times the rate and filtered back down, so the harmonics a hard drive makes above what the rate can hold are not folded back under the note, and the clean half runs through the same oversampler with a straight line for a curve, so the two halves stay aligned sample for sample when they are blended. Drive is an input as well, with a depth for how far a signal there moves it: an envelope into it pushes the start of a note harder than its tail.
What it is made of
The Web Audio nodes inside this module and how they are wired. Fork it to open the same graph in the editor, where every part can be changed.
A patch connects to it through audio input ‘In’, audio input ‘Drive’ and audio output ‘Out’.
‘in’ is an audio input this module declares, set to input in. Its output reaches input 0 of ‘dry’. Its output reaches input 0 of ‘drive’.
‘one’ is a constantSource node. Its output reaches input 0 of ‘bias’. Its output reaches input 0 of ‘mixdepth’. Its output reaches input 0 of ‘spanset’. Its output reaches input 0 of ‘drytrimset’. Its output reaches input 0 of ‘dryliftset’. Its output reaches input 0 of ‘dcblockset’. Its output reaches input 0 of ‘toneqset’.
‘dry’ is a gain node. Its output reaches input 0 of ‘drytrim’.
‘drytrim’ is a gain node. Its output reaches input 0 of ‘dryflat’.
‘dryflat’ is a waveShaper node, set to oversample 4x. Its output reaches input 0 of ‘drylift’.
‘drylift’ is a gain node. Its output reaches input 0 of ‘out’.
‘drive’ is a gain node. Its output reaches input 0 of ‘span’. A patch can set its gain, through ‘Drive’.
‘span’ is a gain node. Its output reaches input 0 of ‘shaper’.
‘bias’ is a gain node. Its output reaches input 0 of ‘shaper’. Its output reaches input 0 of ‘rest’. A patch can set its gain, through ‘Warmth’.
‘shaper’ is a waveShaper node, set to oversample 4x. Its output reaches input 0 of ‘sat’.
‘rest’ is a waveShaper node, set to oversample 4x. Its output reaches input 0 of ‘restinvert’.
‘restinvert’ is a waveShaper node. Its output reaches input 0 of ‘sat’.
‘sat’ is a gain node. Its output reaches input 0 of ‘dcblock’.
‘dcblock’ is a biquadFilter node, set to type highpass. Its output reaches input 0 of ‘tone’.
‘tone’ is a biquadFilter node, set to type lowpass. Its output reaches input 0 of ‘level’. A patch can set its frequency, through ‘Tone (Hz)’.
‘level’ is a gain node. Its output reaches input 0 of ‘wet’. A patch can set its gain, through ‘Level’.
‘wet’ is a gain node. Its output reaches input 0 of ‘out’. A patch can set its gain, through ‘Dry/wet’.
‘mixdepth’ is a gain node. Its output reaches input 0 of ‘mixinvert’. A patch can set its gain, through ‘Dry/wet’.
‘mixinvert’ is a waveShaper node. Its output modulates the gain of ‘dry’.
‘spanset’ is a waveShaper node. Its output modulates the gain of ‘span’.
‘drytrimset’ is a waveShaper node. Its output modulates the gain of ‘drytrim’.
‘dryliftset’ is a waveShaper node. Its output modulates the gain of ‘drylift’.
‘dcblockset’ is a waveShaper node. Its output modulates the frequency of ‘dcblock’.
‘toneqset’ is a waveShaper node. Its output modulates the Q of ‘tone’.
‘out’ is an audio output this module declares, set to output out.
‘drivein’ is an audio input this module declares, set to input drive. Its output reaches input 0 of ‘drivedepth’.
‘drivedepth’ is a gain node. Its output modulates the gain of ‘drive’. A patch can set its gain, through ‘Drive depth’.
‘Drive’ is a setting a patch can turn, from 0.5 to 24.
‘Warmth’ is a setting a patch can turn, from 0 to 0.25.
‘Tone (Hz)’ is a setting a patch can turn, from 500 to 20000.
‘Dry/wet’ is a setting a patch can turn, from 0 to 1.
‘Level’ is a setting a patch can turn, from 0 to 2.
‘Drive depth’ is a setting a patch can turn, from -24 to 24.