Skip to content

chordSymbolFigureFromChord fails to identify RomanNumeral with sus4 or 7sus4 figures (missing 5th) #1866

Description

@dszeto

music21 version

9.9.1

Operating System(s) checked
macOS, Linux

Problem summary
chordSymbolFigureFromChord() fails to identify RomanNumeral chords constructed with sus4 or 7sus4 figures (e.g., II7sus4). The function returns Chord Symbol Cannot Be Identified.

This happens because the RomanNumeral parser generates figured bass shorthand that omits the perfect 5th (e.g., 7sus4 resolves to intervals [7, 4]). When this incomplete pitch collection is passed to chordSymbolFigureFromChord(), the internal dictionary matching strictly requires the 5th to be present for any standard suspended or dominant suspended chord templates, causing the match to fail.

Steps to reproduce

import music21

# Create a 7sus4 roman numeral
rn = music21.roman.RomanNumeral("II7sus4", "F#")

# Attempt to extract its chord symbol figure
chord_figure = music21.harmony.chordSymbolFigureFromChord(rn)
print(f"Chord figure: {chord_figure}")
print(f"Pitches present: {[p.name for p in rn.pitches]}")

Expected vs. actual behavior
Expected behavior: chordSymbolFigureFromChord should return G#7sus (or similar) recognizing the suspended dominant chord.

Actual behavior:

Chord figure: Chord Symbol Cannot Be Identified
Pitches present: ['G#', 'C#', 'F#']

