diff --git a/ziffers/classes.py b/ziffers/classes.py index d5852a5..3ba4d4f 100644 --- a/ziffers/classes.py +++ b/ziffers/classes.py @@ -79,7 +79,7 @@ class Pitch(Event): pitch_class: int = field(default=None) octave: int = field(default=None) - modifier: int = field(default=None) + modifier: int = field(default=0) note: int = field(default=None) def set_note(self, note: int): @@ -228,7 +228,7 @@ class Ziffers(Sequence): key = self.options["key"] scale = self.options["scale"] if isinstance(self.current, (Pitch, RandomPitch)): - note = note_from_pc(key,self.current.pitch_class,scale) + note = note_from_pc(root=key,pitch_class=self.current.pitch_class,intervals=scale,modifier=self.current.modifier) self.current.set_note(note) elif isinstance(self.current,Chord): pcs = self.current.pitch_classes @@ -341,18 +341,14 @@ class Cyclic(Sequence): wrap_start: str = field(default="<", repr=False) wrap_end: str = field(default=">", repr=False) - def __post_init__(self): - super().__post_init__() - # TODO: Do spaced need to be filtered out? - self.values = [val for val in self.values if isinstance(val, Whitespace)] + def __next__(self): + yield self.values[self.cycle%len(self.cycle)] + self.cycle+=1 + raise StopIteration def value(self): """Get the value for the current cycle""" - return self.values[self.cycle] - - def next_cycle(self, cycle: int): - """Evaluate next cycle""" - self.cycle = self.cycle + 1 + return self.values[self.cycle%len(self.cycle)] @dataclass diff --git a/ziffers/mapper.py b/ziffers/mapper.py index cf9da26..40953d8 100644 --- a/ziffers/mapper.py +++ b/ziffers/mapper.py @@ -101,10 +101,15 @@ class ZiffersTransformer(Transformer): return {"octave": int(value), "text": items[0].value} def octave(self, items): - """Return octave info""" + """Return octaves ^ and _""" value = sum(1 if char == "^" else -1 for char in items[0].value) return {"octave": value, "text": items[0].value} + def modifier(self, items): + """Return modifiers # and b""" + value = 1 if items[0].value == "#" else -1 + return {"modifier": value} + def chord(self, items): """Parses chord""" return Chord(pitch_classes=items, text="".join([val.text for val in items])) diff --git a/ziffers/ziffers.lark b/ziffers/ziffers.lark index a2de728..e2c0f28 100644 --- a/ziffers/ziffers.lark +++ b/ziffers/ziffers.lark @@ -4,11 +4,12 @@ // Pitch classes pitch_class: prefix* pitch - prefix: (octave | duration_chars | escaped_decimal | escaped_octave) + prefix: (octave | duration_chars | escaped_decimal | escaped_octave | modifier) pitch: /-?[0-9TE]/ escaped_decimal: "<" decimal ">" escaped_octave: /<-?[0-9]>/ octave: /[_^]+/ + modifier: /[#b]/ // Chords chord: pitch_class pitch_class+