Sha256: 346a82fef7890b70b7a7aa6df8c3f27fae67fe201af6fb95e5981f6b64a14fd6

Contents?: true

Size: 1.44 KB

Versions: 33

Compression:

Stored size: 1.44 KB

Contents

class Scale(object):

    ASCENDING_INTERVALS = ['m', 'M', 'A']
    CHROMATIC_SCALE = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A',
                       'A#', 'B']
    FLAT_CHROMATIC_SCALE = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab',
                            'A', 'Bb', 'B']
    FLAT_KEYS = ['F', 'Bb', 'Eb', 'Ab', 'Db', 'Gb', 'd', 'g', 'c', 'f', 'bb',
                 'eb']

    def __init__(self, tonic, scale_name, pattern=None):
        self.tonic = tonic.capitalize()
        self.name = self.tonic + ' ' + scale_name
        self.pattern = pattern
        self.chromatic_scale = (self.FLAT_CHROMATIC_SCALE
                                if tonic in self.FLAT_KEYS
                                else self.CHROMATIC_SCALE)
        self.pitches = self._assign_pitches()

    def _assign_pitches(self):
        if self.pattern is None:
            return self._reorder_chromatic_scale()
        last_index = 0
        pitches = []
        scale = self._reorder_chromatic_scale()
        for i, interval in enumerate(self.pattern):
            pitches.append(scale[last_index])
            last_index += self.ASCENDING_INTERVALS.index(interval) + 1
        if pitches[0] != scale[last_index % len(scale)]:
            raise ValueError("Interval is broken")
        return pitches

    def _reorder_chromatic_scale(self):
        index = self.chromatic_scale.index(self.tonic)
        return self.chromatic_scale[index:] + self.chromatic_scale[:index]

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
trackler-2.2.1.107 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.106 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.105 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.104 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.103 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.102 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.101 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.100 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.99 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.98 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.97 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.96 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.95 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.94 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.93 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.92 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.91 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.90 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.89 tracks/python/exercises/scale-generator/example.py
trackler-2.2.1.88 tracks/python/exercises/scale-generator/example.py