beads
beads · effectsA direct WebAssembly port of the Beads firmware released by Émilie Gillet in October 2026. Record stereo audio, scatter it into grains, freeze a moment, or use the internal wavetable voice. The original grain engines, random modulation, delay transition, quality modes, feedback, reverb and limiters run from the published C++ source. Auto selects the wavetable voice when both audio inputs are unpatched; patching either input selects audio processing immediately. Select Audio explicitly to hold a frozen recording after unplugging its source. SIZE fully clockwise enters the original delay mode after its transition. The browser uses explicit source and mono controls instead of hardware normalization timers, and does not emulate the analogue input gain stage, calibration, persistent audio backup, or repurposing the right audio jack as a gate output. All quality modes keep their native processing clocks with band-limited sample-rate conversion to the audio device.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
in_l | audio | Left audio written into the buffer. An unpatched right input follows this channel; a connected silent right input stays silent. audio signal; L/R stereo pair with in_r — L-only auto-duplicates to R |
in_r | audio | Right audio written into the stereo buffer. A cable here selects audio processing in Auto even if the left input is unpatched. audio signal; L/R stereo pair with in_l |
pitch | pitch | V/oct pitch added to the Pitch control. Zero volts leaves the native wavetable voice at its reference pitch, or leaves recorded grains untransposed. V/oct pitch CV |
seed | gate | Seed gate: in External mode, held high enables grain generation and low stops new grains; near centre Density a rising edge creates one grain. In Latch mode a patched gate supplies the clock for the original divider/probability logic. Hold combines the button level with this gate. gate / trigger; gate — acts while the level is high (reacts to both edges) |
freeze_gate | gate | Freeze gate: while high, stops buffer recording; low resumes recording unless the Freeze switch remains on. This is level-sensitive, not a toggle on an edge. gate / trigger; gate — acts while the level is high (reacts to both edges) |
time_cv | cv | External modulation for Time. Time amount controls its influence; with no cable that control uses the original internal randomness. control voltage (CV) |
size_cv | cv | External modulation for Size, scaled by Size amount. Negative amounts use positive CV to control random spread. control voltage (CV) |
shape_cv | cv | External modulation for Shape, scaled by Shape amount. With no cable, the amount selects internal random modulation. control voltage (CV) |
pitch_cv | cv | Pitch modulation in volts per octave, processed by Pitch amount and the original pitch randomizer. The separate pitch input always adds V/oct directly. control voltage (CV) |
density_cv | cv | Density modulation using the original linear/exponential FM mapping; it also moves the divider/probability selection when clocked. control voltage (CV) |
blend_cv | cv | CV added to the dry/wet Blend control. control voltage (CV); modulates blend (additive offset — ±1 CV sweeps the full range, centered on the knob) |
feedback_cv | cv | CV added to Feedback; in Wavetable mode it selects the wavetable bank. control voltage (CV); modulates feedback (additive offset — ±1 CV sweeps the full range, centered on the knob) |
reverb_cv | cv | CV added to the Reverb control. control voltage (CV); modulates reverb (additive offset — ±1 CV sweeps the full range, centered on the knob) |
outputs
| id | cable | what it does |
|---|---|---|
out_l | audio | Left output of the original grain or wavetable engine, dry/wet mix, reverb and limiter. audio signal; L/R stereo pair with out_r |
out_r | audio | Right output of the same stereo engine. The two jacks carry independent channels, including in mono-buffer mode where grains may spread across stereo. audio signal; L/R stereo pair with out_l |
params
| id | label | range | default | curve |
|---|---|---|---|---|
time | Time | 0..1 | 0.25 | linear |
size | Size | 0..1 | 0.65 | linear |
shape | Shape | 0..1 | 0.5 | linear |
pitch | Pitch | -24..24st | 0 | linear |
density | Density | 0..1 | 0.25 | linear |
blend | Blend | 0..1 | 0.5 | linear |
feedback | Feedback / Bank | 0..1 | 0 | linear |
reverb | Reverb | 0..1 | 0.15 | linear |
time_random | Time amount | -1..1 | 0 | linear |
size_random | Size amount | -1..1 | 0 | linear |
shape_random | Shape amount | -1..1 | 0 | linear |
pitch_random | Pitch amount | -1..1 | 0 | linear |
freeze | Freeze | 0..1 | 0 | discrete |
seed | Seed | 0..2 | 2 | discrete |
quality | Quality | 0..3 | 3 | discrete |
source | Source | 0..2 | 0 | discrete |
mono | Mono buffer | 0..1 | 0 | discrete |
controls
| control | what it does |
|---|---|
| Blend | Original dry/wet crossfade. In wavetable mode blends the continuous voice with granular wavetable playback. Pristine dry audio has the firmware gain of 0.75, not unity. |
| Density | Original density law: periodic grains below centre, random grains above, and manual taps around centre. In clocked Latch mode it chooses division or probability. It is not a linear rate control. |
| Feedback / Bank | Feedback into the recorded audio buffer. In Wavetable mode this same control selects one of the original twelve banks. |
| Freeze | Latching Freeze switch. On holds the recorded buffer; off resumes recording when freeze_gate is low. Rewriting the same setting never toggles it. Wavetable mode applies the original freeze behavior to its voices. |
| Mono buffer | Latching mono-buffer mode. On uses the firmware mono recording layout for longer history; output remains stereo. Off keeps separate stereo input channels. |
| Pitch | Transpose grains or the wavetable voice by -24 to +24 semitones, summed with the V/oct pitch input. |
| Pitch amount | Pitch attenurandomizer. With no cable it spreads grain pitch; with a cable positive values scale CV and negative values randomize pitch under CV control. |
| Quality | Scorched cassette: 8-bit companded audio at 24 kHz with wow/flutter. Warm tape: 12-bit at an internal 24 kHz. Sunny digital: 12-bit at 32 kHz. Pristine: 16-bit at 48 kHz. In Wavetable mode the original per-quality bit depths apply at 48 kHz. Switching reinterprets buffer memory as on the firmware. |
| Reverb | Original stereo reverb amount, with linked decay mapping and quality-dependent tone. |
| Seed | External leaves grain generation to the Seed input; Hold keeps generation enabled; Latch free-runs without a cable and uses the clock divider/probability engine with a cable. At centre Density, External accepts individual rising-edge taps and Latch is silent on the wet path without a clock. |
| Shape | Grain envelope shape, from percussive contours through smooth windows to harder rectangular shapes. |
| Shape amount | Shape attenurandomizer, using the same internal-random/external-CV rules as Time amount. |
| Size | Original bipolar grain duration and direction control. Below centre grains run backwards; above centre they run forwards. Fully clockwise enters delay mode after the firmware transition; moving back returns to grains. |
| Size amount | Size attenurandomizer, using the same internal-random/external-CV rules as Time amount. |
| Source | Auto chooses Wavetable when neither audio input has a cable, otherwise Audio. Audio always records or plays the buffer, including after disconnecting its source. Wavetable always uses the original internal synthesizer. Selection follows cable presence, not signal level. |
| Time | Position in the recorded buffer; in wavetable mode, position within the selected wavetable. Modulated by Time amount and time_cv. |
| Time amount | Time attenurandomizer. With no CV, positive and negative amounts select the original random distributions. With CV, positive scales modulation and negative lets CV set random spread. |
source
beads.ts on GitHub.