This commit is contained in:
2018-09-06 07:50:00 -04:00
parent 7ebdc17154
commit 52fc78a3a2
+69 -10
View File
@@ -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