Back to Tuner

How Accurate Is GuitarTunePro?

What the algorithm actually does, real measured error per string, and the honest caveats — not a bare "±1 cent" claim with nothing behind it.

What the Detector Actually Does

GuitarTunePro does not use an FFT to find pitch. The live detector (lib/pitchDetection.ts, detectPitch()) captures 4096 audio samples at a 48 kHz sample rate and runs a time-domain autocorrelation, YIN-inspired pitch estimator on that window: it correlates the signal against delayed copies of itself, picks the first strong peak in the expected lag range for guitar frequencies (40 Hz–1 kHz), and converts that lag directly to a frequency. A confidence score (the peak's strength relative to zero-lag autocorrelation) has to clear a threshold before a reading counts as detected.

An FFT-based detector exists in the same file (detectPitchFFT(), using a Goertzel-algorithm frequency sweep) but is not the one the app uses — the PitchDetector class that powers the live tuner is hardcoded to autocorrelation. It is only called out here because the site's own copy previously said "FFT" in a few places; that was inaccurate, and is being corrected as part of this page.

The reading you see on screen is also smoothed: successive frames are pushed through a 5–7 sample rolling median (PitchSmoother) before display, which damps single-frame jitter on a sustained note. The test below measures the unsmoothed, single-window output — the conservative case — because that's what the raw algorithm can be held to.

Methodology

There's no microphone in the environment this test was built in, so this is not a live recording of a real guitar. It is a synthesized-signal test: for each target frequency, a fundamental-plus-harmonics waveform (a rough approximation of a plucked string, with a small amount of natural pitch settling built in) is generated in code and fed directly into the same detectPitch() function the browser calls — not a reimplementation, the actual shipped function.

Two noise conditions, added as Gaussian noise on top of the synthesized tone:

  • Quiet: a small noise floor, standing in for a clean pluck close to a phone mic in a quiet room.
  • Noisy: substantial broadband noise, standing in for a laptop's built-in mic with room and fan noise present.

40 trials per string per condition, seeded with a deterministic PRNG so the run is reproducible. For each successful detection, the error is measured in cents relative to the true equal-temperament frequency (A4 = 440 Hz). The full script is checked into the repository at scripts/accuracy-test.ts and runs with npx tsx scripts/accuracy-test.ts — anyone can re-run it against the live algorithm.

One thing this test surfaced: in the quiet condition, every trial for a given string returned the exact same error. That's not a mistake — the detector picks an integer sample-lag with no sub-sample interpolation, so at very low noise it locks onto the same lag bin every time. The "error" you see for quiet conditions below is really that string's fixed quantization bias, not trial-to-trial noise. Under real noise, the bias is joined by genuine variance, which is why the noisy column has a mean different from its max.

Measured Results

StringReferenceQuiet — mean / max errorNoisy — mean / max errorDetected
E2 (Low E)82.41 Hz1.35¢ / 1.35¢3.30¢ / 7.55¢100%
A2110.00 Hz1.44¢ / 1.44¢2.91¢ / 6.48¢100%
D3146.83 Hz0.48¢ / 0.48¢2.66¢ / 5.77¢100%
G3196.00 Hz0.72¢ / 0.72¢2.98¢ / 7.77¢100%
B3246.94 Hz3.38¢ / 3.38¢4.18¢ / 5.52¢100%
E4 (High E)329.63 Hz4.54¢ / 4.54¢6.02¢ / 7.36¢100%

40 trials per string per condition. Error in cents, relative to equal temperament at A4 = 440 Hz. "Detected" is the share of trials where the confidence threshold was cleared.

What We Actually Claim

Based on this data, we don't advertise a bare "±1 cent" figure — it isn't what this testing shows for every string. What the data supports:

  • In quiet conditions, single-reading error stayed under 5 cents for every string tested, and under 2 cents for four of the six.
  • With realistic background noise, single-reading error averaged under 4 cents, with a worst case around 8 cents on the readings tested.
  • Detection succeeded in 100% of trials in both conditions at the noise levels tested — the algorithm did not fail to produce a reading, even when that reading had a few cents of error.
  • The live app's rolling median smoothing (not included in the numbers above) further stabilizes a sustained, held note beyond what a single window achieves alone.

5–10 cents is well within what a human ear can reliably use to tune a guitar, and tighter than what most players achieve tuning by ear alone — but it is not "professional studio-grade to the cent," and we no longer say it is anywhere on this site.

What This Test Doesn't Cover

  • It's a synthesized signal, not a real guitar through a real microphone and real room acoustics — those introduce timbral and noise characteristics a synthesized harmonic series doesn't fully capture.
  • It doesn't test different microphone hardware, string condition, or playing technique, all of which affect real-world results.
  • It measures the raw detector only, not the full smoothed on-screen reading during sustained play.

If you have measurements from a real instrument and microphone that contradict or refine this, we want to know — see the contact page.

Try the tuner yourself.

Open Free Guitar Tuner →