Dialing In the Ghost in the Machine: LLMs for guitar tones -
Skip to content
Code, music and transience
Search for:
If you think AI near music is bullshit and LLMs shouldn’t touch tone — bounce now 🙂
I thought I knew my effects pedal until LLMs came along . The models know every pedal ever made and the conventional wisdom about where each archetype lives in the chain and more importantly, know the exceptions like fuzz before wah for Hendrix tones or compression after reverb for shoegaze bands. Its been humbling pitting my limited pre-existing tones on amp sims versus the settings an LLM can spit out which sound devastatingly better. Though putzing around on a tube amp towering over an effects pedal for 30 minutes to get your sound has its own charm.
If you prefer just looking at the code : tonellm
175B Parameters on your pedal
I’ve been on a late-80s / early-90s tone binge for a while — Amp Sims, Rockman X100 experiments, Dave Williams-style pop rhythm, the usual rabbit holes I wrote about in Unlocking the Groove. Turning knobs by hand is fun until you want “David Williams 80s pop rhythm, chorus and plate” or “Brian May Queen One Vision rhythm” at 11 pm and your brain is fried after a long day of Office Space-ish meetings.
Polychrome DSP ( while i have no affiliation to Polychrome, I recommend this amp simulator that has unlocked so many tones for me!) has become my playground for actually playing those ideas instead of wasting time turning knobs to hone in on the sound.
So I built Tone LLM (tonellm): a small Python tool that turns a text description (and optionally a reference MP3) into a .pdpreset you can load in Polychrome. The trick is not “ask the model to write plugin XML.” The model fills a small JSON contract ; Python owns the XML. That split is the whole story — for obsessed axemen who care about why a preset is shaped a certain way, and for AI engineers who care about not shipping hallucinated attributes into a proprietary file format.
Also, its easier arguing with a JSON file than banging your head (headbanging?) against the wall wondering why your tone sounds nothing like the original.
The problem with “just use ChatGPT for presets”
Polychrome presets are XML. Hundreds of attributes, channel-specific prefixes (AC, CA, CB, GA), cab IR slot integers, sync-locked delay subdivisions. LLMs are excellent at sounding like they know an amp; they are unreliable at emitting exact plugin state. One wrong attribute name and the preset is corrupt or silently wrong. Its like stepping on the telecaster clean tone patch while playing a Bathory setlist.
I also didn’t want a second brain for audio. If librosa measures brightness and I also train a classifier for “Marshall vs 5150,” I’d be maintaining two sources of truth. The design goal: one tone engineer (the system prompt) that already speaks in mids, plate verb, and era — optionally flavored by measured features from a reference track so I can laze my way out of what took me hours of research earlier.
Architecture
Inputs
Here’s how the inputs map to intent:
InputRequiredRoleText queryYesArtist, song, part, or era — e.g. Phil Collen Run Riot rhythm or Dave Williams 80s pop rhythmGuitar / tuningNoCompensates pickup output (RG3550 vs Strat, Drop D vs E)Reference audioNoMP3/WAV/FLAC → spectral featuresSectionNoTime range on a full mix — isolate the solo
Outputs
.pdpreset — load in Polychrome User folder
.tone.json — same basename, audit and edit without calling the LLM again
Layer 1: The contract (ToneDescriptor)
The LLM never writes plugin XML. It produces a Pydantic model — normalized knobs 0.0–1.0, enums for cab/boost/delay/reverb, plus fields meant for humans:
"""ToneDescriptor: high-level tonal intent emitted by the LLM.
The LLM never writes plugin XML directly. It produces this object,<br>and a deterministic translator maps it to .pdpreset attributes.<br>This isolates LLM weirdness from plugin correctness.<br>"""
confidence is the model’s honest self-rating
production_notes is where the pedagogy lives — why these mids, what to listen for, common mistakes for that era.
daw_recommendations is only for what the plugin cannot do (double-tracking, bus comp, post-EQ). The system prompt explicitly forbids telling you to add delay in the DAW when Polychrome already has delay in the descriptor. I kept this on initially and had a few bad outputs when the system kept stacking effects over each other.
Example sidecar fragment (from the repo’s Phil Collen worked example in tone_system.md – your runs will differ and check the video in the README for the results of the lead tone):
"artist": "Def Leppard",<br>"song": "Run Riot",<br>"era": "1987 Hysteria",<br>"role": "rhythm",<br>"amp_channel": "gain",<br>"gain_amount": 0.62,<br>"mid": 0.62,<br>"cab_archetype": "greenback_4x12",<br>"boost_pedal": "screamer",<br>"chorus_amount": 0.28,<br>"delay_role": "off",<br>"reverb_type": "plate",<br>"reverb_mix": 0.11,<br>"widener_on": false,<br>"confidence": 0.78,<br>"production_notes": "JCM800 + Rockman...