ToneMatch matches a guitar tone from a song's real audio. Give it the recording and your own dry guitar, and it returns the amp settings that make you sound like the record.
The tone errors are the measured medians for a studio file, guitar only. The knob positions are illustrative.
The matcher only gets what a guitarist actually has: the song, and a recording of their own guitar plugged straight in (a DI). It never sees the original amp or its settings.
A small convolutional network listens to the song's log-mel spectrum and predicts seven amp knobs directly, plus a 128-d tone embedding. It is 3.4 MB as Core ML and runs on an iPhone, so the first answer is almost instant.
Starting from that guess, CMA-ES (an evolution strategy) renders your DI through the amp at candidate settings, measures how far each one is from the song, and moves the knobs toward the closest. The guess means it starts near the answer instead of at noon.
Median tone error in dB on 24 real mic'd-amp recordings per condition, each matched from a different take of the player's DI and scored on a held-out passage, so it measures tone rather than which notes were played. The baseline sets every knob to noon.
58% less error · 24 / 24 wins
57% less error · 24 / 24 wins
Here the search is slightly worse than the encoder alone · 21 / 24 wins
53% less error · 22 / 24 wins
| Condition | Baseline | Encoder only | Encoder + search | Wins (encoder + search) |
|---|---|---|---|---|
| Studio file, guitar only | 3.68 | 1.81 | 1.54 | 24 / 24 |
| Studio file, full band mix | 3.68 | 1.84 | 1.60 | 24 / 24 |
| Phone mic in a room, guitar only | 3.68 | 1.91 | 1.96 | 21 / 24 |
| Phone mic in a room, full band mix | 3.68 | 1.94 | 1.72 | 22 / 24 |
The encoder's prediction alone beats the baseline on 24 / 24 cases in every condition. In the hardest setting, a band playing through a phone speaker into a room and heard by a phone mic, encoder + search cuts tone error by 53%. The test set is small, 24 real cases per condition, so the medians come with bootstrap intervals in the run output. Released encoder: run 3, step 15,723. Error is a multi-resolution STFT log-magnitude distance.
The repo includes the benchmark used to build ToneMatch. Every matcher gets the same targets, DIs and scoring passages, so runs compare case by case, and every one has to beat knobs at noon.
Targets made with known settings through the bench's own amp model, so knob error can be measured as well as tone.
Guitar-TECHS mic'd-amp recordings, scored against the real amp on a passage the matcher never heard.
None, a mix (EQ and bus compression), full (plus reverb and MP3), or room: a phone speaker, room reflections, noise, a phone mic and AGC.
The guitar alone, inside a synthetic band mix, or separated back out with an oracle, Demucs or Spleeter.
A different DI take, or a play-along with timing drift and a few wrong notes, like a real player.
Noon knobs, spectrum fitting, AFx-Rep embedding search, the encoder alone, and encoder + search.
Needs Python 3.11+ and uv. The audio isn't included: download Guitar-TECHS and put it in data/guitar-techs/ at the repo root.
# Baselines (numpy only) cd bench uv run python run.py # The released encoder, with and without search (needs torch) uv run --group afx python run.py --matchers default pred_only pred_then_search uv run --group afx python run.py --level room --band mix --matchers default pred_only pred_then_search # Re-print tables from saved results uv run python report.py results/run-*.json
train_encoder.py trains on an Apple Silicon GPU (about 6.5 hours for run 3, also using GuitarSet), select_encoder.py picks a checkpoint and export_coreml.py exports it.
The Swift code from the app is included for reference: the log-mel front end, the Core ML runner, CMA-ES and the matcher.
Apache 2.0. The released weights were trained on Guitar-TECHS and GuitarSet (CC BY 4.0); credit them if you use the weights. Full credits are in NOTICE.