def test_reverse_is_reversable(self): """ Ensure that a double reverse of a sequence is idempotent """ from sebastian.core.transforms import reverse s1 = self.make_sequence() reversed = s1 | reverse() | reverse() self.assertEqual(s1._elements, reversed._elements)
def test_reversed_doesnt_modify_next_offset(self): """ Ensure reversed sequences are the same length as their input """ from sebastian.core.transforms import reverse s1 = self.make_sequence() reversed = s1 | reverse() self.assertEqual(s1.next_offset(), reversed.next_offset())
def test_reverse(self): """ Ensure puts points in a sequence backwards """ from sebastian.core.transforms import reverse s1 = self.make_sequence() reversed = s1 | reverse() from sebastian.core import OFFSET_64, DURATION_64, MIDI_PITCH self.assertEqual(reversed._elements, [ {MIDI_PITCH: 53, OFFSET_64: 0, DURATION_64: 20}, {MIDI_PITCH: 50, OFFSET_64: 6, DURATION_64: 17}, {OFFSET_64: 39} ])
def test_reverse(self): """ Ensure puts points in a sequence backwards """ from sebastian.core.transforms import reverse s1 = self.make_sequence() reversed = s1 | reverse() from sebastian.core import OFFSET_64, DURATION_64 self.assertEqual(reversed._elements, [{ "pitch": 53, OFFSET_64: 0, DURATION_64: 20 }, { "pitch": 50, OFFSET_64: 6, DURATION_64: 17 }, { OFFSET_64: 39 }])
from sebastian.lilypond.interp import parse from sebastian.lilypond.write_lilypond import write from sebastian.midi import write_midi, player from sebastian.core import OSequence, HSeq, Point, DURATION_64 from sebastian.core.transforms import transpose, reverse, add, degree_in_key, midi_pitch, lilypond from sebastian.core.notes import Key, major_scale # construct sequences using lilypond syntax seq1 = parse("c d e") seq2 = parse("e f g") # concatenate seq3 = seq1 + seq2 # transpose and reverse seq4 = seq3 | transpose(12) | reverse() # merge seq5 = seq3 // seq4 # play MIDI player.play([seq5]) # write to MIDI write_midi.write("seq5.mid", [seq5]) # contruct a horizontal sequence of scale degrees seq6 = HSeq(Point(degree=degree) for degree in [1, 2, 3, 2, 1]) # put that sequence into C major, octave 4 quavers C_MAJOR = Key("C", major_scale)
def mound(seq): return seq + (seq | reverse())
## point transformation from sebastian.core.transforms import transpose, reverse, stretch, invert, add, degree_in_key, midi_pitch # transpose assert (s1 | transpose(12))._elements == [ {MIDI_PITCH: 62, OFFSET_64: 16, DURATION_64: 16}, {MIDI_PITCH: 64, OFFSET_64: 32, DURATION_64: 16} ] assert s1 | transpose(5) | transpose(-5) == s1 # reverse assert (s1 | reverse())._elements == [ {MIDI_PITCH: 52, OFFSET_64: 0, DURATION_64: 16}, {MIDI_PITCH: 50, OFFSET_64: 16, DURATION_64: 16}, {OFFSET_64: 48} ] assert s1 | reverse() | reverse() == s1 # stretch assert (s1 | stretch(2))._elements == [ {MIDI_PITCH: 50, OFFSET_64: 32, DURATION_64: 32}, {MIDI_PITCH: 52, OFFSET_64: 64, DURATION_64: 32} ] assert s1 | stretch(2) | stretch(0.5) == s1