Sha256: 0ad1e08e1f98c4c9d2ebc874c4f3ebc49c9f1ee00518e6f5224af2595133917f
Contents?: true
Size: 1.39 KB
Versions: 71
Compression:
Stored size: 1.39 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, intervals=None): self.tonic = tonic.capitalize() self.intervals = intervals 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.intervals is None: return self._reorder_chromatic_scale() last_index = 0 pitches = [] scale = self._reorder_chromatic_scale() for i, interval in enumerate(self.intervals): 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
71 entries across 71 versions & 1 rubygems