mirror of
https://github.com/kennethreitz/pytheory.git
synced 2026-06-05 06:46:14 +00:00
chords!
This commit is contained in:
+69
-10
@@ -3,7 +3,7 @@ import itertools
|
||||
from .systems import SYSTEMS
|
||||
from .tones import Tone
|
||||
|
||||
MODS = ('', 'm', '5', '7', '9', 'dim', 'm6', 'm7', 'maj7', 'sus')
|
||||
MODS = ('', 'maj', 'm', '5', '7', '9', 'dim', 'm6', 'm7', 'maj7')
|
||||
|
||||
CHARTS = {}
|
||||
CHARTS['western'] = []
|
||||
@@ -28,10 +28,40 @@ class NamedChord:
|
||||
def acceptable_tones(self):
|
||||
acceptable = [self.tone]
|
||||
|
||||
acceptable += [self.tone.add(5)]
|
||||
# acceptable += [self.tone.add(3)]
|
||||
acceptable += [self.tone.subtract(5)]
|
||||
# acceptable += [self.tone.subtract(3)]
|
||||
|
||||
# Major third.
|
||||
if self.mod == 'maj':
|
||||
acceptable += [self.tone.add(3)]
|
||||
|
||||
# Minor third.
|
||||
elif self.mod == 'm':
|
||||
acceptable += [self.tone.add(4)]
|
||||
|
||||
# Perfect fifth.
|
||||
elif self.mod == '5':
|
||||
acceptable += [self.tone.add(5)]
|
||||
|
||||
elif self.mod == '7':
|
||||
acceptable += [self.tone.add(7)]
|
||||
|
||||
elif self.mod == '9':
|
||||
acceptable += [self.tone.add(9)]
|
||||
|
||||
elif self.mod == 'dim':
|
||||
acceptable += [self.tone.add(4), self.tone.add(8)]
|
||||
|
||||
elif self.mod == 'm6':
|
||||
acceptable += [self.tone.add(4), self.tone.add(6)]
|
||||
|
||||
elif self.mod == 'm7':
|
||||
acceptable += [self.tone.add(4), self.tone.add(7)]
|
||||
|
||||
elif self.mod == 'maj7':
|
||||
acceptable += [self.tone.add(3), self.tone.add(7)]
|
||||
|
||||
else:
|
||||
acceptable += [self.tone.add(5)]
|
||||
acceptable += [self.tone.subtract(5)]
|
||||
|
||||
return tuple(acceptable)
|
||||
|
||||
@@ -39,7 +69,7 @@ class NamedChord:
|
||||
def acceptable_tone_names(self):
|
||||
return tuple([tone.name for tone in self.acceptable_tones])
|
||||
|
||||
def possible_fingerings(self, *, fretboard):
|
||||
def _possible_fingerings(self, *, fretboard):
|
||||
def find_fingerings(tone):
|
||||
fingerings = []
|
||||
for j in range(7):
|
||||
@@ -56,11 +86,40 @@ class NamedChord:
|
||||
return tuple(fingering)
|
||||
|
||||
def fingerings(self, *, fretboard):
|
||||
return tuple(itertools.product(*self.possible_fingerings(fretboard=fretboard)))
|
||||
return tuple(itertools.product(*self._possible_fingerings(fretboard=fretboard)))
|
||||
|
||||
def fingering(self, *, freboard):
|
||||
possible_fingerings = self.possible_fingerings(freboard=fretboard)
|
||||
return posible_fingerings
|
||||
def fingering(self, *, fretboard, multiple=False):
|
||||
def fingering_score(fingering):
|
||||
def number_of_fingers(fingering):
|
||||
zeros = 0
|
||||
for finger in fingering:
|
||||
if finger == 0:
|
||||
zeros += 1
|
||||
return len(fingering) - zeros
|
||||
|
||||
def ascending(fingering):
|
||||
fingering = [f for f in fingering if f != 0]
|
||||
|
||||
return sorted(fingering) == fingering
|
||||
|
||||
ascending = int(ascending(fingering))
|
||||
finger_count = number_of_fingers(fingering)
|
||||
return ascending + (1 / finger_count)
|
||||
|
||||
def gen():
|
||||
fingerings = self.fingerings(fretboard=fretboard)
|
||||
score_map = tuple(map(fingering_score, fingerings))
|
||||
max_score = max(score_map)
|
||||
|
||||
for possible_fingering in fingerings:
|
||||
if fingering_score(possible_fingering) == max_score:
|
||||
yield possible_fingering
|
||||
|
||||
best_fingerings = tuple([g for g in gen()])
|
||||
if not multiple:
|
||||
return best_fingerings[0]
|
||||
else:
|
||||
return best_fingerings
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user