Fixed bug with subdivisions and added tests
This commit is contained in:
@ -87,3 +87,20 @@ def test_subdivisions(pattern: str, expected: list):
|
|||||||
def test_repeats(pattern: str, expected: list):
|
def test_repeats(pattern: str, expected: list):
|
||||||
assert zparse(pattern).notes() == expected
|
assert zparse(pattern).notes() == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"pattern,expected",
|
||||||
|
[
|
||||||
|
("0 [0 2] 0", [0.25, 0.125, 0.125, 0.25, 0.25, 0.125, 0.125, 0.25, 0.25, 0.125, 0.125, 0.25]),
|
||||||
|
("w 0 [0 [1 [2 3]] 0] 9", [1.0, 0.3333333333333333, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333, 0.3333333333333333, 1.0, 1.0, 0.3333333333333333, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333]),
|
||||||
|
("1.0 0 [[2 3] [3 5]] 4", [1.0, 0.25, 0.25, 0.25, 0.25, 1.0, 1.0, 0.25, 0.25, 0.25, 0.25, 1.0]),
|
||||||
|
("2.0 0 [1[2[3[4 5]6]7]8] 9", [2.0, 0.6666666666666666, 0.2222222222222222, 0.07407407407407407, 0.037037037037037035, 0.037037037037037035, 0.07407407407407407, 0.2222222222222222, 0.6666666666666666, 2.0, 2.0, 0.6666666666666666])
|
||||||
|
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def test_looping_durations(pattern: str, expected: list):
|
||||||
|
parsed = zparse(pattern)
|
||||||
|
durations = []
|
||||||
|
for i in range(12):
|
||||||
|
durations.append(parsed[i].duration)
|
||||||
|
assert durations == expected
|
||||||
|
|||||||
@ -658,14 +658,17 @@ class RepeatedListSequence(Sequence):
|
|||||||
class Subdivision(Sequence):
|
class Subdivision(Sequence):
|
||||||
"""Class for subdivisions"""
|
"""Class for subdivisions"""
|
||||||
|
|
||||||
|
full_duration: float = field(default=None, init=False)
|
||||||
|
|
||||||
def evaluate_values(self, options):
|
def evaluate_values(self, options):
|
||||||
"""Evaluate values and store to evaluated_values"""
|
"""Evaluate values and store to evaluated_values"""
|
||||||
|
self.full_duration = options["duration"]
|
||||||
self.evaluated_values = list(self.evaluate_tree(options))
|
self.evaluated_values = list(self.evaluate_tree(options))
|
||||||
|
|
||||||
def evaluate_durations(self, duration=None):
|
def evaluate_durations(self, duration=None):
|
||||||
"""Calculate new durations by dividing with the number of items in the sequence"""
|
"""Calculate new durations by dividing with the number of items in the sequence"""
|
||||||
if duration is None:
|
if duration is None:
|
||||||
duration = self.evaluated_values[0].duration
|
duration = self.full_duration
|
||||||
new_d = duration / len(self.evaluated_values)
|
new_d = duration / len(self.evaluated_values)
|
||||||
for item in self.evaluated_values:
|
for item in self.evaluated_values:
|
||||||
if isinstance(item, Subdivision):
|
if isinstance(item, Subdivision):
|
||||||
|
|||||||
Reference in New Issue
Block a user