Components
Time and sequencing
Blocks
EQ and filters
Modulation
Utility
Instruments
A de-esser device: frequency, threshold, ratio, range and listen, a panel that draws what it does at each frequency, a Web Audio engine and tools for agents.
Audio UI
"use client";
import { useState } from "react";Softens the sharp s and t of a voice. The signal is split at a frequency, and when the highs above it go over the threshold they are taken down, never by more than the range. It is a device: a state, a panel, an engine and tools, each its own file.
Controls · 6
The panel draws what the device does at each frequency at full reduction. The handle sits on the curve at the frequency: drag it across for the frequency and down for the range. deesserResponse(state) is the curve the panel draws.
import { DeesserPanel } from "@/components/audio-ui/devices/deesser/panel";
import { deesserDevice } from "@/components/audio-ui/devices/deesser/device";
const [state, setState] = useState(() => deesserDevice.defaults());
<DeesserPanel onValueChange={setState} value={state} />;Create it, connect it and update it as for any device: see The engine.
engine.reduction; // dB taken off the highs, read per frameTwo biquads in a row make each half of a Linkwitz-Riley split, whose low and high halves add back to a flat response when nothing is taken down. A detector reads the highs and writes the gain they get. It is the one of the compressor's sidechain, with a soft knee of 3 dB, an attack of 0.5 ms and a release of 60 ms. A table keeps the gain from going under the range.
Measured in Chrome, with nothing over the threshold the output is within 0.01 dB of the input from 200 Hz to 12 kHz. At full reduction a 10 kHz tone goes down by 5.1, 9.6 and 15.7 dB for ranges of 6, 12 and 24 dB, which is the curve the panel draws, to the hundredth.