+@rule ((2, 19, 28), r"c:5.x, c:5^x, c:sus -> c:3.5.x, c:3.5^x, c:5")
+def conv (str):
+ str = re.sub (r":5([.^][1-9])", r":3.5\1", str)
+ # row back for self-defeating forms
+ str = re.sub (r":3\.5((?:\.[0-9]+)*\^(?:[0-9]+\.)*)3\.", r":5\1", str)
+ str = re.sub (r":3\.5((?:\.[0-9]+)*\^?:[0-9]+(?:\.[0-9]+)*)\.3(?![.0-9])", r":5\1", str)
+ str = re.sub (r":3\.5((?:\.[0-9]+)*)\^3(?=\s|\})", r":5\1", str)
+ str = re.sub (r":sus(?=\s|\})", ":5", str)
+ str = re.sub (r":1\.5(?=\s|[.^}])", r":5", str)
+ return str
+
+@rule ((2, 19, 29), r"partcombine*Once -> \once \partcombine*")
+def conv(str):
+ str = re.sub (r"(\\partcombine(?:Apart|Chords|Unisono|SoloII?|Automatic))Once\b",
+ r"\\once \1", str)
+ str = re.sub (r"(\\partcombineForce" + matcharg + r")\s*##f(\s)",
+ r"\1\2", str)
+ str = re.sub (r"(\\partcombineForce" + matcharg + r")\s*##t(\s)",
+ r"\\once \1\2", str)
+ return str
+
+@rule ((2, 19, 32), r"whiteout-box -> whiteout")
+def conv(str):
+ str = re.sub (r"\\whiteout-box(?![a-z_-])", r"\\whiteout", str)
+ str = re.sub (r"\b\.whiteout-box(?![a-z_-])\b", r".whiteout", str)
+ str = re.sub (r"#'whiteout-box(?![a-z_-])\b", r"#'whiteout", str)
+ return str
+
+@rule ((2, 19, 40), r"\time #'(2 3) ... -> \time 2,3 ...")
+def conv (str):
+ def repl (m):
+ return m.group(1) + re.sub (r"\s+", ",", m.group (2))
+
+ str = re.sub (r"(beatStructure\s*=\s*)#'\(([0-9]+(?:\s+[0-9]+)+)\)",
+ repl, str)
+
+ str = re.sub (r"(\\time\s*)#'\(([0-9]+(?:\s+[0-9]+)+)\)", repl, str)
+ def repl (m):
+ subst = re.sub (r"\s+", ",", m.group (1))
+ return subst + (4 + len (m.group (1)) - len (subst)) * " " + m.group (2)
+
+ str = re.sub (r"#'\(([0-9]+(?:\s+[0-9]+)+)\)(\s+%\s*beatStructure)",
+ repl, str)
+ return str
+