Refactored duration changes

Fixes cyclic duration changes
This commit is contained in:
2023-02-05 14:12:22 +02:00
parent 26d3825ffb
commit 1710d2f67b
2 changed files with 23 additions and 3 deletions

View File

@ -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]

View File

@ -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]+\)/