Chord transposer
Raise C Am F G by 2 semitones and you get D Bm G A, a major second up. Paste one chord or a whole progression, choose the shift up or down, and print a chart that fits the singer's range. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Chords
- C Am F G
- Semitones
- 2
- Original
- C Am F G
- Chords
- C, Am, F, G
- Transposed
- D, Bm, G, A
- Transposed text
- D Bm G A
A chord transposer is the fastest way to move a song into a singer's range without rewriting every symbol by hand. Paste a single chord or a full progression, choose how many semitones to raise or lower, and this calculator returns the new chord names using twelve-tone equal temperament. Roots and slash-bass notes shift by the same integer offset; recognized qualities such as m, 7, maj7, sus4, dim, aug, and add9 stay attached to the new root.
What transposing does and what you get back
Transposing a chord means moving its root to a new pitch class while keeping the quality that names the harmony. In twelve-tone equal temperament each fret, piano key, or half step is one semitone, so a root at pitch class R shifted by N semitones lands at (R plus N) modulo twelve. A C major triad raised two semitones becomes D; A minor raised three semitones becomes C minor; F sharp minor seven lowered one semitone becomes F minor seven.
Slash chords such as C/E move both the root and the bass by the same offset, so C/E up two semitones is D/F sharp. Quality suffixes are preserved character-for-character when they belong to the recognized catalog: m stays m, maj7 stays maj7, sus4 stays sus4. Zero semitones is a valid identity.
Where a chord transposer earns its keep in rehearsal, teaching, and software
Songwriters and vocalists use a chord transposer when a demo sits too low or too high: paste the four-chord loop, set the half-step offset that matches the new tonic, and print a chart the guitarist can read without capoing in their head. Cover bands match a recording that was issued a step up from the original lead sheet, or drop a horn chart so a singer can speak the verses.
Teachers walk a class through pitch-class arithmetic by showing why the same I–vi–IV–V loop becomes D Bm G A when raised a major second, then flip prefer to flats to show the enharmonic B flat family after a minor-third lift. Worship teams and campfire circles keep one shape chart and several keys; a fast, offline calculator avoids mistakes when the vocalist asks for one more step between songs.
App and tool builders call the same contract from scripts to seed deterministic test vectors for set-list UIs, to normalize user-entered progressions before showing a concert-key badge, or to satisfy programming-challenge statements that demand transposed names rather than a hand-waved guess. Document that enharmonic choices here follow prefer and the accidental family of each input root under equal temperament, not historical temperaments or guitar-specific open tunings, and keep requests inside the published chord and semitone limits so continuous-integration pins stay stable.
What you can do with it
Match a recording or horn chart
Raise or lower a lead sheet so guitar, piano, and horns share one concert key without rewriting every quality by hand.
FAQ
How do I transpose a chord progression by semitones?
Send chords as a string such as C Am F G and an integer semitones offset. Positive offsets go up; negative offsets go down.
Which chord symbols does the chord transposer accept?
Roots A–G with optional # or b, recognized qualities such as m, 7, maj7, sus4, dim, aug, add9, m7b5, and optional slash bass (C/E).
How does the transposer choose sharps versus flats?
Optional prefer is auto, sharps, or flats. Auto keeps each token's accidental family; naturals use sharps when shifting up and flats when shifting down. Set prefer to force one spelling.
Are slash chords such as C/E transposed?
Yes. The bass note shifts by the same number of semitones as the root, so C/E up two semitones becomes D/F#. A slash that is not a pitch (for example 6/9) is treated as quality, not bass.
What does the chord transposer cost?
It is free in your browser on this page.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/hobby/chord-transposer \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"chords":"C Am F G","semitones":2}'const res = await fetch("https://api.kit.forhosting.com/hobby/chord-transposer", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"chords": "C Am F G",
"semitones": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/chord-transposer",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"chords": "C Am F G",
"semitones": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/chord-transposer", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"chords":"C Am F G","semitones":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"chords":"C Am F G","semitones":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/chord-transposer", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"chords": "C Am F G",
"semitones": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.chord_transposer",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_chords | 64 |
min_semitones | -48 |
max_semitones | 48 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
If any token is not a known chord symbol the request fails with invalid_input instead of silently inventing a spelling.
What chord transposition does and what the response contains
This chord transposer accepts one symbol or a whole progression split on spaces, commas, or pipes, then returns original, the parsed chords list, transposed as an array, transposed_text as a copy-ready string, count, the signed semitones you sent, prefer, direction (up, down, or unison), interval as the residual interval name, residual_semitones, octaves_in_shift, method pitch_class_mod12, a short formula string, and items with per-chord root, quality, optional bass, and transposed form. There is no audio chord detector and no diatonic respelling of a full key signature: the engine either evaluates the closed form inside the documented limits or rejects the input with invalid_input. Pair the JSON with your own chart printer if you need PDF lead sheets; this endpoint only rewrites chord names.
Input contract, recognized symbols, accidentals, and errors
Each token must start with a root letter A through G and an optional sharp or flat (ASCII # and b, or the unicode accidentals), then a quality from the closed catalog: empty for a major triad, m or min or the trailing hyphen for minor, 7, maj7, m7, dim, aug, sus2, sus4, 6, 9, add9, m7b5, slash bass, and the usual jazz and guitar extensions listed in the contract. Optional prefer is an enum of auto, sharps, or flats and defaults to auto: auto keeps each token's accidental family, while naturals use sharps when the shift is upward and flats when the shift is downward, so G up three semitones with prefer flats becomes B flat rather than A sharp. Unrecognized chord symbols are the defining failure of this page: a token such as xyz, a German H that is not an English root, or a nonsense quality after a valid letter is rejected by name so a chart tool cannot publish a fake harmony. Missing chords or missing semitones name the field in the error. The required chords field is a string such as C Am F G, a comma-separated list, or a pipe-separated chart line; aliases progression, chord, input, text, and symbols are accepted, and an array of chord-name strings is normalized into the same list. The required semitones field is an integer from minus forty-eight through forty-eight; aliases steps, interval, shift, n, and transpose_by are accepted. Fractions, non-numeric strings, and values outside that range fail with invalid_input and are not billed. At most sixty-four chords are accepted per request.
Where a chord transposer earns its keep in rehearsal, teaching, and software
On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split — free interactive exploration and a priced, identical API — matches the rest of the KIT tier-A catalog and lets you move from a classroom demo to an automated pipeline without changing the mathematical result.
Integration use cases
Move a song into a singer's range
Paste the original progression, choose a signed semitone offset, and copy transposed_text into a rehearsal chart that matches the new tonic.
Deterministic test fixtures for music apps
Generate reproducible transposed arrays for set-list tools, CI assertions, and classroom pitch-class labs that must reject unknown symbols.