More information
The issue stems from a combination of how the RomanNumeral sets up pitches and how chordSymbolFigureFromChord evaluates them.

  1. Omitted Fifth in Figured Bass Resolution: In music21.roman._parseFigure, expandShortHand is called to expand 7sus4 to ['7', '4']. Because the 5th is not explicit, rn.pitches correctly omits the 5th, yielding only the Root, P4, and m7 ['G#', 'C#', 'F#'].
  2. Strict Root Forcing: Because it is a RomanNumeral, the root is strictly forced (e.g. <music21.pitch.Pitch G#4>).
  3. Failure in harmony.py: In music21/harmony.py within chordSymbolFigureFromChord, the compare() helper function iterates through CHORD_TYPES. The notation string for a standard suspended 7th requires the 5th to be present, and it is not explicitly marked as a permitted omission for this chord type. Because the 5th is missing, compare returns False for the 7sus templates, eventually falling back to Chord Symbol Cannot Be Identified.

Attempted Workarounds
Manually injecting the perfect 5th into the roman numeral before passing it to the analyzer allows it to match correctly:

rn = music21.roman.RomanNumeral("II7sus4", "F#")
rn.add("D#5")  # Explicitly add the missing P5
print(music21.harmony.chordSymbolFigureFromChord(rn))
# Output: 'G#7sus'

Activity

  1. mscuthbert commented on Feb 27, 2026

    @mscuthbert
    Member

    The addition of sus chords to RN theory (over the past 10-15 years) is really stretching what both RNs and ChordSymbols represent best (though nothing compared to the differences between I6 and C6...)

    I had never thought about supporting sus4 chords with 7ths or other added tones. Can you point to where they are used with this notation in a published theory source?

    If it is a documented existing usage, would it be right in thinking that in creating RNs with "sus4" (II7sus4, V9sus4, vi13b9[no7]sus4/V ) - Music21's strategy should be to mark that "sus4" is desired; remove sus4 from the numeral; parse it; remove the 3rd; add a generic 4th above the root? [if not there already--thinking of V11sus4] (Or is it always a P4 above the root? in C major, is IVsus4 = FBC or FBbC? definitely the latter in ChordSymbol theory, but the former in species-counterpoint notation). Do inversions interact in any odd ways? (yes for 1st inversion, since the bass will be removed; is it possible to do Csus4/E ? or Csus4/F?).

    Before tweaking the internals I want to make sure we're talking about established usage and have a good general strategy. (And also for sus2...)

  2. austinip commented on Feb 27, 2026

    @austinip

    I think the main issue we were trying to address was handling certain pop chord progressions while still being able to transpose them properly using Roman numerals. For example, D7sus4 in the Beatles’ “A Hard Day’s Night.” When we try something like V7sus4 in G major, it does not always generate all the pitches we expect.

    Your question with the IVsus4, FBC vs FBbC is a great example. I suspect the issue is that with IVsus4 we are really combining chord symbol theory, RN, and figured bass, while RN doesn't really use "sus" (that's likely where the confusion comes from). So perhaps one solution would be to write something like V7add4[no3] and treat “sus” as a chord symbol concept (i.e., adding a perfect fourth above the root while omitting the third).

    Csus4/E sounds quite clashy, but Csus4/F sounds more like a C power chord over F.

    What do you think?

  3. mscuthbert commented on Mar 3, 2026

    @mscuthbert
    Member

    I think the main issue we were trying to address was handling certain pop chord progressions while still being able to transpose them properly using Roman numerals. For example, D7sus4 in the Beatles’ “A Hard Day’s Night.” When we try something like V7sus4 in G major, it does not always generate all the pitches we expect.

    Yeah. There really is a problem where there are multiple systems that are similar but do slightly different things:

    1. Chord symbols - describe what the acceptable notes to play with the music are, along with their bass, regardless of the key or whether or not all the notes are in other parts of the notated score. (Notes can be played in any octave as w/ all systems below)
    2. Figured bass symbols - together w/ a notated bass note, describe acceptable intervals above the bass (at the moment of the figure) are, subject to the written key or the implied key.
    3. Rameau's fundamental bass - describe the conceived of fundamental (root) that guides the sonority present. Later represented with a Roman numeral.

    Then throughout the 20th century, systems 2+3 became combined, so that rather than just I, II, ... V, VI, you have things like II65 and V7 and III#6 which add figured bass symbols with fundamental bass concepts, so that the new "Roman Numeral" is expected to tell you the bass note, whether it is a 7th or 9th etc., some chromatic alternations to notes, and both the fundamental bass=functional/"real" root (like V for V[o]9 = VII7) and the "root as determined by the stacking 3rds algorithm not function" -- and that leads to problems where the "functional root" and "stacked 3rds root" differ, such as I64=V64=Cadential 64. And that leads to wars and famine (j/k). Call this system 4 = Walter Piston Roman Numerals

    And then we get into the world of the (late 80s? 90s) where people start adding to system 4 the best part of system 1: that from the symbol alone you know the quality/sonority/"sound" of the chord, even without the key. So that II65 becomes ii65 and VII7 becomes viio7. And we're in a great "system 5" of Roman Numerals which most musicians (at least Americans) under 50 now know. And that's the system that music21's RomanNumeral object was designed around.

    But this starts fights about whether accidentals in this system refer to changing the sound of the chord (System 1) or changing the accidental of the key signature (System 2). For instance, you're in E-major, 4 sharps. You want the chord E-G♮-C♮. Is that bVI6 or VIb6b3 or ♮VI6 or ♮VI♮6♮3 ? The chord symbol person puts flats (at least bVI) to show that it's below where you'd expect to find VI; the figured bass person puts a ♮ natural to show that the bass is a C♮ not C# as you'd expect. I used to be so on the chord symbol side as to not see the value of the ♮ folk -- now I know why they have history on their side and that the (now generally accepted) b side is a bunch of new comers.

    But none of these systems fully integrate everything that Chord Symbols have to offer, because the whole RN or tonal harmony instruction system wasn't ever designed w/ 20th century tonal music in mind. So Arabic numerals in the RN system are still mostly borrowed from figured bass, where they are key/keysignature dependent. And thus the IVsus4 dilemma.

    Your question with the IVsus4, FBC vs FBbC is a great example. I suspect the issue is that with IVsus4 we are really combining chord symbol theory, RN, and figured bass, while RN doesn't really use "sus" (that's likely where the confusion comes from). So perhaps one solution would be to write something like V7add4[no3] and treat “sus” as a chord symbol concept (i.e., adding a perfect fourth above the root while omitting the third).

    My guess is that V7[add4][no3] is probably the best way to represent now (with IV[addb4][no3] for IVsus4); if we could get together a conference to decide on Roman numerals for ChordSymbol representations, I'd be glad to implement anything that comes as consensus out of a meeting of people representing diverse musical styles who also know how algorithms work. :-) And we can decide what these things mean.

    But, we may never be able to agree on which way a note goes on an alt9 chord I'm afraid...

    Csus4/E sounds quite clashy, but Csus4/F sounds more like a C power chord over F.

    :-)

  4. jacobtylerwalls commented on Jul 5, 2026

    @jacobtylerwalls
    Member

    Related: #1650

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions