Class:            PitchClassChord

Environment:      Siren
Superclass:         Object
Category:         Music-PitchClasses
Instance variables:   root structure notes possibleTonalities

automatic access

root
   

root: aValue
   

rootPitchClass
   

structure
   

structure: aValue
   

printing

name
   produces a printable name (without the sharps before symbols)

notesString
   

printOn: s
   

quotedPrintOn: s
   as printOn but without the brackets [] and with quotes

storeOn: s
   returns a String representation of the receiver from which the receiver
   can be reconstructed

structureString
   

note testing

allNotesInScale: aScale
   The previous version couldnt deal with situations like
    (FPChord newFromString: 'C 7 aug9') possibleTonalitiesInScaleClass: MajorScale

chordNotesAmong: list
   select among given notes those that are chord notes

containsNote: n
   

nextIn: aCS
   

nonChordNotesAmong: list
   select among given notes those that are chord notes

notes: aListOfNotes contains: anArrayOfIntervals
   

creation

format
   format the structure. Assumes root is not nil

fromNotes: l
   assumes the first note is the root

fromNotes: aList root: r
   l isa list of pitch-classes.
   This method computes the correct (and canonical) name for the chord

fromString: l
   l is a list whose first element is a note and the rest a structure, in our
   standardized chord syntax

structureFromNotes: aList root: r
   l isa list of pitch-classes.
   This method computes the correct (and canonical) name for the chord

notes computation

computeAllNotes
   computes the list of notes from the structure. The job is the opposite
   of what is written is method fromListOfNotes.
   Assumes root is not nil.
   | c |
   c := FPChord newFromString: 'A halfDim7'.
   c computeAllNotes.
   c notes

computeDiminished
   

computeEleventh
   

computeFifth
   

computeNinth
   

computeRoot
   

computeSeventh
   

computeSixth
   

computeThird
   

computeThirteenth
   

notes
   

notesWithinOctave
   accordingly, return the notes as in the case of a four note chord
   with no higher dissonances

compute possible tonalities

= c
   

analyseIn: aScale
   en majeure, mineure harm et min mel

computePossibleTonalities
   self allInstancesDo: [:x| x computePossibleTonalities]

matchWith: c
   ((Chord new fromString: 'D min 7') computeAllNotes) format
   matchAvec: ((N re majorScale genereAccordsPoly: 4) at: 3).

possibleTonalitiesInScaleClass: s
   possible tonalities in scale class s.
   (PitchClassChord newFromString: 'C ') possibleTonalitiesInScaleClass: MajorScale AnalysisList ({I de C MajorScale} {IV de G MajorScale} {V de F MajorScale} )
   
   There is a problem here, related to invalid scales. If you ask for
   instance the possible tonalities of 'C# min', it will try to say that V of G# major is a
   possible tonality. But the creation of G# major raises an error since it
   is an invalid scale. For the moment I leave it as is because   I would
   like to have a model of reasoning in an object-oriented setting first

standardPossibleTonalities
   possible tonalities in scale class major, minorMel and minorHarm
   (Chord new fromString: 'C min') standardPossibleTonalities
   ListeDAnalyses ({II de Sib MajorScale} {III de Lab MajorScale} {VI de
   Mib MajorScale} {I de Do HarmonicMinorScale} {IV de Sol
   HarmonicMinorScale} {I de Do MelodicMinorScale} {II de Sib
   MelodicMinorScale} )

tonalitesCommunesAvec: unAccord
   (FPChord newFromString: 'C min') tonalitesCommunesAvec: (FPChord
   newFromString: 'D b ')

tonalitesCommunesAvec: unAccord et: autreAccord
   (FPChord newFromString: 'C min') tonalitesCommunesAvec: (FPChord
   newFromString: 'D b ')

transposing

beTransposedBy: int
   

transposeOf: interval
   

FP

natural
   

accessing

possibleScales
   

possibleTonalities
   

initializations

initAnalyse
   

initialize
   

resetNotes
   reset notes to an empty collection when an important change occurred

accessing by intervals

theFifth
   

theFourth
   

theOctave
   

theSeventh
   

theThird
   

theTonic
   

testing ok

commonTonalitiesWith: aChord
   

hasA: anInterval
   (FPChord newFromString: 'C min 7') hasA: #majorThird

hasADiminishedFifth
   

hasADiminishedSeventh
   

hasAMajorSeventh
   

hasAMinorSeventh
   

hasAnAugmentedFifth
   

