예제 #1
0
    def test_1(self):
        fm = FractalMusic(tempo=60,
                          proportions=[1, 2, 3, 4],
                          tree_permutation_order=[3, 1, 4, 2],
                          quarter_duration=100)
        fm.midi_generator.midi_range = [60, 79]
        fm.add_layer()
        partial_fm = fm.get_leaves()[3]
        partial_fm.add_layer()
        for leaf in partial_fm.traverse():
            leaf.chord.add_lyric(leaf.fractal_order)
            leaf.chord.add_words(leaf.midi_generator.midi_range)
            # leaf.chord.add_words(leaf.midi_generator.directions, relative_y=30)
        # print([leaf.fractal_order for leaf in partial_fm.traverse_leaves()])
        score = TreeScoreTimewise()
        v = partial_fm.get_simple_format(0).to_stream_voice(1)
        v.add_to_score(score, 1)

        v = partial_fm.get_simple_format().__deepcopy__().to_stream_voice(1)
        v.add_to_score(score, 2)

        partial_fm.reduce_children(
            condition=lambda child: child.fractal_order > 2)
        v = partial_fm.get_simple_format().__deepcopy__().to_stream_voice(1)
        v.add_to_score(score, 3)

        xml_path = path + '_test_1.xml'
        score.write(xml_path)
        self.assertCompareFiles(actual_file_path=xml_path)
예제 #2
0
 def test_3(self):
     fm = FractalMusic(duration=100)
     fm.add_layer()
     try:
         fm.tempo = 60
     except (ChildTempoIsAlreadySet, TempoIsAlreadySet) as err:
         self.fail(err + "was raised!")
예제 #3
0
    def test_7(self):
        fm = FractalMusic(tempo=60,
                          proportions=[1, 2, 3, 4],
                          tree_permutation_order=[3, 1, 4, 2],
                          quarter_duration=20)
        fm.midi_generator.midi_range = [60, 79]
        fm.add_layer()
        fm.chord.add_words(fm.midi_generator.midi_range)

        for child in fm.get_children():
            child.chord.add_lyric(child.fractal_order)
            child.chord.add_words(child.midi_generator.midi_range)

        for index, node in enumerate(fm.get_children()):
            node.midi_generator.midi_range = [60 - index, 72 - index]

        fm.add_layer()
        for leaf in fm.traverse_leaves():
            leaf.chord.add_lyric(leaf.fractal_order)

        score = TreeScoreTimewise()

        for layer_number in range(0, fm.number_of_layers + 1):
            simple_format = fm.get_simple_format(layer_number)

            v = simple_format.to_stream_voice(1)
            v.add_to_score(score, layer_number + 1)

        xml_path = path + '_test_7.xml'
        score.accidental_mode = 'normal'
        score.write(xml_path)
        self.assertCompareFiles(actual_file_path=xml_path)
예제 #4
0
 def setUp(self) -> None:
     self.fm = FractalMusic(tempo=60,
                            quarter_duration=12,
                            tree_permutation_order=(3, 1, 4, 2),
                            proportions=[1, 2, 3, 4],
                            multi=(1, 1))
     self.fm.midi_generator.midi_range = [55, 55 + 24]
     self.fm.midi_generator.microtone = 4
예제 #5
0
    def setUp(self) -> None:
        self.fm_3 = FractalMusic(value=10)
        self.fm_3.tempo = 60

        self.fm_7 = FractalMusic(value=30,
                                 proportions=(1, 2, 3, 4, 5, 6, 7),
                                 tree_permutation_order=(3, 1, 6, 5, 7, 4, 2))
        self.fm_7.tempo = 72
예제 #6
0
 def setUp(self) -> None:
     self.score = TreeScoreTimewise()
     fm = FractalMusic(tempo=60,
                       quarter_duration=10,
                       reading_direction='vertical')
     fm.add_layer()
     fm.add_layer()
     self.fm = fm.get_children()[1]
     self.deep_copied = self.fm.__deepcopy__()
예제 #7
0
    def test_8(self):
        fm = FractalMusic(duration=100)
        fm.tempo = 72
        fm.add_layer()
        fm.add_layer()
        fm.add_layer()
        fm.set_none_tempi(60)

        self.assertEqual(fm.get_layer(2, key='tempo'),
                         [[72, 72, 72], [72, 72, 72], [72, 72, 72]])
