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.
- 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.