TODO.md in head_music-0.22.0 vs TODO.md in head_music-0.23.0
- old
+ new
@@ -1,18 +1,113 @@
# TODO
+Disambiguate PitchSet and Sonority
+
+Sonority should be a name for a specific set of intervals
+Sonority.get(identifier)
+Sonority.for(pitch_set)
+Sonority.pitch_set_for(root_pitch:, inversion:)
+
+ class PitchSet
+ def sonority
+ @sonority ||= Sonority.for(self)
+ end
+ end
+
+
+
+open consonance (P5 P8)
+soft consonance (m3 M3 m6 M6)
+mild dissonance (M2 m7)
+sharp dissonance (m2 M7)
+
+P4 (consonant or dissonant)
+T (neutral or restless)
+
+Sets
+DurationSet?
+
+
+Make new analysis classes:
+Dyad
+ .interval
+ .implied_triad (if a third)
+ .possible_triads
+ - returns major and minor if a perfect fifth
+ - returns minor and diminished if minor third
+ - returns major and augmented if major third
+ - returns augmented if augmented fifth
+ - returns diminished if diminished fifth
+ - should it take into account enharmonics? I think yes.
+ .possible_seventh_chords
+ - as above, with either seventh added
+ - returns 3rd inversion if second
+ .possible_chords
+ possible_triads + possible_seventh_chords
+ .possible_enharmonic_triads
+ .possible_enharmonic_seventh_chords
+ .possible_enharmonic_chords
+
+the dyad will be super helpful in analyzing two-part counterpoint.
+
+Triad
+SeventhChord
+Don't need anything beyond seventh chords to analyze pre-Romantic music.
+
+
## User stories
+
### Done
As a developer
+ When instantiating a DiatonicInterval
+ When passing an abbreviation, such as 'P5' or 'm2'
+ I want to receive that instance.
+
+ As a developer
Given a pitch
- I want to be able to add a functional interval to get another pitch.
+ I want to be able to add a diatonic interval to get another pitch.
-FunctionalInterval
+DiatonicInterval
- def above(pitch) -> pitch
-FunctionalInterval
+DiatonicInterval
- def below(pitch) -> pitch
Pitch addition and subtraction
- define `Pitch#+`, `Pitch#-`
- - use FunctionalInterval methods
+ - use DiatonicInterval methods
+
+PitchSet
+
+A PitchSet is unlike a PitchClassSet in that the pitches have spellings with octaves rather than Spellings only or octave-less 0-11 designations.
+
+PitchClassSet
+.size?
+.monad?
+.dyad?
+.triad? (must be stacked thirds to be a 'triad')
+.trichord? (all 3-pitch sets)
+
+Should every group of pitches have one or more strategies for describing it? Such as Dyad?
+
+Set (superclass?)
+PitchSet
+ EmptySet
+ Monad
+ Dyad
+ Trichord (or Triad)
+ - triad?
+ Tetrachord (or Tetrad)
+ - seventh_chord?
+ Pentachord (or Pentad)
+ Hexachord (or Hexad)
+ Heptachords (or Heptad or, sometimes, mixing Latin and Greek roots, "Septachord")
+ Octachords (Octad)
+ Nonachords (Nonad)
+ Decachords (Decad)
+ Undecachords
+ Dodecachord
+
+PitchClassSet
+ .normal_form? (most compact)
+ .prime_form (most compact normal form of the original or any inversion)