示例#1
0
    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]
示例#2
0
    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'
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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')
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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