Arrangement
Transport and mixer
EQ and filters
Modulation
Utility
Instruments
Audio UI
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.
Installation
pnpm dlx shadcn@latest add @audio-ui/deesser
It installs the device's state, its engine and its panel to components/audio-ui/devices/deesser/. The demo above, which wires them to a loop, is @audio-ui/block-deesser.
Controls
Controls · 6
Panel
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} />;Engine
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.