Audio UI
Adds presence and air. It takes the highs above a frequency, saturates them into new harmonics above, and adds those to the sound: a voice or a mix comes forward and opens up without a boost that only makes it louder. It is a device: a state, a panel, an engine and tools, each its own file.
Installation
pnpm dlx shadcn@latest add @audio-ui/exciter
It installs the device's state, its engine and its panel to components/audio-ui/devices/exciter/. The demo above, which wires them to a loop, is @audio-ui/block-exciter.
Controls
Controls · 4
Panel
The panel draws the band of highs it makes its harmonics from. exciterBand(state) is what it draws.
import { ExciterPanel } from "@/components/audio-ui/devices/exciter/panel";
import { exciterDevice } from "@/components/audio-ui/devices/exciter/device";
const [state, setState] = useState(() => exciterDevice.defaults());
<ExciterPanel onValueChange={setState} value={state} />;Engine
Create it, connect it and update it as for any device: see The engine.
The exciter runs on the audio thread: the exciter of @audio/effect-exciter in an AudioWorklet loaded from a blob (EXCITER_WORKLET is its source), 128 frames at a time: a high-pass, a state-variable filter with a Q of 2, then a soft saturation whose harmonics are added to the sound. A worklet cannot import, so the device carries the kernel as published (EXCITER_KERNELS, in its kernels.ts). Until it is ready, and in a context with no worklets, the sound passes clean: ready resolves once it is in the graph.