Audio UI
A photocell vibe. A lamp pulses inside a box, and four light cells around it set four phase-shift stages: the brighter the lamp, the higher each stage turns the phase around. The stages sit far apart, so the sound sweeps in a lopsided, throbbing way rather than as an even phaser does, and the lamp lights at once and fades slowly, so the sweep rises quickly and falls back slowly. In Chorus mode the shifted sound is mixed with the dry one, for moving notches; in Vibrato mode it plays alone, and its moving phase is heard as pitch. It is a device: a state, a panel, an engine and tools, each its own file.
Installation
pnpm dlx shadcn@latest add @audio-ui/vibe
It installs the device's state, its engine and its panel to components/audio-ui/devices/vibe/. The demo above, which wires them to a loop, is @audio-ui/block-vibe.
Controls
The knobs read 0 to 10, and show the value they set in the unit the sound takes.
Controls · 5
Panel
The panel draws the lamp's light over two seconds, over the mode and the knobs, all drawn off while the device is off. vibeLight(state) is what it draws, and lampCycle() gives one cycle of the light.
import { VibePanel } from "@/components/audio-ui/devices/vibe/panel";
import { vibeDevice } from "@/components/audio-ui/devices/vibe/device";
const [state, setState] = useState(() => vibeDevice.defaults());
<VibePanel onValueChange={setState} value={state} />;Engine
Create it, connect it and update it as for any device: see The engine.
The sound goes through a warm preamp, then four all-pass stages spread from 90 Hz to 5.2 kHz, each moved in cents by one oscillator whose wave is the lamp's light. Chorus is half dry and half shifted, Vibrato is shifted alone, and off, the sound passes untouched. Every control moves with a ramp, so a turn makes no click.