Closed mscuthbert closed 3 years ago
Also, related to this: Any inversion of an Augmented Sixth chord should pass augsixth.isAugmentedSixth() == True
.
Currently, only the inversions that showcase an (actual) A6
interval will pass this, which I found confusing at times. That is, a German Augmented Sixth in root position (showcasing a D3
between the F#
and Ab
) is still an augmented sixth chord.
Of course, unless this has been designed this way on purpose. In that case, I'd still say that it is not what I expect; I'd want any inversion to be an Augmented Sixth regardless of the presence of an A6
interval. (A dominant "seventh" in any inversion other than root position doesn't showcase any actual seventh, but it is still a seventh chord.)
Here is an example on the latest music21 release:
In [1]: import music21
In [2]: augsixth = music21.roman.RomanNumeral("Ger7", "c")
In [3]: augsixth.isAugmentedSixth()
Out[3]: False
In [4]: augsixth = music21.roman.RomanNumeral("Ger65", "c")
In [5]: augsixth.isAugmentedSixth()
Out[5]: True
In [6]: music21.__version__
Out[6]: '6.7.1'
Yeah, as currently designed, all the is augmented sixth methods depend on the canonical inversion.
returns True if the chord is an Augmented 6th chord in first inversion. (N.B. a French/Swiss sixth technically needs to be in second inversion)
This seems like a separate feature proposal to me. I see why it was done this way -- in the universe of common practice harmony, not every sonority is a "chord", so augmented-sixths aren't really "chords", they're voice-leading phenomena, but we need Roman numerals for them -- but I see your point that it would be nice to have a way to get at this information.
Maybe a keyword permitAnyInversion
?
Yeah -- I think that I would actually like to make isAugmentedSixth()
by default return True on any inversion, so maybe the keyword is standardInversionOnly=False
which people can change to True if they want it?
But I agree that this is a separate PR because the code for determining isAugmentedSixth()
is distributed and convoluted, so it won't just be a line or two to change. It's very different code base than the parsing of RomanNumeral.
Correction to all this: the docs are pretty clear "in first inversion" so we will leave that as default.
I'm also working on the first part of the PR and realizing that if we want chords to round-trip (i.e., if rn = roman.RomanNumeral('It53') implies rn.figure == romanNumeralFromChord(rn).figure) then this needs to be changed as well.
Thinking through Music21's handling of Aug6th RomanNumerals, here’s my thought of refining it (in c minor):
Any of these can have a + added after the country name.
The “proper” spelling OR the country name alone OR the country name with a 6 afterwards becomes the standard inversion of the chord:
Ger, Ger6, Ger65 — all = standard German 6th. Ab in bass — changed to Ger65 internally Ger43 = C in bass Ger42 = Eb in bass Ger7 = F# in bass (n.b., this is not Ger7, not Ger43)
Fr, Fr6, Fr43 — all = standard French 6th. Ab in bass — changed to Fr43 internally Fr42 = C in bass Fr7 = D in bass Fr65 = F# in bass
Sw/Swiss/English/whatever you call sharp-2 — behaves exactly as French.
Italian is tricker, because there are two things that “It” alone might mean, so we will require:
It, It6 = standard Italian 6th. Ab in bass. Changed to It6 internally It64 = C in bass It53 = F# in bass — this is the ONLY case where we require 53 to be specified.
For Ger7 possibly allow Gero3 or Gerdim3
Current music21 output:
with stars next to ones that need updating: