def test_motif_book_example(self): 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('C:4'), Duration(1, 8))) s.append(Note(DiatonicPitch.parse('F#:4'), Duration(1, 8))) notes = s.get_all_notes() c = [ EqualPitchConstraint([notes[0], notes[2]]), NotEqualPitchConstraint([notes[1], notes[3]]) ] m = Motif(s, c, 'A') cs = Beam() cs.append(Note(DiatonicPitch.parse('C:5'), Duration(1, 8))) cs.append(Note(DiatonicPitch.parse('D:5'), Duration(1, 8))) cs.append(Note(DiatonicPitch.parse('C:5'), Duration(1, 8))) cs.append(Note(DiatonicPitch.parse('F#:5'), Duration(1, 8))) c_motif = m.copy_to(cs.get_all_notes()[0]) assert 'A' == c_motif.name assert len(c_motif.actors) == len(notes) assert len(c_motif.constraints) == len(c) assert isinstance(c_motif.constraints[0], EqualPitchConstraint) assert c_motif.constraints[0].actors[0] == c_motif.actors[0] assert c_motif.constraints[0].actors[1] == c_motif.actors[2] assert isinstance(c_motif.constraints[1], NotEqualPitchConstraint) assert c_motif.constraints[1].actors[0] == c_motif.actors[1] assert c_motif.constraints[1].actors[1] == c_motif.actors[3]
def test_nested_notes(self): note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'e'), Duration(1, 16)) sub_beam = Beam([note1, note2, note3]) beam = Beam() beam.append(Note(DiatonicPitch(4, 'f'), Duration(1, 8))) beam.append(sub_beam) beam.append(Note(DiatonicPitch(4, 'g'), Duration(1, 8))) print(beam) notes = beam.get_all_notes() assert len(notes) == 5 assert notes[0].diatonic_pitch == DiatonicPitch(4, 'f') assert notes[1].diatonic_pitch == DiatonicPitch(4, 'c') assert notes[2].diatonic_pitch == DiatonicPitch(4, 'd') assert notes[3].diatonic_pitch == DiatonicPitch(4, 'e') assert notes[4].diatonic_pitch == DiatonicPitch(4, 'g') assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(0) assert notes[2].relative_position == Offset(1, 16) assert notes[3].relative_position == Offset(1, 8) assert notes[4].relative_position == Offset(9, 32) TestBeam.print_all_notes(notes) notes = sub_beam.get_all_notes() TestBeam.print_all_notes(notes) b = Beam() b.append(beam) notes = sub_beam.get_all_notes() TestBeam.print_all_notes(notes) assert notes[0].duration == Duration(1, 32) assert str(notes[0].diatonic_pitch) == 'C:4' sub_beam_prime = sub_beam.clone() notes = sub_beam_prime.get_all_notes() TestBeam.print_all_notes(notes) assert notes[0].duration == Duration(1, 8) assert str(notes[0].diatonic_pitch) == 'C:4' beam_prime = beam.clone() notes = beam_prime.get_all_notes() TestBeam.print_all_notes(notes) assert notes[0].duration == Duration(1, 8) assert str(notes[0].diatonic_pitch) == 'F:4' b_prime = b.clone() notes = b_prime.get_all_notes() TestBeam.print_all_notes(notes) assert notes[0].duration == Duration(1, 16) assert str(notes[0].diatonic_pitch) == 'F:4'
def test_simple_beam(self): note = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) beam = Beam([note]) print(beam) assert beam.cardinality() == 1 assert beam.get_all_notes()[0].diatonic_pitch == DiatonicPitch(4, 'c') notes = beam.get_all_notes() assert len(notes) == 1 TestBeam.print_all_notes(notes)
def test_simple_beam_reverse(self): print('test simple beam 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)) beam = Beam([a, b, c, d]) print(beam) beam.reverse() print(beam) notes = beam.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(1, 8) assert notes[2].relative_position == Offset(1, 4) assert notes[3].relative_position == Offset(3, 8)
def test_add_note_at_lower_level(self): print('start test_add_note_at_lower_level') sub_beam = Beam([ Note(DiatonicPitch(2, 'c'), Duration(1, 8)), Note(DiatonicPitch(2, 'd'), Duration(1, 8)) ]) beam = Beam([ Note(DiatonicPitch(3, 'c'), Duration(1, 8)), sub_beam, Note(DiatonicPitch(3, 'd'), Duration(1, 8)) ]) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert len(notes) == 4 assert beam.sub_notes[1].duration == Duration(1, 8) assert beam.sub_notes[1].relative_position == Offset(1, 8) assert beam.sub_notes[1].sub_notes[1].duration == Duration(1, 16) assert beam.sub_notes[1].sub_notes[1].relative_position == Offset( 1, 16) sub_beam.add(Note(DiatonicPitch(2, 'c'), Duration(1, 8)), 1) AbstractNote.print_structure(beam) assert beam.sub_notes[1].duration == Duration(3, 16) assert beam.sub_notes[1].relative_position == Offset(1, 8) assert beam.sub_notes[1].sub_notes[1].duration == Duration(1, 16) assert beam.sub_notes[1].sub_notes[1].relative_position == Offset( 1, 16)
def test_absolute_position(self): print('test absolute position') a = Note(DiatonicPitch(4, 'a'), Duration(1, 8)) b = Note(DiatonicPitch(4, 'b'), Duration(1, 8)) c = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) d = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 3, [a, b, c, d]) e = Note(DiatonicPitch(4, 'e'), Duration(1, 8)) f = Note(DiatonicPitch(4, 'f'), Duration(1, 8)) g = Note(DiatonicPitch(4, 'g'), Duration(1, 8)) a1 = Note(DiatonicPitch(3, 'a'), Duration(1, 8)) sub_beam = Beam([e, f, g, a1]) b1 = Note(DiatonicPitch(3, 'b'), Duration(1, 8)) c1 = Note(DiatonicPitch(3, 'c'), Duration(1, 8)) d1 = Note(DiatonicPitch(3, 'd'), Duration(1, 8)) e1 = Note(DiatonicPitch(3, 'e'), Duration(1, 8)) beam = Beam([b1, tuplet, c1, sub_beam, d1, e1]) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert notes is not None assert len(notes) == 12 results = [ Position(0), Position(1, 8), Position(7, 32), Position(5, 16), Position(13, 32), Position(1, 2), Position(5, 8), Position(11, 16), Position(3, 4), Position(13, 16), Position(7, 8), Position(1) ] index = 0 for n in notes: print('{0} abs. position = {1}'.format(n, n.get_absolute_position())) assert n.get_absolute_position() == results[index] index += 1
def test_multi_notes(self): note0 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note1 = Note(DiatonicPitch(4, 'd'), Duration(1, 8), 1) note2 = Note(DiatonicPitch(4, 'e'), Duration(1, 16)) beam = Beam([note0, note1, note2]) print(beam) assert beam.cardinality() == 3 notes = beam.get_all_notes() 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 beam.duration == Duration(3, 8) assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(1, 8) assert notes[2].relative_position == Offset(5, 16) assert len(notes) == 3 TestBeam.print_all_notes(notes)
def test_insert_notes(self): print('test_insert_notes') # same as test_nested_notes note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'e'), Duration(1, 16)) sub_beam = Beam([note1, note2, note3]) beam = Beam() beam.append(Note(DiatonicPitch(4, 'f'), Duration(1, 8))) beam.append(sub_beam) beam.append(Note(DiatonicPitch(4, 'g'), Duration(1, 8))) AbstractNote.print_structure(beam) # add a beam n_list = [ Note(DiatonicPitch(3, 'c'), Duration(1, 8)), Note(DiatonicPitch(3, 'd'), Duration(1, 8)) ] add_beam = Beam(n_list) sub_beam.add(add_beam, 1) print(beam) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert len(notes) == 7 TestBeam.print_all_notes(notes) assert notes[0].diatonic_pitch == DiatonicPitch(4, 'f') assert notes[1].diatonic_pitch == DiatonicPitch(4, 'c') assert notes[2].diatonic_pitch == DiatonicPitch(3, 'c') assert notes[3].diatonic_pitch == DiatonicPitch(3, 'd') assert notes[4].diatonic_pitch == DiatonicPitch(4, 'd') assert notes[5].diatonic_pitch == DiatonicPitch(4, 'e') assert notes[6].diatonic_pitch == DiatonicPitch(4, 'g') assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(0) assert notes[2].relative_position == Offset(0) assert notes[3].relative_position == Offset(1, 32) assert notes[4].relative_position == Offset(1, 8) assert notes[5].relative_position == Offset(3, 16) assert notes[6].relative_position == Offset(11, 32)
def test_nested_structure_reverse(self): print('test nested structure reverse') a = Note(DiatonicPitch(4, 'a'), Duration(1, 8)) b = Note(DiatonicPitch(4, 'b'), Duration(1, 8)) c = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) d = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 3, [a, b, c, d]) e = Note(DiatonicPitch(4, 'e'), Duration(1, 8)) f = Note(DiatonicPitch(4, 'f'), Duration(1, 8)) g = Note(DiatonicPitch(4, 'g'), Duration(1, 8)) a1 = Note(DiatonicPitch(3, 'a'), Duration(1, 8)) sub_beam = Beam([e, f, g, a1]) b1 = Note(DiatonicPitch(3, 'b'), Duration(1, 8)) c1 = Note(DiatonicPitch(3, 'c'), Duration(1, 8)) d1 = Note(DiatonicPitch(3, 'd'), Duration(1, 8)) e1 = Note(DiatonicPitch(3, 'e'), Duration(1, 8)) beam = Beam([b1, tuplet, c1, sub_beam, d1, e1]) AbstractNote.print_structure(beam) beam.reverse() AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert notes is not None assert len(notes) == 12 assert notes[0].diatonic_pitch == DiatonicPitch(3, 'e') assert notes[1].diatonic_pitch == DiatonicPitch(3, 'd') assert notes[2].diatonic_pitch == DiatonicPitch(3, 'a') assert notes[3].diatonic_pitch == DiatonicPitch(4, 'g') assert notes[4].diatonic_pitch == DiatonicPitch(4, 'f') assert notes[5].diatonic_pitch == DiatonicPitch(4, 'e') assert notes[6].diatonic_pitch == DiatonicPitch(3, 'c') assert notes[7].diatonic_pitch == DiatonicPitch(4, 'd') assert notes[8].diatonic_pitch == DiatonicPitch(4, 'c') assert notes[9].diatonic_pitch == DiatonicPitch(4, 'b') assert notes[10].diatonic_pitch == DiatonicPitch(4, 'a') assert notes[11].diatonic_pitch == DiatonicPitch(3, 'b')
def test_simple_motif(self): 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))) notes = s.get_all_notes() c = [ EqualPitchConstraint([notes[0], notes[2]]), NotEqualPitchConstraint([notes[1], notes[3]]) ] m = Motif(s, c, 'A') actors = m.actors assert 'A' == m.name assert len(actors) == len(notes) cc = m.constraints assert len(cc) == len(c) assert isinstance(cc[0], EqualPitchConstraint) cc_a = cc[0].actors assert len(cc_a) == 2 assert cc_a[0] == actors[0] assert cc_a[1] == actors[2] assert isinstance(cc[1], NotEqualPitchConstraint) cc_b = cc[1].actors assert len(cc_a) == 2 assert cc_b[0] == actors[1] assert cc_b[1] == actors[3] assert 'F#:4' == str(actors[3].diatonic_pitch) print(m) cs = Beam() first_note = Note(DiatonicPitch.parse('C:3'), Duration(1, 8)) cs.append(first_note) cs.append(Note(DiatonicPitch.parse('D:3'), Duration(1, 8))) cs.append(Note(DiatonicPitch.parse('E:3'), Duration(1, 8))) cs.append(Note(DiatonicPitch.parse('F#:3'), Duration(1, 8))) c_motif = m.copy_to(first_note) c_actors = c_motif.actors assert 'A' == c_motif.name assert len(c_actors) == len(notes) ccc = c_motif.constraints assert len(ccc) == len(c) assert isinstance(ccc[0], EqualPitchConstraint) ccc_a = ccc[0].actors assert len(ccc_a) == 2 assert ccc_a[0] == c_actors[0] assert ccc_a[1] == c_actors[2] assert isinstance(ccc[1], NotEqualPitchConstraint) ccc_b = ccc[1].actors assert len(ccc_a) == 2 assert ccc_b[0] == c_actors[1] assert ccc_b[1] == c_actors[3] assert 'F#:3' == str(c_actors[3].diatonic_pitch) print(c_motif)
def test_tuplet_variations(self): print('test tuplet variations') # 1. Beam with 3 1/8 notes note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) beam = Beam([note1, note2, note3]) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert len(notes) == 3 assert notes[0].duration == Duration(1, 8) assert notes[1].duration == Duration(1, 8) assert notes[2].duration == Duration(1, 8) assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(1, 8) assert notes[2].relative_position == Offset(1, 4) # 2. beam with a tuplet note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 2, [note1, note2, note3]) beam = Beam([tuplet]) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert len(notes) == 3 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) # 3. tuplet with a beam note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) beam = Beam([note1, note2, note3]) tuplet = Tuplet(Duration(1, 8), 2, beam) AbstractNote.print_structure(tuplet) notes = beam.get_all_notes() assert len(notes) == 3 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) # 4. beam a beam of a tuplet note1 = Note(DiatonicPitch(4, 'c'), Duration(1, 8)) note2 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) note3 = Note(DiatonicPitch(4, 'd'), Duration(1, 8)) tuplet = Tuplet(Duration(1, 8), 2, [note1, note2, note3]) sub_beam = Beam([tuplet]) beam = Beam(sub_beam) AbstractNote.print_structure(beam) notes = beam.get_all_notes() assert len(notes) == 3 assert notes[0].duration == Duration(1, 24) assert notes[1].duration == Duration(1, 24) assert notes[2].duration == Duration(1, 24) assert notes[0].relative_position == Offset(0) assert notes[1].relative_position == Offset(1, 24) assert notes[2].relative_position == Offset(1, 12)
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