예제 #8
0
 def setUp(self) -> None:
     self.fm = FractalMusic(proportions=(1, 2, 3),
                            tree_permutation_order=(3, 1, 2))
     self.fm.duration = 10
     self.fm.tempo = 60
     self.fm.midi_generator.midi_range = [60, 67]
     self.fm.add_layer()
     self.score = TreeScoreTimewise()
     self.score.set_time_signatures(
         quarter_durations=[self.fm.quarter_duration])
예제 #9
0
 def test_1(self):
     fm = FractalMusic(proportions=[1, 2, 3], tree_permutation_order=[3, 1, 2], duration=12, tempo=72)
     fm.quarter_duration = round(fm.quarter_duration)
     fm.add_layer()
     quarter_durations = [float(leaf.quarter_duration) for leaf in fm.traverse_leaves()]
     # print(quarter_durations)
     # print(sum(quarter_durations))
     fm.quantize_leaves(grid_size=0.5)
     quarter_durations = [float(leaf.quarter_duration) for leaf in fm.traverse_leaves()]
     self.assertEqual(quarter_durations, [7.0, 2.5, 4.5])
예제 #10
0
 def test_4(self):
     fm = FractalMusic(duration=100)
     fm.add_layer()
     fm.get_children()[0].tempo = 72
     fm.set_none_tempi(90)
     self.assertEqual([child.tempo for child in fm.get_children()],
                      [72, 90., 90])
예제 #11
0
 def test_deep_copied_child_midi_values(self):
     fm = FractalMusic(proportions=[1, 2, 3, 4],
                       tree_permutation_order=[3, 1, 4, 2],
                       quarter_duration=20,
                       tempo=70)
     fm.midi_generator.midi_range = [36, 60]
     fm.add_layer()
     selected_node = fm.get_children()[0]
     copied_node = selected_node.__deepcopy__()
     copied_node.add_layer()
     actual = [node.midi_value for node in copied_node.get_children()]
     selected_node.add_layer()
     expected = [node.midi_value for node in selected_node.get_children()]
     self.assertEqual(expected, actual)
예제 #12
0
    def test_4(self):
        fm_1 = FractalMusic(multi=(1, 2), tempo=60, quarter_duration=10)
        fm_2 = FractalMusic(multi=(1, 1), tempo=60, quarter_duration=10)
        fms = [fm_1, fm_2]

        for fm in fms:
            fm.midi_generator.midi_range = [60, 72]

        fm_2.multi = fm_1.multi

        self.assertEqual(fm_2.children_fractal_values, fm_1.children_fractal_values)
        self.assertEqual(fm_2.children_fractal_orders, fm_1.children_fractal_orders)
        self.assertEqual(fm_2.midi_generator.midi_range, fm_1.midi_generator.midi_range)
        self.assertEqual(fm_2.children_generated_midis, fm_1.children_generated_midis)
예제 #13
0
 def setUp(self) -> None:
     self.fm = FractalMusic(tempo=60,
                            quarter_duration=12,
                            tree_permutation_order=(3, 1, 2),
                            proportions=[1, 2, 3])
     self.fm.midi_generator.set_directions(1, 1, -1)
     self.fm.midi_generator.midi_range = [55, 72]
예제 #14
0
 def test_calculate_range_factor(self):
     fm = FractalMusic(proportions=(1, 2, 3, 4, 5, 6, 7),
                       tree_permutation_order=(2, 6, 4, 1, 3, 7, 5),
                       quarter_duration=30,
                       tempo=60)
     fm.midi_generator.midi_range = [60, 84]
     multi_chord_midi_range_interval = 11
     fm.add_layer()
     actual = [
         leaf.calculate_range_factor(multi_chord_midi_range_interval)
         for leaf in fm.traverse_leaves()
     ]
     expected = [
         -3.6666666666666665, -1.2222222222222223, -1.8333333333333333,
         11.0, 2.2, 1.1, 1.375
     ]
     self.assertEqual(expected, actual)
예제 #15
0
    def test_change_midi_range_afterwards(self):

        fm = FractalMusic(proportions=[1, 2, 3],
                          tree_permutation_order=[3, 1, 2])
        fm.tempo = 60
        fm.duration = 10
        fm.midi_generator.midi_range = [40, 50]
        fm.add_layer()
        fm.add_layer()
        fm.reset_midis()
        fm.midi_generator.midi_range = [60, 70]
        expected = [62.0, 65.0, 60.0, 67.0, 69.0, 70.0, 67.0, 65.0, 69.0]
        actual = [l.midi_value for l in fm.traverse_leaves()]
        self.assertEqual(expected, actual)
