Music transposer
Raise C D E F by two semitones and you get D E F# G: paste a note, a melody line or a chord progression, set the half steps up or down, and copy the transposed names. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Semitones
- 2
- Original
- C D E F
- Transposed
- D, E, F#, G
- Transposed text
- D E F# G
- Quantity
- 4
A music transposer is the fastest way to move a melody, riff, or lead-sheet line into another key without rewriting every letter by hand. Paste a single note name or a full progression of notes and chords, choose how many semitones to raise or lower, and this calculator returns the transposed note names using twelve-tone equal temperament. Each token must start with a valid pitch letter A through G and an optional sharp or flat; quality suffixes such as m, 7, or maj7 stay attached to the new root, and slash-bass notes move by the same integer offset.
What the music transposer does and what you get back
Transposing a note means moving its pitch class by a signed number of half steps while keeping any quality suffix that names a chord. In twelve-tone equal temperament each piano key, guitar fret, or half step is one semitone, so a note at pitch class R shifted by N semitones lands at (R plus N) modulo twelve. C raised two semitones becomes D; A minor raised three semitones becomes C minor; F sharp lowered one semitone becomes F; a C slash E raised two semitones becomes D slash F sharp.
Quality suffixes are preserved character-for-character after a valid root: m stays m, 7 stays 7, maj7 stays maj7, sus4 stays sus4. Zero semitones is a valid identity.
Input contract, valid note names, 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). After that root you may attach a quality suffix (m, 7, maj7, sus4, dim, aug, add9, and similar) that is copied onto the new root, and you may attach a slash bass that is itself a valid note name (C/E).
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.
Invalid note names are the defining failure of this page: a token such as H, xyz, a number, or a glyph that is not an English pitch letter is rejected by name so a chart tool cannot publish a fake spelling. Missing notes or missing semitones name the field in the error.
Where a music transposer earns its keep in rehearsal, teaching, and software
Songwriters and vocalists use a music transposer when a demo sits too low or too high: paste the melody notes or 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 line so a singer can speak the verses.
Teachers walk a class through pitch-class arithmetic by showing why C D E F becomes D E F sharp G 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 note names 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 note and semitone limits so continuous-integration pins stay stable.
What you can do with it
Match a recording or horn line
Raise or lower a lead sheet so guitar, piano, and horns share one concert key without rewriting every note name by hand.
FAQ
How do I transpose a note or chord progression by semitones?
Send notes as a string such as C D E F or C Am F G and an integer semitones offset. Positive offsets go up; negative offsets go down.
Which note names does the music transposer accept?
Roots A–G with optional # or b, optional quality suffixes such as m, 7, maj7, sus4, 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 a quality suffix, not a bass.
What does the music 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/music-transposer \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"notes":"C D E F","semitones":2}'const res = await fetch("https://api.kit.forhosting.com/hobby/music-transposer", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"notes": "C D E F",
"semitones": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/music-transposer",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"notes": "C D E F",
"semitones": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/music-transposer", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"notes":"C D E F","semitones":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"notes":"C D E F","semitones":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/music-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
{
"notes": "C D E F",
"semitones": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.music_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_notes | 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 valid note name the request fails with invalid_input instead of silently inventing a spelling.
What a music transposer does and what the response contains
This music transposer accepts one name or a whole progression split on spaces, commas, or pipes, then returns original, the parsed notes list, transposed as an array of names, 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-token root, optional quality, optional bass, and transposed form. There is no audio pitch detector and no full-key diatonic respelling of a 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 note names so a singer, a guitarist, and a script can share one source of truth.
Input contract, valid note names, accidentals, and errors
The required notes field is a string such as C D E F, a comma-separated list, or a pipe-separated chart line; aliases note, chords, progression, input, text, and symbols are accepted, and an array of note-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 names are accepted per request.
Where a music 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 melody or song into a singer's range
Paste the original notes or 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 invalid note names.