Refactor to store notes as key-agnostic scale degrees + alterations
(flat, sharp, etc.).
We now think of a pitch in different ways:
- *Note*: the 7 notes diatonic to C major. Notes capture the principle
in western harmony of the common scales having seven distinct diatonic
"notes" and allows us to do arithmetic with them (do up three scale
degrees).
- *Pitch*: the 12 chromatic pitches, regardless key. Pitch allows us to
assign unique names and ordinal values to each note of the chromatic
scale, allowing us to do arithmetic with them.
- *SpelledPitch*: a unique spelling of one of the chromatic pitches
(*Note* + alteration) allowing the stylistic choice to use
different *Notes* to describe a single *Pitch*.
- *ScaleDegree*: a variant of *SpelledPitch* that uses the scale degree
instead of the *Pitch* to store a pitch in a key-agnostic manner.
To illustrate, the difference, consider the flat-six in the key of Eb.
- *Note*: The 6th scale degree in Eb is C (1-E 2-F 3-G 4-A 5-B 6-C).
- *Pitch*: In the chromatic scale, ignoring the key, this is the *Pitch*
called B.
- *SpelledPitch*: In the context of the key of Eb, because this is the
*Note* C, we should spell this as Cb, not B. So the spelled pitch is
*Note*(C), *Alteration*(flat).
- *ScaleDegree*: This captures the key-agnostic representation that we
used in the begining: *Number*(6) and *Alteration*(flat)
With these four ways of representing a note, we can transpose any
pitches that follow western 12-tone harmony arbitrarily between keys
preserving the author's choice of chord function (remembering that this
is the b6 and not the #5, in our example).
Building on this new notational data model, the AST now uses the
*ScaleDegree* relative to the provided key as the internal
representation of a pitch. Formatting of a *ScaleDegree* always requires
the key in which it is being rendered. Transposition is now only a
matter or updating the current key.
Previously we used a heuristic for choosing pitch names based on the
major scale degree, minimizing radicals. So, for example, in the key of
Gb, we render the 4 as Cb rather than B because Bb is the 3 of Gb. In
other words, we want 1:Gb, 2:Ab, 3:Bb, 4:Cb instead of re-using B. This
is standard practice in western music notation.
When rendering non-diatonic notes we prefered choosing the version that
minimized the radicals. Again in the key of Gb we would choose to render
E as E (the #6) rather than considering it as Fb (the b7) and choose to
render D as D (the #5) rather than E𝄫 (the b6). This was chosen to
reduce the number of unusual radicals like 𝄫.
However, in practice this leads to unusual charts because it is more
common when writing chordal harmony to use the b6 rather than the #5.
Similarly the b7 is far more common than the #6. This is, I think, due
to the prevalence of the major scale and minor scales and the fact that
the minor scale is built from flatting the 3, 6, and 7 of the major
scale. So when thinking in a key-center agnostic manner (like numbers)
we almost always think about these altered scale degrees as being
flatted relative to the major scale, not sharped. Because of this, in
the key of Gb, we would prefer to render a b6, b7, 1 chord walkup as
E𝄫, Fb, Gb rather than D, E, Gb.
This change redefines the heuristic used to name chord pitches to follow
a heuristic that covers all pitches in the octave based on scale degree:
1, b2, 2, b3, 3, 4, b5, 5, b6, 6, b7, 7
- Non-diatonic pitches are supported using Nashville numbers (#5).
- When using Nashville numbers chord variants with non-diatonic roots
are now recognized (e.g. b7)
- Pitch rendering is now aware of key centers. For example, F# is F#
rendered as F# when in the key of G but Gb when in the key of Ab.