Added support for mote item in cyclic

This commit is contained in:
2023-02-19 12:45:50 +02:00
parent f417f0282e
commit c7a905f5a0
2 changed files with 26 additions and 11 deletions

View File

@ -41,6 +41,18 @@ class Item(Meta):
text: str = field(default=None) text: str = field(default=None)
def get_updated_item(self, options: dict):
"""Get updated item with replaced options
Args:
options (dict): Options as a dict
Returns:
Item: Returns updated item
"""
self.replace_options(options)
return self
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Whitespace: class Whitespace:
@ -91,10 +103,12 @@ class Event(Item):
duration: float = field(default=None) duration: float = field(default=None)
@dataclass @dataclass
class Rest(Event): class Rest(Event):
"""Class for rests""" """Class for rests"""
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Pitch(Event): class Pitch(Event):
"""Class for pitch in time""" """Class for pitch in time"""
@ -426,7 +440,7 @@ class Sequence(Meta):
text=pitch_text, text=pitch_text,
pitch_classes=pitch_classes, pitch_classes=pitch_classes,
notes=chord_notes, notes=chord_notes,
kwargs=options kwargs=options,
) )
return chord return chord
@ -448,6 +462,7 @@ class Sequence(Meta):
self, values=[item for item in self.values if isinstance(item, keep)] self, values=[item for item in self.values if isinstance(item, keep)]
) )
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Ziffers(Sequence): class Ziffers(Sequence):
"""Main class for holding options and the current state""" """Main class for holding options and the current state"""
@ -527,7 +542,7 @@ class Ziffers(Sequence):
def durations(self) -> list[float]: def durations(self) -> list[float]:
"""Return list of pitch durations as floats""" """Return list of pitch durations as floats"""
return [val.duration for val in self.evaluated_values if isinstance(val, Pitch)] return [val.duration for val in self.evaluated_values if isinstance(val, Event)]
def pairs(self) -> list[tuple]: def pairs(self) -> list[tuple]:
"""Return list of pitches and durations""" """Return list of pitches and durations"""
@ -619,13 +634,11 @@ class Subdivision(Sequence):
elif isinstance(item, Modification): elif isinstance(item, Modification):
self.local_options = self.local_options | item.as_options() self.local_options = self.local_options | item.as_options()
elif isinstance(item, Rest): elif isinstance(item, Rest):
yield item yield item.get_updated_item(self.local_options)
elif isinstance(item, (Event, RandomInteger)): elif isinstance(item, (Event, RandomInteger)):
yield Pitch(pitch_class=item.get_value(), kwargs=self.local_options) yield Pitch(pitch_class=item.get_value(), kwargs=self.local_options)
@dataclass(kw_only=True) @dataclass(kw_only=True)
class Cyclic(Item): class Cyclic(Item):
"""Class for cyclic sequences""" """Class for cyclic sequences"""
@ -774,7 +787,6 @@ class RepeatedSequence(Sequence):
self.local_options = DEFAULT_OPTIONS self.local_options = DEFAULT_OPTIONS
self.evaluated_values = list(self.evaluate()) self.evaluated_values = list(self.evaluate())
def evaluate(self): def evaluate(self):
"""Evaluate repeated sequence partially. Leaves Cycles intact.""" """Evaluate repeated sequence partially. Leaves Cycles intact."""
for item in self.values: for item in self.values:
@ -785,6 +797,9 @@ class RepeatedSequence(Sequence):
elif isinstance(item, Modification): elif isinstance(item, Modification):
self.local_options = self.local_options | item.as_options() self.local_options = self.local_options | item.as_options()
elif isinstance(item, Rest): elif isinstance(item, Rest):
yield item yield item.get_updated_item(self.local_options)
elif isinstance(item, (Event, RandomInteger)): elif isinstance(item, (Event, RandomInteger)):
yield Pitch(pitch_class=item.get_value(), kwargs=self.local_options) new_pitch = Pitch(
pitch_class=item.get_value(), kwargs=self.local_options
)
yield new_pitch

View File

@ -56,7 +56,7 @@
// Subdivision // Subdivision
subdivision: "[" subitems "]" subdivision: "[" subitems "]"
subitems: (pitch_class | WS | chord | cycle | subdivision | list | list_op)* subitems: (pitch_class | random_integer | random_pitch | rest | oct_mod | oct_change | WS | chord | named_roman | cycle | subdivision | list | list_op)*
// Control characters modifying future events // Control characters modifying future events
oct_mod: octave WS oct_mod: octave WS