def test_simple_tuplet_reverse(self): print('test simple tuplet reverse') a = Note(DiatonicPitch(3, 'a'), Duration(1, 8)) b = Note(DiatonicPitch(3, 'b'), Duration(1, 8)) c = Note(DiatonicPitch(3, 'c'), Duration(1, 8)) d = Note(DiatonicPitch(3, 'd'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 3, [a, b, c, d]) print(tuplet) tuplet.reverse() print(tuplet) notes = tuplet.get_all_notes() assert notes is not None assert len(notes) == 4 assert notes[0].diatonic_pitch == DiatonicPitch(3, 'd') assert notes[1].diatonic_pitch == DiatonicPitch(3, 'c') assert notes[2].diatonic_pitch == DiatonicPitch(3, 'b') assert notes[3].diatonic_pitch == DiatonicPitch(3, 'a') assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(3, 32) assert notes[2].relative_position == Offset(3, 16) assert notes[3].relative_position == Offset(9, 32)
def test_nested_tuplet(self): note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) sub_tuplet = Tuplet(Duration(1, 8), 2, [ Note(DiatonicPitch(3, 'c'), Duration(1, 8)), Note(DiatonicPitch(3, 'd'), Duration(1, 8)), Note(DiatonicPitch(3, 'e'), Duration(1, 8)) ]) tuplet = Tuplet(Duration(1, 8), 2, [note1, sub_tuplet, note2]) print(tuplet) AbstractNote.print_structure(tuplet) notes = tuplet.get_all_notes() assert len(notes) == 5 assert notes[0].duration == Duration(1, 16) assert notes[1].duration == Duration(1, 24) assert notes[2].duration == Duration(1, 24) assert notes[3].duration == Duration(1, 24) assert notes[4].duration == Duration(1, 16) assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(0) assert notes[2].relative_position == Offset(1, 24) assert notes[3].relative_position == Offset(1, 12) assert notes[4].relative_position == Offset(3, 16) assert tuplet.sub_notes[1].duration == Duration(1, 8) assert tuplet.sub_notes[1].relative_position == Offset(1, 16) sub_tuplet_prime = sub_tuplet.clone() notes = sub_tuplet_prime.get_all_notes() AbstractNote.print_structure(sub_tuplet_prime) assert notes[0].duration == Duration(1, 12) assert str(notes[0].diatonic_pitch) == 'C:3' tuplet_prime = tuplet.clone() notes = tuplet_prime.get_all_notes() AbstractNote.print_structure(tuplet_prime) assert notes[0].duration == Duration(1, 16) assert str(notes[0].diatonic_pitch) == 'C:4' assert notes[1].duration == Duration(1, 24)
def test_tuplet_with_nested_beam(self): note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) n_list = [ Note(DiatonicPitch(3, 'c'), Duration(1, 8)), Note(DiatonicPitch(3, 'd'), Duration(1, 8)) ] add_beam = Beam(n_list) tuplet = Tuplet(Duration(1, 8), 2, [note1, add_beam, note2]) print(tuplet) AbstractNote.print_structure(tuplet) notes = tuplet.get_all_notes() assert len(notes) == 4 assert tuplet.sub_notes[0].duration == Duration(1, 16) assert tuplet.sub_notes[0].relative_position == Offset(0) assert tuplet.sub_notes[1].duration == Duration(1, 8) assert tuplet.sub_notes[1].relative_position == Offset(1, 16) assert tuplet.sub_notes[2].duration == Duration(1, 16) assert tuplet.sub_notes[2].relative_position == Offset(3, 16) assert notes[1].duration == Duration(1, 16) assert notes[1].relative_position == Offset(0) assert notes[2].duration == Duration(1, 16) assert notes[2].relative_position == Offset(1, 16) add_beam_prime = add_beam.clone() notes = add_beam_prime.get_all_notes() AbstractNote.print_structure(add_beam_prime) assert notes[0].duration == Duration(1, 8) assert str(notes[0].diatonic_pitch) == 'C:3' tuplet_prime = tuplet.clone() notes = tuplet_prime.get_all_notes() AbstractNote.print_structure(tuplet_prime) assert notes[0].duration == Duration(1, 16) assert str(notes[0].diatonic_pitch) == 'C:4' assert notes[1].duration == Duration(1, 16)
def test_simple_tuplet(self): note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'e'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 2, [note1, note2, note3]) print(tuplet) AbstractNote.print_structure(tuplet) notes = tuplet.get_all_notes() assert len(notes) == 3 assert notes[0].diatonic_pitch == DiatonicPitch(4, 'c') assert notes[1].diatonic_pitch == DiatonicPitch(4, 'd') assert notes[2].diatonic_pitch == DiatonicPitch(4, 'e') assert notes[0].duration == Duration(1, 12) assert notes[1].duration == Duration(1, 12) assert notes[2].duration == Duration(1, 12) assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(1, 12) assert notes[2].relative_position == Offset(1, 6)
def test_TBB_layers(self): print('start test_TBB_layers') sub_sub_beam = Beam([ Note(DiatonicPitch(2, 'c'), Duration(1, 8)), Note(DiatonicPitch(2, 'd'), Duration(1, 8)) ]) sub_beam = Beam([ Note(DiatonicPitch(3, 'c'), Duration(1, 8)), sub_sub_beam, Note(DiatonicPitch(3, 'd'), Duration(1, 8)) ]) AbstractNote.print_structure(sub_beam) note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) print('-----------') tuplet = Tuplet(Duration(1, 8), 2, [note1, sub_beam, note2]) AbstractNote.print_structure(tuplet) notes = tuplet.get_all_notes() assert len(notes) == 6 assert tuplet.sub_notes[1].duration == Duration(3, 20) assert tuplet.sub_notes[1].relative_position == Offset(1, 20) assert tuplet.sub_notes[1].sub_notes[1].duration == Duration(1, 20) assert tuplet.sub_notes[1].sub_notes[1].relative_position == Offset( 1, 20) sub_sub_beam.add(Note(DiatonicPitch(2, 'c'), Duration(1, 8)), 1) AbstractNote.print_structure(tuplet) assert tuplet.sub_notes[1].duration == Duration(7, 44) assert tuplet.sub_notes[1].relative_position == Offset(1, 22) assert tuplet.sub_notes[1].sub_notes[1].duration == Duration(3, 44) assert tuplet.sub_notes[1].sub_notes[1].relative_position == Offset( 1, 22) print('end test_TBB_layers')
def test_simple_form(self): line = Line() s = Beam() s.append(Note(DiatonicPitch.parse('C:4'), Duration(1, 8))) s.append(Note(DiatonicPitch.parse('D:4'), Duration(1, 8))) s.append(Note(DiatonicPitch.parse('E:4'), Duration(1, 8))) s.append(Note(DiatonicPitch.parse('F#:4'), Duration(1, 8))) line.pin(s) notes = s.get_all_notes() c = [ EqualPitchConstraint([notes[0], notes[2]]), NotEqualPitchConstraint([notes[1], notes[3]]) ] a = Motif(s, c, 'A') s1 = [ Note(DiatonicPitch(4, 'c'), Duration(1, 8)), Note(DiatonicPitch(4, 'd'), Duration(1, 8)), Note(DiatonicPitch(4, 'e'), Duration(1, 8)), ] tuplet = Tuplet(Duration(1, 8), 2, s1) line.pin(tuplet, Offset(1, 2)) notes = tuplet.get_all_notes() c1 = [ EqualPitchConstraint([notes[0], notes[2]]), RelativeScalarStepConstraint(notes[1], notes[2], -2, 2) ] b = Motif(tuplet, c1, 'B') f = Form([a, b]) print(f) constraints = [ EqualPitchConstraint([a.actors[0], b.actors[1]]) ] # Ensure a, b cloned for reliability - see comment in Form. ff = Form([a, b], constraints) print(ff) constr = ff.external_constraints assert len(constr) == 1 actors = ff.actors assert len(actors) == 7 assert isinstance(constr[0], EqualPitchConstraint) assert constr[0].actors[0] == actors[0] assert constr[0].actors[1] == actors[4 + 1] all_constr = ff.constraints assert len(all_constr) == 5 # Add more notes to clone ff as: s3 = Beam() first_note = Note(DiatonicPitch.parse('C:5'), Duration(1, 8)) s3.append(first_note) s3.append(Note(DiatonicPitch.parse('D:5'), Duration(1, 8))) s3.append(Note(DiatonicPitch.parse('E:5'), Duration(1, 8))) s3.append(Note(DiatonicPitch.parse('F#:5'), Duration(1, 8))) line.pin(s3, Offset(3)) s2 = [ Note(DiatonicPitch(5, 'c'), Duration(1, 8)), Note(DiatonicPitch(5, 'd'), Duration(1, 8)), Note(DiatonicPitch(5, 'e'), Duration(1, 8)), ] tuplet1 = Tuplet(Duration(1, 8), 2, s2) line.pin(tuplet1, Offset(7, 2)) fff = ff.copy_to(first_note) assert fff is not None print(fff) constr = fff.external_constraints assert len(constr) == 1 assert len(fff.constraints) == 5 actors = fff.actors assert len(actors) == 7 assert isinstance(constr[0], EqualPitchConstraint) assert constr[0].actors[0] == actors[0] assert constr[0].actors[1] == actors[4 + 1] all_constr = fff.constraints assert len(all_constr) == 5