예제 #16
0
class Test(TestCase):
    def setUp(self) -> None:
        self.fm = FractalMusic(tempo=60,
                               tree_permutation_order=[3, 1, 2],
                               proportions=[1, 2, 3],
                               quarter_duration=20)
        self.score = TreeScoreTimewise()

    def test_1(self):
        self.fm.add_layer()
        self.fm.add_layer()
        self.fm.add_layer()
        sf = self.fm.get_simple_format(layer=1)
        v = sf.to_stream_voice(1)
        v.add_to_score(self.score)
        xml_path = path + '_test_1.xml'
        self.score.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #17
0
 def test_1(self):
     fm = FractalMusic(tempo=60, quarter_duration=10)
     fm.midi_generator.midi_range = [60, 72]
     fm.add_layer()
     fm.add_info('fractal_order')
     score = fm.get_score(layer_number=fm.number_of_layers)
     xml_path = path + '_test_1.xml'
     score.write(path=xml_path)
     self.assertCompareFiles(xml_path)
예제 #18
0
 def test_1(self):
     fm = FractalMusic(tempo=60,
                       quarter_duration=10,
                       proportions=(1, 2, 3),
                       tree_permutation_order=(3, 1, 2))
     fm.add_layer()
     midis = [B(4), A(4, 'b'), C(4, '#'), A(3), F(4)]
     fm.get_children()[0].add_layer()
     for leaf, midi in zip(fm.traverse_leaves(), midis):
         leaf.set_chord(TreeChord(midi))
     score = fm.get_score(show_fractal_orders=True)
     xml_path = path + '_test_.xml'
     score.write(path=xml_path)
예제 #19
0
 def test_3(self):
     fm = FractalMusic(tempo=60, quarter_duration=10)
     fm.midi_generator.midi_range = [60, 72]
     fm.add_layer()
     fm.add_layer()
     fm.add_info('midi_value')
     score = fm.get_score()
     xml_path = path + '_test_3.xml'
     score.write(path=xml_path)
     self.assertCompareFiles(xml_path)
예제 #20
0
 def test_4(self):
     fm = FractalMusic(tempo=60, quarter_duration=10)
     fm.midi_generator.midi_range = [60, 72]
     fm.add_layer()
     fm.add_layer()
     fm.add_info((lambda node: int(node.midi_value) if int(node.midi_value) == node.midi_value else node.midi_values,
                  'above'))
     score = fm.get_score()
     xml_path = path + '_test_4.xml'
     score.write(path=xml_path)
     self.assertCompareFiles(xml_path)
