You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Chord.Parse cannot parse the "6/9" chord symbol (and any bare tension after a slash) #248
Chord.TryParse unconditionally treats everything after the first / as a slash-bass note: it calls TryParseRoot on the substring after /, which requires the first character to be a note letter A–G (Notation.TryReadNoteLetter). The extremely common jazz "six-nine" chord symbol — C6/9, G6/9, F6/9 — isn't a slash-bass chord at all; the /9 denotes an added ninth stacked on a sixth chord, not a bass override. Because "9" isn't a valid note letter, TryParseRoot fails, TryReadRoot returns false, and Chord.TryParse("C6/9") returns false / Chord.Parse("C6/9") throws FormatException.
Why it matters
The package's own documentation lists sixths, extensions (9/11/13), and slash bass as supported features, but Chord.Parse("C6/9") throws FormatException: Invalid chord symbol 'C6/9'. — a chord symbol found on virtually any jazz lead sheet.
Suggested fix / acceptance criteria
When the token after / fails to parse as a note letter, fall back to checking whether the whole head (e.g. "C6/9") matches the known six-nine idiom (bare 9 immediately after a 6), and encode it as Sixth = Natural, Tensions |= Nine with no bass, rather than failing outright. Add a round-trip test: Chord.Parse("C6/9").ChordTones() should equal Chord.Parse("Cadd9").ChordTones() plus the natural sixth, and Chord.Parse("C6/9").ToString() should re-parse to an equal chord.
Activity
Read "C6/9" as a six-nine chord, not a slash bass [patch]