コード例 #1
0
ファイル: scales.py プロジェクト: Fuddlebob/MelodyBot3456
    def generate(self,
                 length,
                 ascending=True,
                 start_degree=1,
                 undulating=False,
                 starting_octave=None):
        """

        Generate given number of notes from the scale, either continuously rising or falling or as
        an undulating wave (i.e., up an octave, then down, then up again, etc.)

        >>> list(Blues('F').generate(length=9))
        ['F', 'Ab', 'Bb', 'B', 'C', 'Eb', 'F', 'Ab', 'Bb']

        >>> list(Blues('F').generate(length=7, undulating=True))
        ['F', 'Ab', 'Bb', 'B', 'C', 'Eb', 'F']

        >>> [repr(note) for note in Blues('F').generate(length=13, undulating=True, starting_octave=1)]
        ["'F-1'", "'Ab-1'", "'Bb-1'", "'B-1'", "'C-1'", "'Eb-1'", "'F-2'", "'Eb-1'", "'C-1'", "'B-1'", "'Bb-1'", "'Ab-1'", "'F-1'"]
        """
        wave = (self.ascending()[:-1] +
                self.descending()[:-1]) if ascending else (
                    self.descending()[:-1] + self.ascending()[:-1])
        incline = (self.ascending() if ascending else self.descending())[:-1]
        alternating_octaves = cycle(
            [starting_octave, starting_octave +
             1]) if starting_octave is not None else None
        for key in cycle(wave if undulating else incline):
            octave = starting_octave if (
                key != self.tonic
                or starting_octave is None) else next(alternating_octaves)
            yield TemporalNote(
                key, octave=octave) if starting_octave is not None else key
            length -= 1
            if length == 0:
                break
コード例 #2
0
ファイル: scales.py プロジェクト: samg7b5/sidewinder
 def ascending(self):
     relative_tonic = TemporalNote().from_int(
         int(TemporalNote(self.tonic)) - 11).name
     notes = MelodicMinor(relative_tonic).ascending(
     )[:-1][6:] + MelodicMinor(relative_tonic).ascending()[:-1][:6]
     return notes * self.octaves + [notes[0]]
コード例 #3
0
ファイル: scales.py プロジェクト: samg7b5/sidewinder
    def generate(self,
                 length,
                 ascending=True,
                 start_degree=1,
                 undulating=False,
                 starting_octave=4):
        """

        Generate given number of notes from the scale, either continuously rising or falling or as
        an undulating wave (i.e., up an octave, then down, then up again, etc.)

        >>> list(Blues('F').generate(length=9))
        ['F', 'Ab', 'Bb', 'B', 'C', 'Eb', 'F', 'Ab', 'Bb']

        >>> list(Blues('F').generate(length=7, undulating=True))
        ['F', 'Ab', 'Bb', 'B', 'C', 'Eb', 'F']

        >>> [repr(note) for note in Blues('F').generate(length=13, undulating=True, starting_octave=1)]
        ["'F-1'", "'Ab-1'", "'Bb-1'", "'B-1'", "'C-1'", "'Eb-1'", "'F-2'", "'Eb-1'", "'C-1'", "'B-1'", "'Bb-1'", "'Ab-1'", "'F-1'"]
        """
        wave = (self.ascending()[:-1] +
                self.descending()[:-1]) if ascending else (
                    self.descending()[:-1] + self.ascending()[:-1])
        incline = (self.ascending() if ascending else self.descending())[:-1]
        alternating_octaves = cycle(
            [starting_octave, starting_octave +
             1]) if starting_octave is not None else None

        # I just want simple monotonic octaves
        seen_notes = {}

        # create offsets from C to our start point so that our notes have offsets of: start(0),... C(+1), C#(+1), D(+1),... (i.e. C crosses into next octave)
        enharmonic_chromatics = [
            'C', 'B#', 'C#', 'Db', 'D', 'D#', 'Eb', 'E', 'Fb', 'E#', 'F', 'F#',
            'Gb', 'G', 'G#', 'Ab', 'A', 'A#', 'Bb', 'B', 'Cb'
        ]
        # account for the fact that Cb-4 is a half step below C-4 even though it sounds the same as B-3; similarly for B# http://openmusictheory.com/pitches.html
        seen_notes['Cb'] = 0
        seen_notes['B#'] = 0
        for n in enharmonic_chromatics[:enharmonic_chromatics.index(
                reduce_accidentals(list(wave if undulating else incline)[0]))]:
            seen_notes[n] = 1
        seen_notes['Cb'] += 1
        seen_notes['B#'] -= 1

        def times_seen_previously(x, counter_dict={}):
            try:
                counter_dict[x] += 1
                return counter_dict[x] - 1
            except KeyError:
                counter_dict[x] = 1
                return 0

        for key in cycle(wave if undulating else incline):
            #octave = starting_octave if (key !=  self.tonic or starting_octave is None) else next(alternating_octaves)
            octave = starting_octave + times_seen_previously(
                key, seen_notes) * (
                    -1 + 2 * ascending) if starting_octave is not None else 0
            yield TemporalNote(
                key, octave=octave) if starting_octave is not None else key
            length -= 1
            if length == 0:
                break
コード例 #4
0
ファイル: scales.py プロジェクト: samg7b5/sidewinder
 def ascending(self):
     relative_tonic = TemporalNote().from_int(
         int(TemporalNote(self.tonic)) - 8).name
     notes = HarmonicMinor(relative_tonic).ascending(
     )[:-1][5:] + HarmonicMinor(relative_tonic).ascending()[:-1][:5]
     return notes * self.octaves + [notes[0]]
コード例 #5
0
ファイル: chords.py プロジェクト: samg7b5/sidewinder
 def get_temporal_root(self):
     from mingus.containers.note import TemporalNote
     return TemporalNote(self.root_note, octave=self.octave)