The concept of "inversion" is usable in some harmonic styles and situations, and sometimes it is even useful. In some conditions or styles, it is possible to unambiguously answer the inversion or not question. Outside those conditions the question can be ambiguous. In the following, I formulate a style or discipline of using chords, where it IS possible to say if a chord is an inversion, and where it's also possible to say if a chord falls outside this area of applicability. In other styles the concept may still be useful, for example for finding a roughly equivalently behaving chord, even if a canonical non-inverted chord cannot be found.
I'm not saying that this is the ONLY possible harmonic system where the inversion question is unambiguous, but it is ONE such system.
Definition
- By this Definition, the "inversion or not" question only applies to chords that are Pure Stacks of Thirds.
- A chord is (within this definition) a Pure Stack of Thirds, if and only if its note names (ignoring octaves) can be ordered so that the notes form a continuous chain of thirds, and thirds only. If you want maths and more formal-looking things, you can imagine something about modulo 7 arithmetic, where accidentals are thrown away from note names, and the remaining letters are assigned numbers C=0, D=1, E=2, F=3, G=4, A=5 and B=6, and you have to find a permutation for the notes where the sequence goes like note (x) = note (x-1) + 2 (modulo 7), for every 1 < x <= N, where N is the number of notes in the chord. If you can find no such permutation, it is not a stack of thirds. If you can, it is.
- By this Definition, note combinations of less than 3 or more than 6 notes are not considered.
- By this Definition, if a note combination CAN be expressed as a stack of thirds, then the stack-of-thirds permutation is its canonical form, and other names are non-canonical aliases.
- By this Definition, if a note combination CANNOT be expressed as a stack of thirds, then it is outside the scope of this "inversion or root position" logic. For example C-F-G.
So, our isInversion(noteArray) algorithm gives the following possible outputs:
- 0 : noteArray can be expressed as a stack of thirds, and the root note is the lowest note: it is in root position
- 1 : noteArray can be expressed as a stack of thirds, and the root note is not the lowest note: it is an inversion
- 2 : noteArray cannot be expressed as a stack of thirds.
With these requirements and logic, we can say that "C6", C-E-G-A, is a non-canonical alias name for an inversion of Am7: A-C-E-G. Its canonical systematic tertian-harmony name would be Am7/C.
I set an extra limitation to exclude 7-note chords, which allow a full circle around the 7-note modulo arithmetic. If all seven note names are included, then the stack of thirds is ambiguous. For example, C-D-E-F-G-A-B could be said to be Cmaj13 in root position, or Fmaj13(b5) with C in the bass.
If we compare the theoretical model defined above with example chords you can find in the Real World (tm), we'll find lots of chords that either aren't stacks of thirds according to the Definition (and thus it's not possible to give an unambiguous answer to the inversion problem), or which are "incorrectly" named.
- sus chords (no stack of thirds permutation)
- 6 chords (misnomer of m7 inversion)
- "2" chords (no stack of thirds permutation)
- "add" chords (no stack of thirds permutation)
- "5" chords (no stack of thirds permutation)
- anything with the a number "8" or "10" etc.
You'll find lots of that stuff in practice. So the next time you see someone claiming that a chord "actually is" something, for example that C6 is "really" or "actually" an inversion Am7/C, then maybe that person is coming from a theory fantasy land. Take it with a grain of salt. Use theory if it helps you make music.
Actual Implementation
A computer program is a formal definition. Here is a Python program which answers the "inversion or not" question.
import music21
import itertools
def pitchNumber(pitch):
return (7 + ord(pitch.name[0]) - ord('C')) % 7
def isCanonicalStackOfThirds(pitches):
if (2 < len(pitches) < 7):
for i in range(1,len(pitches)):
n_i = pitchNumber(pitches[i])
n_p = pitchNumber(pitches[i-1])
if ((n_i + 5) % 7 != n_p):
return False
else:
return False
return True
def findCanonicalStackOfThirds(chord):
for p in itertools.permutations(chord.pitches, len(chord.pitches)):
if isCanonicalStackOfThirds(p):
return p
return None
def inversionStatus(chord):
canonical = findCanonicalStackOfThirds(chord)
if canonical is None:
return False, canonical
if chord.pitches[0] != canonical[0]:
return True, [pitch.unicodeName for pitch in canonical]
else:
return False, [pitch.unicodeName for pitch in canonical]
for noteSet in ([ \
['F#', 'D', 'A'],
['D', 'A', 'F#'],
['C', 'F', 'G'],
['C', 'E', 'G', 'A'],
['Db', 'Ab', 'F', 'C'],
['C', 'Ab', 'F', 'Db'],
['G', 'F', 'B', 'Eb'],
['G', 'F', 'B', 'D#'],
['C', 'D', 'G'],
['F', 'C', 'E', 'G', 'Bb', 'D'],
]):
chord = music21.chord.Chord(noteSet)
isInversion, canonicalChord = inversionStatus(chord)
if canonicalChord is None:
print (str(noteSet), ' cannot be said to be an inversion of any canonical stack of thirds.')
elif isInversion:
print (str(noteSet), ' is an inversion of ', str(canonicalChord))
else:
print (str(noteSet), ' is in root position. Canonical form: ', str(canonicalChord))
Here is the printout from a run:
['F#', 'D', 'A'] is an inversion of ['D', 'F♯', 'A']
['D', 'A', 'F#'] is in root position. Canonical form: ['D', 'F♯', 'A']
['C', 'F', 'G'] cannot be said to be an inversion of any canonical stack of thirds.
['C', 'E', 'G', 'A'] is an inversion of ['A', 'C', 'E', 'G']
['Db', 'Ab', 'F', 'C'] is in root position. Canonical form: ['D♭', 'F', 'A♭', 'C']
['C', 'Ab', 'F', 'Db'] is an inversion of ['D♭', 'F', 'A♭', 'C']
['G', 'F', 'B', 'Eb'] cannot be said to be an inversion of any canonical stack of thirds.
['G', 'F', 'B', 'D#'] is in root position. Canonical form: ['G', 'B', 'D♯', 'F']
['C', 'D', 'G'] cannot be said to be an inversion of any canonical stack of thirds.
['F', 'C', 'E', 'G', 'Bb', 'D'] is an inversion of ['C', 'E', 'G', 'B♭', 'D', 'F']