Transposition Techniques
Transposition is the process of moving musical content up or down in pitch while maintaining the same intervallic relationships. The MusicTheory library provides comprehensive transposition support for notes, chords, and scales.
Understanding Transposition
- Transposition
Moving all notes by the same interval while preserving their relationships
- Interval-based
Transpose by musical intervals (major 3rd, perfect 5th, etc.)
- Semitone-based
Transpose by a specific number of half-steps
- Key-to-key
Transpose from one key to another
Transposing Notes
By Interval
var c4 = new Note(NoteName.C, Alteration.Natural, 4);
// Transpose up by intervals
var e4 = c4.Transpose(new Interval(IntervalQuality.Major, 3), Direction.Up);
var g4 = c4.Transpose(new Interval(IntervalQuality.Perfect, 5)); // Up is default
var c5 = c4.Transpose(new Interval(IntervalQuality.Perfect, 8), Direction.Up);
// Transpose down by intervals
var a3 = c4.Transpose(new Interval(IntervalQuality.Major, 3), Direction.Down);
var f3 = c4.Transpose(new Interval(IntervalQuality.Perfect, 5), Direction.Down);
// Verify results
Console.WriteLine(e4); // E4
Console.WriteLine(a3); // A3
By Semitones
var c4 = new Note(NoteName.C, Alteration.Natural, 4);
// Transpose up by semitones
var cSharp4 = c4.TransposeBySemitones(1); // C#4
var d4 = c4.TransposeBySemitones(2); // D4
var c5 = c4.TransposeBySemitones(12); // C5 (octave)
// Transpose down by semitones
var b3 = c4.TransposeBySemitones(-1); // B3
var a3 = c4.TransposeBySemitones(-3); // A3
var c3 = c4.TransposeBySemitones(-12); // C3 (octave down)
Transposing Chords
Basic Chord Transposition
// Original chord
var cMaj7 = new Chord(new Note(NoteName.C, 4), ChordType.Major7);
// Transpose up a perfect 4th
var fMaj7 = cMaj7.Transpose(new Interval(IntervalQuality.Perfect, 4));
Console.WriteLine(fMaj7.GetSymbol()); // Fmaj7
// Transpose down a major 2nd
var bbMaj7 = cMaj7.Transpose(
new Interval(IntervalQuality.Major, 2),
Direction.Down
);
Console.WriteLine(bbMaj7.GetSymbol()); // Bbmaj7
// Verify the notes transpose correctly
var originalNotes = cMaj7.GetNotes().ToList(); // C, E, G, B
var transposedNotes = fMaj7.GetNotes().ToList(); // F, A, C, E
Maintaining Chord Quality
// Complex chord with extensions
var c13 = new Chord(new Note(NoteName.C, 4), ChordType.Dominant13);
// Transpose to different keys
var f13 = c13.Transpose(new Interval(IntervalQuality.Perfect, 4));
var g13 = c13.Transpose(new Interval(IntervalQuality.Perfect, 5));
var eb13 = c13.Transpose(new Interval(IntervalQuality.Minor, 3));
// All maintain the same chord quality
Console.WriteLine(c13.GetSymbol()); // C13
Console.WriteLine(f13.GetSymbol()); // F13
Console.WriteLine(g13.GetSymbol()); // G13
Console.WriteLine(eb13.GetSymbol()); // Eb13
Transposing Scales
Scale Transposition
// Original scale
var cMajor = new Scale(new Note(NoteName.C, 4), ScaleType.Major);
// Transpose to different keys
var dMajor = cMajor.Transpose(new Interval(IntervalQuality.Major, 2));
var gMajor = cMajor.Transpose(new Interval(IntervalQuality.Perfect, 5));
var bbMajor = cMajor.Transpose(
new Interval(IntervalQuality.Major, 2),
Direction.Down
);
// Compare scale notes
var cNotes = cMajor.GetNotes().Take(8).Select(n => n.ToString());
// C4, D4, E4, F4, G4, A4, B4, C5
var gNotes = gMajor.GetNotes().Take(8).Select(n => n.ToString());
// G4, A4, B4, C5, D5, E5, F#5, G5
Modal Transposition
// D Dorian (all white keys starting on D)
var dDorian = new Scale(new Note(NoteName.D, 4), ScaleType.Dorian);
// Transpose to A Dorian
var aDorian = dDorian.Transpose(new Interval(IntervalQuality.Perfect, 5));
// A Dorian has one sharp (F#)
var aDorianNotes = aDorian.GetNotes().Take(8).Select(n => n.ToString());
// A4, B4, C5, D5, E5, F#5, G5, A5
Transposing Progressions
Key-to-Key Transposition
public class ProgressionTransposer
{
public List<Chord> TransposeProgression(
List<Chord> originalChords,
KeySignature fromKey,
KeySignature toKey)
{
// Calculate the interval between keys
var interval = Interval.Between(fromKey.Tonic, toKey.Tonic);
// Transpose each chord
return originalChords
.Select(chord => chord.Transpose(interval))
.ToList();
}
public void TransposeByRomanNumerals(
string romanProgression,
KeySignature fromKey,
KeySignature toKey)
{
// Parse in original key
var fromProg = new ChordProgression(fromKey);
var originalChords = fromProg.ParseProgression(romanProgression).ToList();
// Parse in new key (maintains functions)
var toProg = new ChordProgression(toKey);
var transposedChords = toProg.ParseProgression(romanProgression).ToList();
// Display results
for (int i = 0; i < originalChords.Count; i++)
{
Console.WriteLine(
$"{originalChords[i].GetSymbol()} → {transposedChords[i].GetSymbol()}"
);
}
}
}
// Usage
var transposer = new ProgressionTransposer();
// Transpose ii-V-I from C to F
transposer.TransposeByRomanNumerals(
"ii7 - V7 - IMaj7",
new KeySignature(new Note(NoteName.C), KeyMode.Major),
new KeySignature(new Note(NoteName.F), KeyMode.Major)
);
// Output: Dm7 → Gm7, G7 → C7, CMaj7 → FMaj7
Common Transposition Patterns
Transposing for Different Instruments
public static class InstrumentTransposition
{
// B♭ instruments (Trumpet, Clarinet, Tenor Sax)
public static Note TransposeForBbInstrument(Note concertPitch)
{
// Up a major 2nd for written pitch
return concertPitch.Transpose(
new Interval(IntervalQuality.Major, 2),
Direction.Up
);
}
// E♭ instruments (Alto Sax, Baritone Sax)
public static Note TransposeForEbInstrument(Note concertPitch)
{
// Up a major 6th for written pitch
return concertPitch.Transpose(
new Interval(IntervalQuality.Major, 6),
Direction.Up
);
}
// F instruments (French Horn)
public static Note TransposeForFInstrument(Note concertPitch)
{
// Up a perfect 5th for written pitch
return concertPitch.Transpose(
new Interval(IntervalQuality.Perfect, 5),
Direction.Up
);
}
}
// Example: Concert C for different instruments
var concertC = new Note(NoteName.C, 4);
var bbInstrument = InstrumentTransposition.TransposeForBbInstrument(concertC); // D
var ebInstrument = InstrumentTransposition.TransposeForEbInstrument(concertC); // A
var fInstrument = InstrumentTransposition.TransposeForFInstrument(concertC); // G
Capo Transposition for Guitar
public class GuitarCapo
{
private readonly int capoFret;
public GuitarCapo(int fret)
{
if (fret < 0 || fret > 12)
throw new ArgumentException("Capo fret must be between 0 and 12");
capoFret = fret;
}
// Get the actual sounding pitch
public Note GetSoundingPitch(Note frettedNote)
{
return frettedNote.TransposeBySemitones(capoFret);
}
// Get the chord shape to play for desired sound
public Chord GetChordShape(Chord desiredSound)
{
return desiredSound.Transpose(
new Interval(IntervalQuality.Perfect, 1),
Direction.Down
).TransposeBySemitones(-capoFret);
}
}
// Capo on 3rd fret
var capo3 = new GuitarCapo(3);
// Playing C shape sounds as Eb
var cShape = new Chord(new Note(NoteName.C), ChordType.Major);
var actualSound = cShape.Transpose(
new Interval(IntervalQuality.Perfect, 1)
).TransposeBySemitones(3); // Eb major
Advanced Transposition
Enharmonic Considerations
public class EnharmonicTransposer
{
public Note TransposeWithBestSpelling(
Note original,
Interval interval,
KeySignature targetKey)
{
// Transpose normally
var transposed = original.Transpose(interval);
// Check if the note fits the key
if (targetKey.AlteredNotes.Contains(transposed.Name))
{
var alteration = targetKey.GetAlteration(transposed.Name);
if (alteration != transposed.Alteration)
{
// Consider enharmonic equivalent
var enharmonic = transposed.GetEnharmonicEquivalent();
if (enharmonic != null &&
!targetKey.AlteredNotes.Contains(enharmonic.Name))
{
return enharmonic;
}
}
}
return transposed;
}
}
Chromatic Transposition
public class ChromaticTransposer
{
public List<Note> TransposeChromaticLine(
List<Note> chromaticNotes,
int semitones)
{
return chromaticNotes
.Select(note => note.TransposeBySemitones(semitones))
.ToList();
}
public List<Note> TransposeDiatonically(
List<Note> notes,
Scale fromScale,
Scale toScale,
int degreesUp)
{
var transposed = new List<Note>();
foreach (var note in notes)
{
// Find degree in original scale
var degree = fromScale.GetDegree(note);
if (degree > 0)
{
// Get corresponding degree in new scale
var newDegree = ((degree - 1 + degreesUp) % 7) + 1;
var newNote = toScale.GetNotes().ElementAt(newDegree - 1);
transposed.Add(newNote);
}
else
{
// Non-diatonic note - transpose chromatically
var interval = Interval.Between(fromScale.Root, toScale.Root);
transposed.Add(note.Transpose(interval));
}
}
return transposed;
}
}
Best Practices
Consider the musical context: Choose transposition that maintains playability
Watch for enharmonics: F# and Gb may require different transposition strategies
Preserve chord functions: When transposing progressions, maintain the harmonic relationships
Check instrument ranges: Ensure transposed notes are playable on the target instrument
Use appropriate spelling: Choose sharps or flats based on the target key
Common Use Cases
Song Key Changes
// Original song in G major
var originalKey = new KeySignature(new Note(NoteName.G), KeyMode.Major);
// Singer needs it in E major (down a minor 3rd)
var newKey = new KeySignature(new Note(NoteName.E), KeyMode.Major);
var interval = Interval.Between(originalKey.Tonic, newKey.Tonic);
// Transpose all elements
var originalMelody = new[] { /* notes */ };
var transposedMelody = originalMelody
.Select(n => n.Transpose(interval))
.ToArray();
Modulation Within a Piece
// Start in C major
var section1 = new[]
{
new Chord(new Note(NoteName.C), ChordType.Major),
new Chord(new Note(NoteName.F), ChordType.Major),
new Chord(new Note(NoteName.G), ChordType.Major)
};
// Modulate up a half step for dramatic effect
var section2 = section1
.Select(chord => chord.TransposeBySemitones(1))
.ToArray(); // Db, Gb, Ab
13 June 2025