Vocal doubler — offline and live. Drop in one good take and render a chorus out, or run it on the host input in real time. The offline engine is full-fat magnum-opus: 150 ms Tukey grains, 8-way OLA, WSOLA cross-correlation, onset-aware placement, band-split HF passthrough. The live path is PSOLA-grade with ±12 semitone SHIFT, 4-way Hann OLA at 75% overlap, ~25 ms latency. 40 factory presets. Designer Mode track-spacer. Drag back into your DAW or play through.
Drag any WAV / AIFF / MP3 / FLAC / OGG onto the WAVESHAPE panel. The source resamples to host rate (cubic Hermite) so playback never repitches by accident.
Hit + on the right rail. RMS-windowed onset detector with 80 ms local-mean look-back picks attacks. Pill renders ONSETS · VOICED · DYN. Grain starts within ±20 ms of an onset snap to it; the first 30 ms of each onset has its drift LFOs damped to 0.30×.
Hit [+] in the doubles header. Each double gets its own RNG seed and 7 knobs (PITCH, TIME, DYN, SMOOTH, PAN, VAR, GAIN). RE reseeds; the wander LFOs start at incommensurate phases so the new take feels meaningfully different.
Doubles re-render in the background as you turn knobs. Offline, no audio dropout. The RGB waveform overlay paints D1 / D2 / D3 in distinct colours so you can see where each one's energy sits against the source.
Transport plays source plus every active double through the output bus. ON / OFF solos each take. A / B / COPY stores two snapshots in memory for fork-and-compare.
The drag-out chip on every double row writes a 24-bit WAV to a temp folder and starts a Finder drag — drop on a track in your DAW and the double is baked. Or save the whole project session and revisit later.
Click LIVE MODE in the top tabs. The live oscilloscope at the top of the view shows the input plus the mix output — visual feedback during a take.
Each live double is a track row with 8 knobs (SHIFT, DETUNE, TIME, DYN, SMOOTH, PAN, VAR, GAIN). The plug-in writes input to a circular buffer and reads each track at a baseLag (~15 ms) behind the head.
SHIFT dials in ±12 semitones with a 4-way Hann OLA at 75% overlap (constant-sum amplitude at any pitch ratio). Cubic Hermite interp in the buffer read. Cached pitch ratio — only recomputed when the knob actually moves.
Above 3.5 kHz the dry HF passes through, crossfaded out by |SHIFT|. At ±0 ST the passthrough is full; at ±6 ST+ the granular character takes over. Sibilance and consonants stay crystal clear during gentle shifts.
LIVE IN passes the host input through. Toggle off and only the doubles are heard — useful for routing the plug-in onto a send. ORIGINAL mixes source / live input back. DRY mutes the source bus.
PRE on every track row opens the per-track preset menu — 40 hand-tuned factory vibes plus your own .gtrack files. Same library shared between Export and Live.
Crank the master DESIGNER knob to remove the phasing between the doubles and the dry vocal — no more comb-filter that unison-style doublers create when stacked. Per-double 4-stage 1st-order all-pass cascade with alternating-sign coefficients ({+0.50, −0.40, +0.55, −0.45}) — neighbouring doubles decorrelate against each other AND against the dry.
Strength is hierarchical: D1 stays closest to the source; D2 is more decorrelated; D5+ is fully spread. Designer state persists for A/B and presets, and runs identically in Export (offline) and Live (real-time) paths.
DESIGNER = 1.0. The DESIGNER knob global-scales all rows together.| dsp | granular overlap-add (magnum opus) |
| grain size | 150 ms |
| window | tukey (α = 0.25) |
| overlap | 8-way · hop = grain / 8 (87.5%) |
| alignment | wsola cross-corr · ±5 ms search |
| interpolation | cubic hermite |
| pitch wander | 0..30 cents · dual-LFO |
| time wander | 0..25 ms · dual-LFO |
| dyn wander | 0..4.5 dB · dual-LFO |
| hf passthrough | 3 kHz band-split (delay-aligned) |
| onset detection | rms · 12 ms hop · local-mean look-back |
| onset snap | ±20 ms; drift damp 30 ms · 0.30× |
| internal dsp | 32-bit float |
| render latency | 0 samples · pre-rendered |
| cpu (playback) | ~0% · pre-rendered |
| dsp | psola-grade · 4-way hann ola |
| grain size | 25 ms |
| overlap | 4-way · 75% · phase {0, .25, .5, .75} |
| shift range | −12 .. +12 semitones |
| shift cache | 2^(st/12) recomputed only on knob move |
| detune wander | 0..10 cents |
| time wander | 0..8 ms (capped lag) |
| interpolation | cubic hermite (circular buffer) |
| hf passthrough | 3.5 kHz · crossfaded by |shift| |
| window lut | 1024-entry hann · linear interp |
| baselag | ~15 ms behind write head |
| cents-to-ratio | 1st-order taylor (exact at 0¢) |
| gain dB-to-lin | std::exp2(dB / 6.0206) |
| latency | baseLag + grain/2 ≈ 25–30 ms |
| cpu / double | ~62 ops/sample · ~14 doubles in 5% of one core @ 44.1 kHz |
| formats | vst3 · au · standalone |
| platforms | macos 10.13+ · win 10+ |
| mac binary | universal · arm64 + x86_64 |
| win binary | x64 |
| window size | 960 × 620 · fixed |
| sample rate | follows host (any) |
| channels | mono · stereo |
| source formats | wav · aiff · mp3 · flac · ogg |
| export | drag-out · 24-bit wav |
| doubles | unlimited |
| preset format | .gtrack · json · schema 2 |
| factory presets | 40 hand-tuned vibes (5 groups) |
| preset folder (mac) | ~/Library/Application Support/ stupidface labs/Gallium/TrackPresets/ |
| a / b slots | 2 · stored in memory · persists w/ session |
| session save | schema 1 json · all doubles + master + designer + license cache hash |
| license | 2 seats · lemon squeezy keyed · 30-day revalidation |
| installer | .pkg (mac, ad-hoc signed) · .exe (win) |
| plug-in folders (mac) | ~/Library/Audio/Plug-Ins/VST3 + Components |
Source is sliced into 150 ms Tukey-window grains (75% flat top + 12.5% Hann tails). Eight-way overlap (hop = grain / 8) gives a near-constant Tukey sum. WSOLA cross-correlation searches ±5 ms in the source for the best phase-coherent grain start against the previous grain's tail. Above 3 kHz the original-source HF is delay-aligned and substituted in — the granular path's "tinny / canny" sound mostly lives in the sibilance + breath transients, so passing them through untouched restores transient clarity completely.
Live audio writes into a circular buffer; each LiveDouble reads at baseLag (~15 ms) behind the write head. Grain reads use cubic Hermite. The 4-way overlap is the trick: Hann sum at 75% overlap is constant 2.0, so the mix scales to unity at any pitch ratio. 50% / 2-grain Hann gets amplitude ripple at non-unity ratios — 75% / 4-grain doesn't.
The per-double EQ is reachable from the EQ button on every double row. Five band types — bell, lo shelf, hi shelf, hi pass, lo pass, notch — each with a coloured handle on a continuous response curve and a live input spectrum overlay. Bands shape the rendered double's tone before it hits the output bus.
Micro-detune wander depth. Two incommensurate-rate sin LFOs drift the per-grain pitch up to ±30¢ from source. 0 = identical to source. Higher values feel like a singer who is a touch more relaxed than they were on the main take.
Per-grain timing wander. WSOLA cross-correlation aligns each grain to ±5 ms in the source for phase-coherent OLA at any hop, so wander stays smooth even at high values. Subtle = human; higher = looser second-take timing.
Dynamics modulation depth. Per-grain level wander adds mic-distance variation between takes — micro-loud and micro-quiet syllables on the same line. Subtle values feel human; cranked it pulls toward "different singer."
High-frequency "cotton dab" cut. Takes the edge off without dulling the take — pairs with the granular path's 3 kHz band-split that already passes the original-source HF through untouched, so this works like a tone control on the granular layer.
Stereo placement of the rendered double. L100 = hard left, R100 = hard right. Pan each double across the field to build a chorus that fills the stereo image, or stack them in the centre for thickness.
Per-grain variance amount — adds noise to time and gain wander only. Pitch stays smooth so the key never wanders. Higher values pull the take toward "different singer" rather than "same singer breathing."
Per-double level. Pre-master-output, so the IN meter still reads the source — only the OUT bus reflects this trim. Use it to balance doubles against each other before the master output stage.
Semitone pitch shift. PSOLA-grade — 4-way Hann OLA at 75% overlap, 25 ms grains, cubic Hermite buffer reads. The cached ratio (2^(ST/12)) only recomputes on knob move. Above 3.5 kHz the dry HF passes through, crossfaded out by |SHIFT| so consonants stay clean during gentle shifts.
Micro-detune wander depth on top of SHIFT. Same dual-LFO drift as the offline pitch wander, capped at ±10¢ for live so the centre note stays audible.
Capped lag wander. The live path can't go past the buffer's baseLag headroom, so live timing wander is tighter than offline — still enough to break unison phase against the dry.
Dynamics modulation depth — same range as offline. LFOs are sub-sampled at a 32-sample stride and linear-interpolated, so the live cost stays low while the per-track motion still feels natural.
HF cut on the granular path. Same role as in Export — works alongside the live 3.5 kHz band-split to give a tone control without dulling sibilance.
Stereo placement per live track. Sample-accurate — moving the knob during playback is glitch-free.
Per-grain variance — same role as in Export. The wander rate scales up with VAR while the LFO depths stay capped, so each grain feels like a slightly different micro-take.
Per-track level. Live mix uses juce::FloatVectorOperations::add + multiply, and dB-to-linear is std::exp2(dB / 6.0206) — the per-knob change has near-zero hot-loop cost.
Per-track preset menu. Lists user presets at top, factory presets in a sub-menu, plus Save / Open Folder actions. Drop a saved preset onto any double in either mode — Export and Live share the library.
Opens the per-double EQ pop-up — five band types (bell, lo / hi shelf, hi / lo pass, notch) on a continuous response curve with live spectrum overlay. Tone-shape each double independently before the output bus.
Mute toggle. Mutes only this double — source bus and other doubles keep playing. The button reads ON when active, OFF when muted.
Reseed the RNG and re-render. Each double's wander LFOs start at incommensurate phases, so reseed gives a meaningfully different take with the same knob settings. Use it when a double doesn't quite vibe with the lead.
Drag the chip onto a track in your DAW — the rendered double writes to a temp .wav and the OS-native drag begins. Drop-in is sample-aligned with your source position.
Delete this double row. The render scratch buffer is freed; A/B and presets remember their own sets, so removing a row in the live state doesn't touch what's stored in slot B.
Master output trim. Sits ahead of the output bus meters. Single big black knob; reads 0.000 at unity. Use to make up for designer mode level drop or to leave headroom before the DAW's track fader.
Single-knob tilt EQ around a 1 kHz fulcrum. Negative = darker, positive = brighter. Reads FLAT at zero. Tilt sits after the doubles mix so it shapes the whole stack at once.
Master track-spacer amount. Cranks the per-double 4-stage all-pass cascade (alternating-sign, hierarchical curve) to remove the comb-filter phasing between doubles and dry vocal. State persists for A/B and presets.
Mixes the source (Export) or live input (Live) back into the output. Off = only the doubles. On = doubles + source. Useful when you need the dry inside the plug-in for monitoring rather than in your DAW chain.
(Live mode) Passes the host input through to the output. Toggle off and only the doubles are heard — useful for routing the plug-in onto a send / aux track.
Vertical green→yellow→red meters for IN and OUT. The CLIP indicator turns red when the output bus peaks ≥ 1.0. Same canonical gradient regardless of signal — meters indicate severity, not identity.
Both. EXPORT mode renders pre-baked doubles offline from a loaded sample with the magnum-opus algorithm — 150 ms Tukey grains, 8-way OLA, WSOLA alignment, onset-aware placement. LIVE mode runs on the host input in real time with a PSOLA-grade engine — 25 ms grains, 4-way Hann OLA at 75% overlap, ±12 semitone SHIFT, ~25 ms latency. Tabs switch between them; A/B and presets are shared.
No, Gallium doesn't snap to scale. DETUNE in Live and PITCH in Export are micro-detune wander (±10¢ live / ±30¢ offline), not correction. The Live SHIFT knob is a deliberate ±12-semitone pitch shifter — set it, the whole double sits at that interval. Tune your source first if it needs it.
Unlimited. Each one uses its own RNG seed and independent LFO phases, so adding a fifth double sounds like a fifth singer, not a copy. Live cost is ~62 ops/sample per double on Apple Silicon — about 14 doubles fit in 5% of one core at 44.1 kHz. Past ~6 it starts to ensemble-blur — the tool resists wandering into chorus territory, but you can. DESIGNER hierarchically decorrelates them so D5+ stays out of the dry's way phase-wise.
Two reasons. Band-split HF passthrough. Above 3 kHz (offline) / 3.5 kHz (live), the granular path drops out and the original-source HF (delay-aligned) is substituted in. The "tinny / canny" sound of granular pitch shifters lives almost entirely in sibilance + breath transients, so passing those through untouched restores transient clarity. Onset-aware placement. The offline renderer snaps grain starts to detected onsets within ±20 ms and damps drift LFOs to 0.30× for the first 30 ms after each onset — consonants stay crisp.
Per-track. Every double row has a PRE button that opens a popup with your saved presets and a Factory sub-menu. 40 hand-tuned factory vibes ship in five groups — soft / intimate, wide / dense, aggressive / dirty, studio / clean, lo-fi / vintage, stylised / character. Save your own as .gtrack JSON. The library re-seeds Factory on launch if the count on disk is smaller than the embedded count, so future updates can grow the bank without forcing a reset. Same library shared between Export and Live.
It's a track-spacer. Cranking it removes the comb-filter phasing that unison-style doublers create when stacked together. Per-double 4-stage 1st-order all-pass cascade with hierarchical strength (D1 stays close to the source, D5+ fully decorrelated) and alternating-sign coefficients across the four stages — the decorrelation spreads evenly across the spectrum so doubles decorrelate against each other AND against the dry. Runs in both Export (offline) and Live (real-time) paths.
License keys via Lemon Squeezy. Online activation on first launch, two device slots per key, and a 30-day re-validation that revokes refunded keys (closes the refund-and-keep loophole). The local license.dat is FNV-1a-HMAC-signed against a per-product secret. DEACTIVATE in Settings frees the device slot in your account. Unlicensed runs in demo mode — 30 seconds of audio, then a clean atomic-state silence (no pops or glitches) until you license.
Demo mode runs unlicensed: 30 seconds of audio per session, then silenced cleanly. Buy and activate to lift the gate. Gallium is $59.99 with a 30-day no-questions refund — buy it, run it on a real take, send it back if it doesn't earn its place.
Yes to both. Mac builds are Universal binaries — arm64 (Apple Silicon) + x86_64 (Intel). Windows is x64. VST3, AU, and a Standalone build (Mac + Windows) are included for offline preview without a host. Same key works on either OS, two activations split however you like. The Mac .pkg ad-hoc signs the bundle to satisfy Gatekeeper without an Apple Developer ID.
$59.99 perpetual license. Two activations. 30-day refund. v1.x updates included — every minor adds knobs, presets, and CPU savings at no extra charge. VST3 · AU · Standalone. Mac Universal + Win x64.