snails.fm/ docs voice tuner

Time

Control path: once per 64-sample chunk, on the mono sum——— audio   – – – controlx(n)per channelmono sumshift ratios: per chunk, per voiceequal-power pan → stereo busy(n)MCSMono control sumPDPitch detectionpYIN / YINRGTReliability gatesonset · floor · corridorSMFf₀ smoothingTSLTarget selectionScale / MIDIGLDRetune glideMIDISHFLead pitch shifterTD-PSOLA / phase vocoderHarmony voices ×15HVHVHVADT doubles ×4DVDVLatency alignmentALNDry / wet mixMIXz−LDelay-matched dry pathdry (bypass rides this path)

Every pitch shifter owes the laws of physics a debt, and this page is where the voice tuner pays it in the open. The debt is latency. The first honest thing to say about it is that it is not a quality setting.

Why latency exists at all

To shift a note, the shifter must hold enough of it in hand to work with: roughly three full cycles of the lowest pitch it promises to handle. Low pitches cycle slowly, so the lower the promise, the longer the wait. No optimisation removes this; it is a causality commitment. The only honest way to reduce it is to promise less.

That is exactly what the Range control does. It sets the floor (the lowest pitch the shifter commits to), and the latency follows:

Range Floor Studio mode Live mode
Full 65 Hz ~46 ms ~24 ms
Low 80 Hz ~37 ms ~19 ms
Mid 110 Hz ~27 ms ~14 ms
High 160 Hz ~19 ms ~10 ms

(48 kHz figures.) Input that falls below the chosen floor is handed through dry rather than mis-shifted. The mechanism, including the 40 ms glitch ride-through, is on the deciding page. And the detector always hears the full 70–1000 Hz regardless of Range: the tuner knows the note it is declining to move.

Live mode

Studio mode spends its latency budget looking ahead: grains are built with audio from both sides of the moment being rendered. Live mode rebuilds the grain geometry to be nearly causal: the rise of each grain comes entirely from audio already received, with only a quarter-period of lookahead for the fall. It works at every Range (the floor you need is set by your voice, not by the mode), and the causal geometry roughly halves each floor's wait, down to ~10 ms in to out at Range = High. Tracking-friendly on a dry mic, which is what it's for. Live mode is PSOLA-only.

What the host is told

The plugin reports its exact latency to the host for delay compensation, so recorded and monitored material lands on the grid. AU hosts are notified the moment it changes; VST3 hosts pick up the new value when the plugin is re-activated. Mid-session renegotiation is a known deferred item.

Bypass is delay-matched: the bypass path is a dry delay of identical length, so toggling it never shifts timing and never clicks. Bypassed CPU is approximately zero.

Alignment and the mix

Everything rendered is delay-aligned to a single common latency before the mix: the lead (both engines, when both are running), the harmony bus, the doubles, and the dry signal. Because the alignment is exact, the Mix control blends processed against dry phase-coherently: no comb filtering from the blend itself, at any setting.

This is also the quiet answer to a classic parallel-processing headache: there is no "nudge the dry track to taste" step. The tuner has already done the aligning, sample-exactly, inside the box.

last updated · Charlie