hasNoFifth
   

hasNoSeventh
   

isAlterate
   

isDiminished
   

isDominant
   

isHalfDiminished
   

isMajor
   

isMinor
   

isSuspended
   

structureHasEitherOf: aList
   

structureHasNeitherOf: aList
   

mutations

@ o
   

asPlayableObject
   

defaultOctave
   

fondamental
   

inTessitura: qt
   

lapse: l
   

octave: n
   

startBeat: s duration: d
   a default octave is used

startTime: s duration: d
   

tessitura

rootInTessitura: qt
   

other computations

intervalBetweenRoots: aChord
   remark: not that this method answers the interval between
   the root *pitch classes*!!

private-pact

bestTonalityInIsolatedCase
   answer the most plausible tonality when the chor is isolated.
   Later, I will rewrite it to bypass possibleTonalities for sake of efficience

MetaClass:         PitchClassChord class

creation

new
   

newFromNotes: l
   computes the name from the list of notes, according to our syntax

newFromNotesNames: aStringOfNoteNames
   computes the name from the list of notes, according to our syntax
   PitchClassChord newFromNotesNames: 'A C# E G' [La 7 ]

newFromString: l
   computes the list of notes fom the name acording to our syntax

root: r structure: s
   

editing

openEditor
   

examples

allChordsFromListOfNotes: aList
   self allChordsFromListOfNotes: (Array with: N do with: N mi with: N sol)
#(Do Mi #min #no5 #no11 #no9 #no7 #dim13 Sol #sus4 #no5 #sixth )
   self allChordsFromListOfNotes: (Array with: N do with: N mi with: N sol with: N si)

commonTonalities
   
(PitchClassChord new fromString: 'C maj7')
   possibleTonalities AnalysisList ({I of C MajorScale} {IV of G MajorScale} {VI of E HarmonicMinorScale} )

(PitchClassChord new fromString: 'F maj7')
   possibleTonalities AnalysisList ({I of F MajorScale} {IV of C MajorScale} {VI of A HarmonicMinorScale} )

(PitchClassChord new fromString: 'E min 7')
   possibleTonalities AnalysisList ({II of D MajorScale} {III of C MajorScale} {VI of G MajorScale} {IV of B HarmonicMinorScale} {II of D MelodicMinorScale} )
----
(PitchClassChord new fromString: 'C maj7')
   tonalitesCommunesAvec: (PitchClassChord new fromString: 'F maj7')
   et: (PitchClassChord new fromString: 'E min 7') Set (C MajorScale )

examples
   