예제 #21
0
    def test_4(self):
        # self.fm.multi = (self.fm.multi[0], self.fm.multi[1] + 1)
        def get_chord_stamp():
            node = fm.__copy__()
            node.midi_generator.midi_range = fm.midi_generator.midi_range
            node.midi_generator.microtone = 4
            node.add_layer()
            chord_midis = [child.midi_value for child in node.get_children()]
            output = [chord_midi - chord_midis[node.size // 2] for chord_midi in chord_midis]
            return output

        fm = FractalMusic(proportions=(1, 2, 3, 4, 5, 6, 7), tree_permutation_order=(2, 6, 4, 1, 3, 7, 5),
                          quarter_duration=30, tempo=80)
        fm.midi_generator.midi_range = (60, 72)
        fm.midi_generator.microtone = 4
        fm.add_layer()
        fm.quantize_children(grid_size=1)
        proportions = (1, 10, 1, 7, 1)
        breakpoints = (1, Fraction(1, 7), 1)
        selected_nodes = fm.get_children()[1:3]

        breath_quarter_duration = sum([node.quarter_duration for node in selected_nodes])
        breathe = Breathe(proportions=proportions, breakpoints=breakpoints, quarter_duration=breath_quarter_duration,
                          quantize=1)
        parent_chord_field = ChordField(duration_generator=breathe.duration_generator.__deepcopy__())
        for i in range(len(selected_nodes)):
            node = selected_nodes[i]
            start_chord = [stamp + node.midi_value for stamp in get_chord_stamp()]
            next_node = node.next_sibling
            if next_node:
                end_chord = [stamp + node.midi_value for stamp in get_chord_stamp()]
            else:
                end_chord = start_chord

            chord_field = ChordField(
                midi_generator=ValueGenerator(RandomInterpolation(start=start_chord, end=end_chord, seed=10)),
                long_ending_mode='self_extend',
                short_ending_mode='self_shrink')
            parent_chord_field.add_child(chord_field)

            node.chord_field = chord_field

        score = fm.get_score(show_fractal_orders=True, layer_number=fm.number_of_layers)
        score.max_division = 7
        score.finish()
        partwise = score.to_partwise()
        xml_path = path + '_test_4.xml'
        partwise.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #22
0
class Test(TestCase):
    def setUp(self) -> None:
        self.fm = FractalMusic(duration=10)

    def test_1(self):
        self.fm.tempo = 70
        self.fm.add_layer()
        self.fm.change_quarter_duration(round(self.fm.quarter_duration))

        xml_path = path + '_test_1.xml'
        score = self.fm.get_score(show_fractal_orders=True)
        score.write(xml_path)
        self.assertCompareFiles(xml_path)

    def test_2(self):
        self.fm.tempo = 70
        self.fm.add_layer()
        self.fm.add_layer()
        self.fm.quantize_children()
        xml_path = path + '_test_2.xml'
        score = self.fm.get_children_score(show_fractal_orders=True)
        score.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #23
0
    def test_3(self):
        fm = FractalMusic(tempo=60, quarter_duration=10, multi=(1, 3))
        fm.midi_generator.midi_range = [60, 72]
        fm.add_layer()
        for child in fm.get_children():
            for midi in child.chord.midis:
                midi.notehead = Notehead('diamond', filled='no')
        for child in fm.get_children():
            child.add_gliss()

        fm.get_children()[-1].chord_field.chords[-1].get_post_grace_chords(
        )[0].midis[0].notehead = Notehead('diamond', filled='no')
        score = fm.get_score(show_fractal_orders=True,
                             layer_number=fm.number_of_layers)
        xml_path = path + '_test_3.xml'
        score.write(path=xml_path)
        self.assertCompareFiles(xml_path)
예제 #24
0
    def test_5(self):
        def get_chord(node):
            output = fm.get_multi_chord_midis_with_range_factor(range_factor=1, microtone=4)
            transposition = node.midi_value - output[3]
            output = [midi + transposition for midi in output]
            return output

        fm = FractalMusic(proportions=(1, 2, 3, 4, 5, 6, 7), tree_permutation_order=(2, 6, 4, 1, 3, 7, 5),
                          quarter_duration=30, tempo=72)
        # fm.multi = (self.fm.multi[0], self.fm.multi[1] + 1)
        fm.midi_generator.midi_range = (62, 62 + 11)
        fm.midi_generator.microtone = 4
        fm.add_layer()
        fm.quantize_children(grid_size=1)
        selected_nodes = fm.get_children()[2:5]

        proportions = (1, 10, 1, 7, 1)
        breakpoints = (1, Fraction(1, 7), 1)
        breath_quarter_duration = sum([node.quarter_duration for node in selected_nodes])
        breathe = Breathe(proportions=proportions, breakpoints=breakpoints, quarter_duration=breath_quarter_duration,
                          quantize=1)
        parent_chord_field = ChordField(duration_generator=breathe.duration_generator.__deepcopy__())
        for i in range(len(selected_nodes)):
            node = selected_nodes[i]
            start_chord = get_chord(node)
            next_node = node.next_sibling
            if next_node:
                end_chord = get_chord(next_node)
            else:
                end_chord = start_chord

            chord_field = ChordField(
                midi_generator=ValueGenerator(RandomInterpolation(start=start_chord, end=end_chord, seed=10)),
                long_ending_mode='self_extend',
                short_ending_mode='self_shrink')
            parent_chord_field.add_child(chord_field)

            node.chord_field = chord_field

        score = fm.get_score(show_fractal_orders=True, layer_number=fm.number_of_layers)
        score.max_division = 7
        score.finish()
        partwise = score.to_partwise()
        xml_path = path + '_test_5.xml'
        partwise.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #25
0
 def test_2(self):
     fm = FractalMusic(tempo=60, quarter_duration=10, multi=(1, 2))
     fm.midi_generator.midi_range = [60, 72]
     fm.add_layer()
     for child in fm.get_children():
         child.chord.add_articulation('accent')
         child.chord.add_dynamics('f')
     for child in fm.get_children():
         child.add_gliss()
     score = fm.get_score(show_fractal_orders=True,
                          layer_number=fm.number_of_layers)
     xml_path = path + '_test_2.xml'
     score.write(path=xml_path)
     self.assertCompareFiles(xml_path)
예제 #26
0
 def test_6(self):
     fm = FractalMusic(reading_direction='vertical',
                       tempo=120,
                       value=1.5,
                       proportions=(1, 2, 3, 4, 5, 6, 7),
                       tree_permutation_order=(2, 6, 4, 1, 3, 7, 5),
                       multi=(1, 4))
     fm.midi_generator.midi_range = (62, 70)
     fm.add_layer()
     # fm.generate_children(number_of_children=1)
     fm.reduce_children(lambda child: child.fractal_order < 7)
     result = fm.get_children()[0].midi_generator.midi_range
     # not [62, 70] because of directions ([-1, ...])
     expected = [70, 62]
     self.assertEqual(expected, result)
예제 #27
0
 def test_1(self):
     fm = FractalMusic(tempo=60, quarter_duration=10)
     fm.midi_generator.midi_range = [60, 72]
     fm.add_layer()
     for child in fm.get_children():
         child.add_gliss(grid=0.5, show_heads=True)
         child.chord_field.chords[0].add_articulation('accent')
     score = fm.get_score(show_fractal_orders=True,
                          layer_number=fm.number_of_layers)
     xml_path = path + '_test_1.xml'
     score.write(path=xml_path)
     self.assertCompareFiles(xml_path)
class Test(TestCase):
    def setUp(self) -> None:
        self.score = TreeScoreTimewise()
        self.fm = FractalMusic(tempo=60, quarter_duration=10)
        self.fm.midi_generator.midi_range = [60, 71]
        self.fm.add_layer()
        self.copied = self.fm.__deepcopy__()

    def test_1(self):
        xml_path = path + '_test_1.xml'
        self.fm.quantize_children(1)
        self.score.set_time_signatures([child.quarter_duration for child in self.fm.get_children()])

        self.copied.inverse_tree_directions()
        self.copied.quantize_children(1)
        self.fm.get_simple_format().to_stream_voice().add_to_score(score=self.score, staff_number=1)
        self.copied.get_simple_format().to_stream_voice().add_to_score(score=self.score, staff_number=2)
        self.score.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #29
0
class Test(TestCase):
    def setUp(self) -> None:
        self.fm = FractalMusic(tempo=60, quarter_duration=4)

    def test_1(self):
        self.fm.split(1, 2)
        score = TreeScoreTimewise()
        self.fm.get_score(score)
        xml_path = path + '_test_1.xml'
        score.write(xml_path)
        self.assertCompareFiles(xml_path)

    def test_2(self):
        self.fm.split(1, 2)[1].chord.to_rest()
        score = TreeScoreTimewise()
        self.fm.get_score(score)
        xml_path = path + '_test_2.xml'
        score.write(xml_path)
        self.assertCompareFiles(xml_path)
예제 #30
0
    def test_5(self):
        # node.chord_fields are part of a breathe group
        fm = FractalMusic(quarter_duration=20, tempo=80)
        fm.add_layer()
        fm.quantize_children(grid_size=1)

        node_groups = slice_list(fm.get_children(), (2, 1))

        cf_1 = ChordField(
            midi_generator=ValueGenerator(cycle([60, 61, 64, 66])),
            long_ending_mode='self_extend',
            short_ending_mode='self_shrink'
        )
        cf_2 = ChordField(
            midi_generator=ValueGenerator(cycle([72, 73, 74, 73, 72])),
            long_ending_mode='self_extend',
            short_ending_mode='self_shrink'
        )

        breathe_unit = Fraction(1, 5)
        breathe_breakpoints = (5 * breathe_unit, breathe_unit, 5 * breathe_unit)
        breathe_proportions = [2, 4, 1, 7, 2]

        breathe = Breathe(proportions=breathe_proportions,
                          quarter_duration=sum([node.chord.quarter_duration for node in node_groups[0]]),
                          breakpoints=breathe_breakpoints)

        cfg = ChordField(duration_generator=breathe.duration_generator)
        cfg.add_child(cf_1)
        cfg.add_child(cf_2)

        fm.get_children()[0].chord_field = cf_1
        fm.get_children()[1].chord_field = cf_2
        score = fm.get_score(show_fractal_orders=True)
        xml_path = path + 'test_5.xml'
        score.write(xml_path)
        self.assertCompareFiles(xml_path)