def build_movement(): # Define our alberti bass signature. alberti = arpeggio([0, 2, 1, 2]) # Create the basic interval pattern. intervals = HSeq({DEGREE: x} for x in [1, 5, 1, 4, 1, 5, 1]) # Create the rhythm rhythm = HSeq({DURATION_64: x} for x in [128, 64, 64, 64, 64, 64, 64]) # Set specific chords to be used in certain measures. intervals[1]["chord"] = (-3, -1, 0, 2) # second inversion 7th intervals[3]["chord"] = (-3, 0, 2) # second inversion intervals[5]["chord"] = (-5, -3, 0) # first inversion # Combine the sequences, make them chords, produce alberti on the chords, # fill with each being 8, expand it to a flat sequence. melody = intervals & rhythm | chord() | alberti | fill(8) | expand # Define our key C_major = Key("C", major_scale) #key(major_scale(-2)) # Set the degree, add the midi pitch, make it an OSequence, add debugging information. return melody | degree_in_key_with_octave(C_major, 5) | midi_pitch() | OSequence | debug
def test_degree_in_key_with_octave(self): """ Ensure that degree in key with octave is sane """ from sebastian.core.transforms import degree_in_key_with_octave from sebastian.core.notes import Key, major_scale h1 = self.make_horizontal_sequence() keyed = h1 | degree_in_key_with_octave(Key("C", major_scale), 4) self.assertEqual(keyed._elements, [{ 'degree': 1, 'octave': 4, 'pitch': -2 }, { 'degree': 2, 'octave': 4, 'pitch': 0 }, { 'degree': 3, 'octave': 4, 'pitch': 2 }, { 'degree': 1, 'octave': 4, 'pitch': -2 }])
def test_degree_in_key_with_octave(self): """ Ensure that degree in key with octave is sane """ from sebastian.core.transforms import degree_in_key_with_octave from sebastian.core.notes import Key, major_scale h1 = self.make_horizontal_sequence() keyed = h1 | degree_in_key_with_octave(Key("C", major_scale), 4) self.assertEqual(keyed._elements, [ {'degree': 1, 'octave': 4, 'pitch': -2}, {'degree': 2, 'octave': 4, 'pitch': 0}, {'degree': 3, 'octave': 4, 'pitch': 2}, {'degree': 1, 'octave': 4, 'pitch': -2} ])
def build_movement(): C_major = Key("C", major_scale) intervals = sequence_map("degree", [1, 5, 1, 4, 1, 5, 1]) intervals[1]["inversion"] = (-3, -1, 0, 2) # second inversion 7th intervals[3]["inversion"] = (-3, 0, 2) # second inversion intervals[5]["inversion"] = (-5, -3, 0) # first inversion rhythm = sequence_map(DURATION_64, [128, 64, 64, 64, 64, 64, 64]) melody = intervals & rhythm melody = melody.map_points(chord()) duration = 8 for point in melody: point["sequence"] = alberti(point["sequence"], duration) * (point[DURATION_64] / (8 * duration)) melody = expand_sequences(melody) # note values filled-out for C major in octave 5 then MIDI pitches calculated melody = melody | degree_in_key_with_octave(C_major, 5) | midi_pitch() melody = OSequence(melody) index(melody._elements) return melody
def end(scale): return HSeq(scale[i] for i in [2, 1]) | add(quaver_point) def h2(scale): return HSeq(scale[i] for i in [0, 4, 3, 4]) | add(quaver_point) def h2_end1(scale): return HSeq(scale[i] for i in [0, 4]) | add(quaver_point) # there's two important quarter notes used at the ends of sections e1 = HSeq(scale[3]) | add(quarter_point) e2 = HSeq(scale[0]) | add(quarter_point) partA = h1(scale) + h1_end1(scale) + e1 + h1(scale) + end(scale) + e2 partB = h2(scale) + h2_end1(scale) + e1 + h2(scale) + end(scale) + e2 # here we see the basic structure of the song oseq = OSequence((partA * 2) + (partB * 2)) C_major = Key("C", major_scale) # note values filled-out for C major in octave 5 then MIDI pitches calculated seq = oseq | degree_in_key_with_octave(C_major, 5) | midi_pitch() # write to file: write_midi.write("shortning_bread_1.mid", [seq])
down_degrees = [6, 4, 3, 2, 1, 2, 3, 4] final_degree = [1] sections = [ (up_degrees, 4, range(14)), (down_degrees, 4, range(13, -2, -1)), (final_degree, 32, range(1)), ] hanon_1 = OSequence() for section in sections: pattern, duration_64, offset = section for o in offset: for note in pattern: hanon_1.append({"degree": note + o, DURATION_64: duration_64}) hanon_1 = hanon_1 | degree_in_key_with_octave(Key("C", major_scale), 4) | midi_pitch() hanon_rh_1 = hanon_1 hanon_lh_1 = hanon_1 | transpose(-12) seq = hanon_lh_1 // hanon_rh_1 if __name__ == "__main__": f = open("hanon.mid", "w") s = SMF([seq]) s.write(f) f.close()
from sebastian.core.transforms import midi_pitch, degree_in_key_with_octave, add from sebastian.core.notes import Key, major_scale from sebastian.midi import write_midi def alberti(triad): """ takes a VSeq of 3 notes and returns an HSeq of those notes in an alberti figuration. """ return HSeq(triad[i] for i in [0, 2, 1, 2]) # an abstract VSeq of 3 notes in root position (degree 1, 3 and 5) root_triad = VSeq(Point(degree=n) for n in [1, 3, 5]) quaver_point = Point({DURATION_64: 8}) # an OSequence with alberti figuration repeated 16 times using quavers alberti_osequence = OSequence(alberti(root_triad) * 16 | add(quaver_point)) C_major = Key("C", major_scale) # note values filled-out for C major in octave 5 then MIDI pitches calculated seq = alberti_osequence | degree_in_key_with_octave(C_major, 5) | midi_pitch() # write to file: write_midi.write("alberti.mid", [seq])
from sebastian.core import VSeq, HSeq, Point, OSequence from sebastian.core.transforms import midi_pitch, degree_in_key_with_octave, add from sebastian.core.notes import Key, major_scale from sebastian.midi import write_midi def alberti(triad): """ takes a VSeq of 3 notes and returns an HSeq of those notes in an alberti figuration. """ return HSeq(triad[i] for i in [0, 2, 1, 2]) # an abstract VSeq of 3 notes in root position (degree 1, 3 and 5) root_triad = VSeq(Point(degree=n) for n in [1, 3, 5]) quaver_point = Point({DURATION_64: 8}) # an OSequence with alberti figuration repeated 16 times using quavers alberti_osequence = OSequence(alberti(root_triad) * 16 | add(quaver_point)) C_major = Key("C", major_scale) # note values filled-out for C major in octave 5 then MIDI pitches calculated seq = alberti_osequence | degree_in_key_with_octave(C_major, 5) | midi_pitch() # write to file: write_midi.write("alberti.mid", [seq])