From 1710d2f67b91f130ac46d41123202cefa7f1f6e4 Mon Sep 17 00:00:00 2001 From: Miika Alonen Date: Sun, 5 Feb 2023 14:12:22 +0200 Subject: [PATCH] Refactored duration changes Fixes cyclic duration changes --- ziffers/mapper.py | 22 ++++++++++++++++++++-- ziffers/ziffers.lark | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ziffers/mapper.py b/ziffers/mapper.py index 5e4370a..e4bfcfb 100644 --- a/ziffers/mapper.py +++ b/ziffers/mapper.py @@ -59,8 +59,26 @@ class ZiffersTransformer(Transformer): return Chord(pcs=s,text="".join([val.text for val in s])) def dur_change(self,s): - duration = s[0] - return [DurationChange(dur=duration["dur"], text=duration["text"]),s[1]] + durs = s[0] + return DurationChange(dur=durs[1], text=durs[0]) + + def char_change(self,s): + chars = "" + durs = 0.0 + for (dchar,dots) in s: + val = default_durs[dchar] + if(dots>0): + val = val * (2.0-(1.0/(2*dots))) + chars = chars + (dchar+"."*dots) + durs = durs + val + return [chars,durs] + + def dchar_not_prefix(self,s): + dur = s[0].split(".",1) + dots = 0 + if len(dur)>1: + dots = len(dur[1])+1 + return [dur[0],dots] def escaped_decimal(self,s): val = s[0] diff --git a/ziffers/ziffers.lark b/ziffers/ziffers.lark index 49f5558..4862661 100644 --- a/ziffers/ziffers.lark +++ b/ziffers/ziffers.lark @@ -52,7 +52,9 @@ // Control characters modifying future events oct_mod: octave WS oct_change: escaped_octave WS - dur_change: (duration_chars | decimal) WS + dur_change: (decimal | char_change) + char_change: dchar_not_prefix+ + dchar_not_prefix: /([mklpdcwyhnqaefsxtgujzo](\.)*)(?!\d)/ // Generative rules random_integer: /\(-?[0-9]+,-?[0-9]+\)/