snails.fm/ docs voice tuner

The voice tuner

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)

The snails.fm voice tuner is a real-time pitch corrector and harmoniser for one voice. It listens to what you sing, decides where each note should sit, and re-sings your voice there, keeping the sound of your throat while it does. Hold a chord over MIDI and up to fifteen more voices join you.

VST3 and AU, macOS (Apple Silicon native). One voice in; it is not a polyphonic corrector.

The algorithms are classical and published. The product is the hundred small decisions layered on top of them, and here they all are. These pages open the box completely: every stage of the machine, what it does, why it's there, and what you'd hear without it. If you leave able to explain the diagram above in your own words, the docs have done their job.

How the machine is shaped

The engine splits in two. A control path does all the thinking: it listens to a mono copy of your voice, decides which pitch estimates to trust, picks targets, and glides toward them. An audio path does all the singing: it re-renders your voice at the decided pitch, per channel, plus the harmony and doubler voices. The only thing that crosses between them is a stream of numbers: one shift ratio per voice, updated every 64 samples. Everything else about the sound is left alone.

The walk through the diagram, left to right:

  • Listening: the mono sum and the pitch detectors.
  • Deciding: the gates, the targets, the glide. Where the tuner's judgement lives.
  • Singing: the pitch shifter, and why there are two of them.
  • The crowd: fifteen harmonies, four doubles, and how they enter without clicking.
  • Time: latency, honestly. Where it comes from, what the Range control trades, what Live mode changes.

Then the reference: Parameters, the FAQ, and Under the hood, the engineering posture of the thing (deterministic, allocation-free, built in Rust, measured rather than asserted).

The honest numbers

  • Latency: ~19–46 ms in Studio mode, ~10–24 ms in Live mode, both depending on Range. Always reported to the host, so recorded tracks land on the grid. Bypass is delay-matched; toggling it never shifts timing.
  • CPU: about 1.7 % of one core (stereo, default settings, Apple M2, 48 kHz).
  • Renders are bit-identical: the same input and settings produce the same output, every time. There is no randomness anywhere in the plugin.
  • No AI, no machine learning, no network access, no telemetry. Every algorithm is published, classical DSP, implemented in-house.

What it deliberately doesn't do

Polyphonic input: it is a one-voice instrument. Pitch below its Range floor: rather than mis-shift a note it can't represent, it hands your dry voice through. Vibrato synthesis: your vibrato is yours; the tuner adds none. And no tone processing of any kind: no saturation, no EQ, no compression. It moves pitch, and that is all it does.

last updated · Charlie