(PitchClassChord new fromString: 'Re maj7') notes OrderedCollection (Re Fa# La Do# )
(PitchClassChord new fromString: 'Re# maj7') notes OrderedCollection (Re# Fa## La# Do## )
(PitchClassChord new fromString: 'C') notes OrderedCollection (Do Mi Sol )
(PitchClassChord new fromString: 'D min 7 dim5') notes OrderedCollection (Re Fa Lab Do )
(PitchClassChord new fromString: 'C aug9') notes OrderedCollection (Do Mi Sol Sib Re# )
(PitchClassChord new fromString: 'C aug9 dim5') notes OrderedCollection (Do Mi Solb Sib Re# )
(PitchClassChord new fromString: 'C 13') notes OrderedCollection (Do Mi Sol Sib Re Fa La )
(PitchClassChord new fromString: 'C 13 aug9') notes OrderedCollection (Do Mi Sol Sib Re# Fa La )
(PitchClassChord new fromString: 'C 13 aug9 no7') notes OrderedCollection (Do Mi Sol Re# Fa La )
(PitchClassChord new fromString: 'C halfDim7') notes OrderedCollection (Do Mib Solb Sib )

'F min 7' asChord notes > OrderedCollection (F Ab C Eb )    
'F min7' asChord notes > OrderedCollection (F A C )      
'F m 7' asChord notes > OrderedCollection (F A C Eb )      
'Fm 7' asChord notes > error   
'F maj 7' asChord notes > error   
'F m7' asChord notes > OrderedCollection (F A C )      
'F maj 7' asChord notes > OrderedCollection (F A C Eb )      
'F maj7' asChord notes > OrderedCollection (F A C E )      
'F halfDim7' asChord notes > OrderedCollection (F Ab Cb Eb )    
'F min dim5 7' asChord notes OrderedCollection (F Ab Cb Eb )
'F min b5 7' asChord notes OrderedCollection (F Ab Cb Eb )
'F dim7' asChord notes OrderedCollection (F A C Ebb )

PitchClassChord new fromNotes: (Array with: N do with: N mi with: N sol) Do
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N sol sharp) Do #aug5
PitchClassChord new fromNotes: (Array with: N do with: N fa with: N sol )     Do #sus4
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N sol with: N la) Do #sixth
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N la) Do #no5 #sixth
PitchClassChord new fromNotes: (Array with: N do with: N la) Do #no3 #no5 #sixth
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N sol sharp with: N si) Do #aug5 #maj7
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N sol flat with: N si flat) Do #dim5 7
PitchClassChord new fromNotes: (Array with: N do with: N mi flat with: N sol flat with: N si flat) Do #halfDim7
PitchClassChord new fromNotes: (Array with: N do with: N mi flat with: N sol flat with: N si flat flat) Do #dim7

PitchClassChord new fromNotes: (Array with: N do with: N mi flat) Do #min #no5
PitchClassChord new fromNotes: (Array with: N do with: N mi with: N fa with: N fa sharp ) Do #no5 #no9 #no7 11 #aug11
PitchClassChord new fromNotes: (Array with: N do with: N sol flat with: N sol sharp) Do #no3 #dim5 #aug5

A chord of A. holdsworth
PitchClassChord new fromNotes: (Array with: N re sharp with: N fa sharp sharp with: N la with: N do sharp sharp) Re# #dim5 #maj7

(PitchClassChord new fromString: 'C min') standardPossibleTonalities OrderedCollection ({II de Sib MajorScale} {III de Lab MajorScale} {VI de Mib MajorScale} {I de Do HarmonicMinorScale} {IV de Sol HarmonicMinorScale} {I de Do MelodicMinorScale} {II de Sib MelodicMinorScale} )

(PitchClassChord new fromString: 'Do') possibleTonalities
ListeDAnalyses ({V de Fa HungarianMinor} {VI de Mi HungarianMinor} {I de Do MajorScale} {IV de Sol MajorScale} {V de Fa MajorScale} {I de Do DoubleHarmonic} {II de Si DoubleHarmonic} {IV de Sol MelodicMinorScale} {V de Fa MelodicMinorScale} {IV de Sol Oriental} {IV de Sol NeapolitanMajor} {V de Fa HarmonicMinorScale} {VI de Mi HarmonicMinorScale} {II de Si NeapolitanMinor} {VI de Mi NeapolitanMinor} )

(PitchClassChord new fromString: 'D min ') possibleTonalities
ListeDAnalyses ({I de Re HungarianMinor} {VII de Mib HungarianMinor} {II de Do MajorScale} {III de Sib MajorScale} {VI de Fa MajorScale} {III de Sib DoubleHarmonic} {IV de La DoubleHarmonic} {I de Re MelodicMinorScale} {II de Do MelodicMinorScale} {I de Re NeapolitanMajor} {I de Re HarmonicMinorScale} {IV de La HarmonicMinorScale} {I de Re NeapolitanMinor} {IV de La NeapolitanMinor} )

exampleShort
   'C min 7 dim5' asChord.
   ('C min 7 dim5 9' asChordOct: 4) notes
      OrderedCollection (C4 Eb4 Gb4 Bb4 D5 )

holdsworth
   

reallyAllChordsFromListOfNotes: aList
   self reallyAllChordsFromListOfNotes: (Array with: N do with: N mi with: N sol)
OrderedCollection ([La #noRoot #min 7 ] [Si #noRoot #sus4 #no5 #no7 #dim9 #dim13 ] [Do ] [Re #noRoot #sus4 #no5 7 9 ] [Mi #min #no5 #no11 #no9 #no7 #dim13 ] [Fa #noRoot #no3 #maj7 9 ] [Sol #sus4 #no5 #sixth ] [La# #noRoot #no3 #dim5 ] [Do# #noRoot #min #dim5 ] [Re# #noRoot #no3 #no5 #dim9 ] [Fa# #noRoot #no3 #dim5 7 #dim9 ] [Sol# #noRoot #no3 #no5 #no11 #no9 #no7 #dim13 ] [Lab #noRoot #aug5 #maj7 ] [Sib #noRoot #no3 #no5 #no7 9 #aug11 #sixth ] [Reb #noRoot #no3 #no5 #maj7 #aug9 #aug11 ] [Mib #noRoot #no5 #sixth ] [Solb #noRoot #no3 #no5 #no9 #no7 #aug11 ] )