diff --git a/pytheory/bootstrap.py b/pytheory/bootstrap.py deleted file mode 100644 index 8812cff..0000000 --- a/pytheory/bootstrap.py +++ /dev/null @@ -1,7 +0,0 @@ -from .tones import Tone -# SYSTEMS = {"western": System(tones=TONES["western"], degrees=DEGREES["western"])} - -def SYSTEMS(SYSTEMS, DEGREES, TONES, System): - western_tones = [Tone.from_string(t) for t in TONES["western"]] - SYSTEMS = {"western": System(tones=western_tones, degrees=DEGREES["western"])} - return SYSTEMS diff --git a/pytheory/charts.py b/pytheory/charts.py new file mode 100644 index 0000000..b538cb3 --- /dev/null +++ b/pytheory/charts.py @@ -0,0 +1,79 @@ +import itertools + +from .systems import SYSTEMS +from .tones import Tone + +MODS = ('', 'm', '5', '7', '9', 'dim', 'm6', 'm7', 'maj7', 'sus') + +CHARTS = {} +CHARTS['western'] = [] + +class NamedChord: + def __init__(self, *, tone_name, mod): + self.tone_name = tone_name + self.mod = mod + + @property + def name(self): + return f"{self.tone_name}{self.mod}" + + @property + def tone(self): + return Tone(name=self.tone_name) + + def __repr__(self): + return f"" + + @property + 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)] + + return tuple(acceptable) + + @property + def acceptable_tone_names(self): + return tuple([tone.name for tone in self.acceptable_tones]) + + def possible_fingerings(self, *, fretboard): + def find_fingerings(tone): + fingerings = [] + for j in range(7): + fingered_tone = tone.add(j) + for acceptable_tone in self.acceptable_tones: + if fingered_tone.name == acceptable_tone: + fingerings.append(j) + + return tuple(fingerings) + + fingering = [] + for i, tone in enumerate(fretboard.tones): + fingering.append(find_fingerings(tone)) + return tuple(fingering) + + def fingerings(self, *, fretboard): + return tuple(itertools.product(*self.possible_fingerings(fretboard=fretboard))) + + def fingering(self, *, freboard): + possible_fingerings = self.possible_fingerings(freboard=fretboard) + return posible_fingerings + + + +western_chart = {} +for tone_titles in SYSTEMS['western'].tone_names: + # Take the second tone name, if it's available. + if len(tone_titles) == 2: + tone_name = tone_titles[1] + else: + tone_name = tone_titles[0] + + for mod in MODS: + named_chord = NamedChord(tone_name=tone_name, mod=mod) + western_chart.update({f"{tone_name}{mod}": named_chord}) + +CHARTS['western'] = western_chart diff --git a/pytheory/core.py b/pytheory/core.py index ec37d7e..efec25d 100644 --- a/pytheory/core.py +++ b/pytheory/core.py @@ -4,3 +4,4 @@ from .tones import Tone from .systems import System, SYSTEMS from .scales import Scale, TonedScale from .chords import Chord, Fretboard +from .charts import CHARTS diff --git a/pytheory/systems.py b/pytheory/systems.py index 59bf466..53973f4 100644 --- a/pytheory/systems.py +++ b/pytheory/systems.py @@ -1,5 +1,4 @@ from ._statics import TEMPERAMENTS, TONES, DEGREES, SCALES, SYSTEMS -from . import bootstrap class System: diff --git a/pytheory/tones.py b/pytheory/tones.py index 169f98b..5725d50 100644 --- a/pytheory/tones.py +++ b/pytheory/tones.py @@ -79,6 +79,8 @@ class Tone: def _math(self, interval): """Returns (new index, new octave).""" + octave = self.octave or 0 + try: mod = len(self.system.tones) except AttributeError: @@ -87,7 +89,7 @@ class Tone: ) result = self._index + interval index = result % mod - octave = result // mod + self.octave + octave = result // mod + octave return (index, octave) def add(self, interval):