destroy

destroy · effects

Bitcrusher + decimator distortion.

A bitcrusher / sample-rate decimator — the project's grungy lo-fi destroyer, and the only module that lowers a signal's RESOLUTION on its two axes independently. Two classic digital-degradation stages run in series on the input: DECIMATE holds every Nth sample (a sample-rate reduction that adds aliasing and a slo-mo grainy texture), and BITS quantizes the amplitude to fewer bits (the gritty, steppy crunch of low bit-depth). A WET knob crossfades the mangled signal against the clean dry, so it doubles as a parallel-distortion send. THREE THINGS TO KNOW BEFORE YOU PATCH IT, all measured on the shipping compiled DSP (art/scenarios/destroy/face-audit.test.ts). First, THE TWO STAGES DO DIFFERENT KINDS OF DAMAGE AND ONLY ONE OF THEM IS TIMBRAL. Over its full travel DECIMATE drags the spectral centroid of broadband material from 11906 Hz down to 4393 Hz; BITS over its full travel moves the same number by 99 Hz. BITS does not make a signal darker or brighter, it raises a noise floor underneath it and eventually swallows it. Second, ABOVE THE FOLD FREQUENCY YOUR PITCH IS WRONG, NOT JUST GRAINY. Decimation is a real sample-rate reduction with no anti-alias filter, so the effective rate is 48000/N and anything above half of that folds back down as a DIFFERENT note: at DECIMATE 8 (6.0 kHz effective) a 5 kHz tone comes out at 1 kHz, 13.8 dB LOUDER than the 5 kHz you played. The faceplate prints the effective rate live as `rate`. Third, BITS HAS A DEAD ZONE AND IT IS A CLIFF. The quantizer rounds to the nearest step, so any input under half a step becomes exactly zero: below -6.0 dBFS at 1 bit, -24.1 dBFS at 4 bits, -48.2 dBFS at 8 bits. Measured at 1 bit, a source 1.2x over the threshold leaves at -4.3 dBFS and one at 0.98x of it leaves at -99.0 dBFS. Quiet passages and reverb tails do not get grittier, they disappear; the faceplate prints that threshold as `mute`. All three controls are CV-patchable for rhythmic crush sweeps.

the faceplate

destroyaudioaudiodecimatecvbitscvwetcvaudioaudioaudiocvgatepitch
4 inputs · 1 outputs · 3 params

inputs

idcablewhat it does
audioaudioThe dry signal fed into the decimator + bit-reducer chain. Also passed to the dry side of the WET blend.
audio signal
decimatecvCV that displaces the DECIMATE knob (linear), modulating the sample-rate reduction — patch an envelope or LFO for rhythmic aliasing sweeps. A ±1V CV sweeps roughly ±31 steps from the knob position.
control voltage (CV); modulates decimate (additive offset — ±1 CV sweeps the full range, centered on the knob)
bitscvCV that displaces the BITS knob (linear), modulating the quantization depth live.
control voltage (CV); modulates bits (additive offset — ±1 CV sweeps the full range, centered on the knob)
wetcvCV that displaces the WET knob, modulating the dry/wet crush amount.
control voltage (CV); modulates wet (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
audioaudioThe processed (destroyed) signal blended with the dry input per WET. It is UNITY-GAIN in level terms and that is worth knowing before you reach for a meter to set it up: across DECIMATE's entire 1..64 travel the output RMS moves 0.12 dB on broadband noise and 0.00 dB on a sine, so a level meter is blind to the module's primary control (which is why the faceplate's glyph is a TRACE, not a meter). BITS moves it a little more (1.8 dB) and non-monotonically. The signal is also never bit-identical sample to sample even inside a held plateau, because the WET smoothing leaves a residual dry path 89.8 dB down: compare output samples with a tolerance, never for equality.
audio signal

params

idlabelrangedefaultcurve
decimateDecimate1..641linear
bitsBits1..1616linear
wetWet0..11linear

controls

controlwhat it does
BitsQuantization bit depth (1..16, default 16): 16 is pristine; lower values quantize the amplitude to a grid of 2^bits steps for the thick, steppy crunch of a low-bit converter. IT IS NOT A TONE CONTROL — over its whole travel it moves the spectral centroid of broadband material by 99 Hz, against DECIMATE's 7513 Hz. What it moves is the noise floor: the crush artifact sits at 20log10(step/sqrt(12)), i.e. -101 dBFS at 16 bits, -52.9 at 8, -28.8 at 4, -10.8 at 1 (measured within 0.09 dB of that closed form at every depth). AND IT HAS A DEAD ZONE, which is the thing nothing else says: the quantizer rounds to the nearest step, so any input below half a step (-6.02 x bits dBFS) becomes EXACTLY ZERO. That is -24.1 dBFS at 4 bits and -6.0 dBFS at 1, and it is a cliff rather than a fade — at 1 bit a source 1.2x over the threshold leaves at -4.3 dBFS and one at 0.98x leaves at -99.0. So `1 bit` is near-square-wave destruction for loud material and a hard mute for anything quiet. The faceplate prints both edges, as `floor` and `mute`.
DecimateSample-rate decimation (1..64, default 1): hold every Nth input sample. 1 is pristine; higher values drop the effective sample rate to 48000/N for aliasing artifacts and a coarse, downsampled grain. THE DIAL IS CONTINUOUS AND THE HOLD IS AN INTEGER, so the value is ROUNDED to the nearest whole sample — a CV that lands at 7.4 holds 7 samples and one at 7.6 holds 8. (It used to TRUNCATE, which made every integer position one step short and DECIMATE 2 a bit-exact no-op; #1716.) THE ONE THING TO WATCH is the fold frequency, half the effective rate: 24 kHz at DECIMATE 1, 3 kHz at 8, 375 Hz at 64. There is no anti-alias filter, so material above the fold does not vanish, it comes back down as a different pitch — measured at DECIMATE 8, a 5 kHz tone leaves at 1 kHz 13.8 dB louder than its own fundamental. The faceplate prints the effective rate as `rate` and the resulting data rate (bits x rate) as `stream`.
WetDry / wet mix (0..1, default 1): 0 is the clean input, 1 is the fully crushed signal, between blends them — useful as a parallel-distortion amount. It is a true crossfade over the ERROR: the output is dry + wet x (crushed - dry), so halving WET drops the crush artifact by exactly 6.02 dB and leaves the dry signal at full level (measured -28.8 dBFS at WET 1 and -34.8 at WET 0.5, 4 bits). AT THE SHIPPED DEFAULTS IT DOES NOTHING, because DECIMATE 1 + BITS 16 is a transparent chain and there is nothing to blend against; it becomes a control the moment either of the other two is moved. Two smaller notes: the crushed path's dead zone is unaffected by WET (a sub-threshold input still quantizes to zero, it just arrives through the dry side instead), and the internal smoothing on this control never quite reaches its endpoint, so at WET 1 a residual dry signal survives 89.8 dB down — inaudible, but it is why output samples inside a held plateau are never bit-identical and must be compared with a tolerance.

source

destroy.ts on GitHub.

Generated from packages/web/src/lib/{audio,video}/module-registry.ts · repo