From 1acddb069f551aa3dda9c07476b116aa0d526a4c Mon Sep 17 00:00:00 2001 From: Miika Alonen Date: Tue, 31 Jan 2023 23:00:31 +0200 Subject: [PATCH] Trying out larl parser --- LICENSE.txt | 2 - pyproject.toml | 4 +- ziffers/__init__.py | 4 + .../__pycache__/ZiffersData.cpython-311.pyc | Bin 0 -> 4933 bytes .../ZiffersTransformer.cpython-311.pyc | Bin 0 -> 8279 bytes ziffers/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 311 bytes ziffers/__pycache__/classes.cpython-311.pyc | Bin 0 -> 4954 bytes ziffers/__pycache__/common.cpython-311.pyc | Bin 0 -> 603 bytes ziffers/__pycache__/defaults.cpython-311.pyc | Bin 0 -> 1274 bytes ziffers/__pycache__/mapper.cpython-311.pyc | Bin 0 -> 8266 bytes ziffers/__pycache__/parser.cpython-311.pyc | Bin 0 -> 1025 bytes .../__pycache__/transformer.cpython-311.pyc | Bin 0 -> 8285 bytes ziffers/classes.py | 68 +++++++++++++ ziffers/common.py | 2 + ziffers/defaults.py | 37 +++++++ ziffers/ebnf.py | 40 -------- ziffers/mapper.py | 90 ++++++++++++++++++ ziffers/parser.py | 68 ++++--------- ziffers/ziffers.lark | 23 +++++ 19 files changed, 242 insertions(+), 96 deletions(-) create mode 100644 ziffers/__pycache__/ZiffersData.cpython-311.pyc create mode 100644 ziffers/__pycache__/ZiffersTransformer.cpython-311.pyc create mode 100644 ziffers/__pycache__/__init__.cpython-311.pyc create mode 100644 ziffers/__pycache__/classes.cpython-311.pyc create mode 100644 ziffers/__pycache__/common.cpython-311.pyc create mode 100644 ziffers/__pycache__/defaults.cpython-311.pyc create mode 100644 ziffers/__pycache__/mapper.cpython-311.pyc create mode 100644 ziffers/__pycache__/parser.cpython-311.pyc create mode 100644 ziffers/__pycache__/transformer.cpython-311.pyc create mode 100644 ziffers/classes.py create mode 100644 ziffers/common.py create mode 100644 ziffers/defaults.py delete mode 100644 ziffers/ebnf.py create mode 100644 ziffers/mapper.py create mode 100644 ziffers/ziffers.lark diff --git a/LICENSE.txt b/LICENSE.txt index 6bbcd4e..b3dc361 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,5 +1,3 @@ MIT License -Copyright (c) [2022] [Raphaël Forment] - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/pyproject.toml b/pyproject.toml index 83e72ab..40a5ec2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "Port of the Ziffers numerical notation for Python" authors = [ {name = "Raphaël Forment", email="raphael.forment@gmail.com"}, - {email = "raphael.forment@gmail.com"} + {name = "Miika Alonen" email = "amiika@gmail.com"} ] license = {file = "LICENSE.txt"} readme = "README.md" @@ -17,7 +17,7 @@ classifiers = [ ] dependencies = [ - "parsimonious>=0.10.0", + "lark>=1.1.5", "rich>=12.6.0" ] diff --git a/ziffers/__init__.py b/ziffers/__init__.py index bd753cc..ebecbbc 100644 --- a/ziffers/__init__.py +++ b/ziffers/__init__.py @@ -1 +1,5 @@ from .parser import * +from .mapper import * +from .classes import * +from .common import * +from .defaults import * diff --git a/ziffers/__pycache__/ZiffersData.cpython-311.pyc b/ziffers/__pycache__/ZiffersData.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95e428b8893defee120eb417289bfe1c1b7cdfc2 GIT binary patch literal 4933 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 literal 0 HcmV?d00001 diff --git a/ziffers/__pycache__/__init__.cpython-311.pyc b/ziffers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b976db42000e000500ba8ca120b7da4c10b5d22 GIT binary patch literal 311 zcmZ3^%ge<81m^WOlgohgV-N=hn4pZ$dO*f>h7^Vr#vFza2+atknV>W?lx6|aOu-DA z%r6;%nlu@2F>3i~vfg4VNGvK&ExN^)n^;f)q}h{m5{rvdi*K4BO~Jt2GI*Jgvu7XzyL+4;^G$=P*4#l Fya1dWR^R{t literal 0 HcmV?d00001 diff --git a/ziffers/__pycache__/classes.cpython-311.pyc b/ziffers/__pycache__/classes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cda06edfc2a17c995b7f9136deafa43bf491bf6a GIT binary patch literal 4954 zcmb_f%Wu?17$2{_n|)?UvUvc3LV?1zB|>VY5)`Fs2`vwGsTz>l6_w@M29|DigYD%J zrII6YShbN#PxR0OCt5`Rn505#>Jw5=y#<96r+&W~ui3Rt7ST@Z-;QT~-+Ygm`DXHK zp^#-%esKTNFDQ)tjgL-A`IW7u1Y`G@!3?R+7Nn}Qkf##^)5Oj6;ii0Umbf`HwXF>UJ~vO? zLLYA0=MECL*oT|(xjTqE)Q6k(xx>UA**3a4pIIX2XrCzLeeM`>$NO*#K6iq+JI(yI z5gYWmyNFxpGj1nhyNNs5hg&rE%(L>|f3Q@_2`^)4j;7Z&+xAkLZPau}_g4}B>8z=( zUG#a6nXD=qteUvUOxaWnX@**j1dS(q%4epdd5UA+aw_GdmsZt=wqUBNmsQn;rqQaS zo>$fDEv@eN$hKp7MOD=rji#eHwPwRs)rV{gnxB85pSX00yj*W;j+IA40l+mDQ5)*O09B%PW(M7}?%5T3-Lpap0b&k~H%w1%>Q3ch#7eo=h_`VRHUe_-Hs;;a?&%eJ-P6KGaN}*eWP~+j4q0q>RopyuQn~C z;>nA;T^i;jy{fxuE;0Fv0D(xE>}ht^AnAD0fdmDNm}{`kcAc%qOD_v9>9=x!+8r{8G7 z?Qof03+$g`y}mu5o<~71(rU%)4H=XmcWhxb-(y#3xUVzcNz2l;K-*7=)$F{;JY|W8 zg5r~yI_AkV5jJAJPlV%nb_N?mZ!Rp(E*T#xm21sf!zvTkdKXeJX2L>{mr8LukAjI6>avaE(2qC2zbVH3ZSMDT zR9hcE{+O^h{kS;2mYx=>^5JcNfaLjsA~p@C$5U`a;_(pM365|(!b$oFIsn*u_E!XM z*WZ);j=Q6)=hl>Qde)Wkjogqsx3Qz-&b1G$DJ6Q=mC|NHN*>u{0Vq=P1U|zcQV4YE z^acg9jIsp_`tL{o8ke3oueZ#GZt{><9!3t~P*g&R9GlPr9D`=$lkMCV{tNpd^gr02 zn{Rz%)Na&l%7(%PYnnz5PtOe60PmxMGgMfCrg$s*Bx0F1n&PES-q!0i-NFX(k~)2u zm1s8p5b7oXaVN! zS`ji~XgiQ9LaNv$Rov`I6(ALc_60~4AXVs+Dg;tvkP1V44pL)~8tal8^QB~|w8^5- zKJ^r>&j5iGXj$K{5$FoT-9ykd0$n446liH*Y7$amfG%o<)MS^`WZ)NBD8bAgXty9m z77}zxm3*lIi4t}co}%p;AdmrR*tc&2O2Qy!YXX`k0x8fsvlSNLgWNp``?iq^2M&W36fk5!!jUmHC&_wW&==VDMOJ{2`i8R1vLyQjFK=8 zx;}Qe1OvL6DNNZcAlV{uG}D+;7+RTdnV83z&QJx^mB&=Wkj@D5o8L>2DK9~8)nvKF zQc_uvdW$6|v$*6IdsAmI?j3*RMG3&JNvEQn^A$g<57L6T&n{+P7xy?;qki0^1h0+S8 zCFvLC^sdP1U69i|;B=AO{Q?jrr(H-&zrd3I8E7(tpC(fgC;-70u4E|U0kOG(#4iq; p-29Z%oK(9aJ|GwD7DFK812ZEd;|C^2#tg;@E*}^`G=36nBmf3Kgctw- literal 0 HcmV?d00001 diff --git a/ziffers/__pycache__/defaults.cpython-311.pyc b/ziffers/__pycache__/defaults.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c237efa5e17b4122f2fd3c7db4d13f2fca4a19ff GIT binary patch literal 1274 zcmX|;$!il~7{+IsrcK+d-S;(J(j{HerfIq)-934cf=EC@-)uH*nvL3=`X>a7D0uNw zRPf+M@ZiCV=)r>*p#%>_5j=SKpa{~F&zt!sU&xc+`_Au~Fw6^!rCz~#l1) zJm{xd!u1cp6D6ULLh89nRb)U`lMz`%wMY}yA?v9DX(kKON;agO9LPp$LN-$ivX$D9 z?bLznq%LGP^&oqx57|!x=PLeZkcKchX&5;|qsTFGA;)O~IZ0DUH%%jFXcjp~9^^bN zAicDR^wAR1Ps_*^T1Bo=02!opqqufU>S0WK=Kf$wJ&5g< zPYXCH_x50+irjKA;li<$j9`*`1=5Kw{R@=TeJT9~pGZjr3Wm5_xBdhQRdIdz4eeA` zeu3k%a)nB|Qu&TbTCZF}JCc=e;IyoKMI}halC4zUqmtDt z@1R9xqUl1vn=w&mrY?=_xM6r1Th^mr@b@K=K(l6?2qN z8eEWjMY-)#OJ<5h!}(?fo!sH!TeoObJ_)lu{a1Lz9m7eEM6Y}Fhavt4r>%#E7U#N4ddnu~j)g}IgeEz!o@ zuK69zotodp+|B-7(Zk%!{ mRJCDUUJbcmHNb+EBfSzw&&cLUGMCU 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 literal 0 HcmV?d00001 diff --git a/ziffers/__pycache__/parser.cpython-311.pyc b/ziffers/__pycache__/parser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d3b26f0a82683cb8ef0bfd9cd6e88355b7b7ed4 GIT binary patch literal 1025 zcmY*W&1(}u6rW8dn`Ad1Oxm>n zKY0*QCUnkzfwPNrqzfjp1Vs?IpD+_E+$PPWg%up+u$i(%MHEm15lqqt0z!u%Lt2me zAtg()da5HMq)1RHu7fuuB9XK%>S@U44j^?H9iY#dgA~LdLsIg3_6<@Bq^L`+1kcej z+!9EBeuJe8bMgmvmorvoiZJUllKmK#>1gI|hAx|F5(?|03KJLjgeR;;m zGiPvuSVmPX&9GIqlU==0UcFhqwYIiYDKSiqdXw_;nP_Q_14~Lfux8VELitDYjnWns z!yXO8B&r(hlh_{1J*ApuX%wdQnk*eg47VL(vr%REK`Z}uP7BZ{0L=l}ngz{h5ptgp z9pgtOP=7Lat+u{ll6&+rgnVW0H&CZZK@bLL!jJO+jr$P~&_zGa19ZWU^GR`R+uM2Y zcI(|%zj&pa8%Ps-Q$6WgH+@pNv@`yGa&PhD?JtX87ku>@a8Gsns_U1$Udij1yl&wX z3&Pb?bgo2%bK9MxxM(0>7q CJqHB< literal 0 HcmV?d00001 diff --git a/ziffers/__pycache__/transformer.cpython-311.pyc b/ziffers/__pycache__/transformer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3dc3f64432b31af5f58305bd38fbdb55d02d74 GIT binary patch literal 8285 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 C?f#np literal 0 HcmV?d00001 diff --git a/ziffers/classes.py b/ziffers/classes.py new file mode 100644 index 0000000..7d82b78 --- /dev/null +++ b/ziffers/classes.py @@ -0,0 +1,68 @@ +from dataclasses import dataclass, asdict + +@dataclass +class Meta: + text: str + +@dataclass +class Duration(Meta): + dur: float + +@dataclass +class Octave(Meta): + oct: int + +@dataclass +class Event(Meta): + dur: float = None + +@dataclass +class Pitch(Event): + pc: int = None + dur: float = None + oct: int = None + +@dataclass +class RandomPitch(Event): + pc: int = None + + +@dataclass +class Chord(Event): + pcs: list[Pitch] = None + +@dataclass +class Function(Event): + run: str = None + +@dataclass +class Ziffers: + values: list[Event] + dict = asdict + text: str = None + def __post_init__(self): + self.text = self.collect_text() + def collect_text(self): + return "".join([val.text for val in self.values]) + +@dataclass +class Sequence(Meta): + values: list[Event] + +@dataclass +class Subdivision(Meta): + values: list[Event] + +@dataclass +class Cyclic(Sequence): + cycle: int = 0 + +@dataclass +class RandomPitch(Meta): + min: int + max: int + +@dataclass +class Range(Meta): + start: int + end: int \ No newline at end of file diff --git a/ziffers/common.py b/ziffers/common.py new file mode 100644 index 0000000..3996faf --- /dev/null +++ b/ziffers/common.py @@ -0,0 +1,2 @@ +def flatten(arr) -> list: + return flatten(arr[0]) + (flatten(arr[1:]) if len(arr) > 1 else []) if type(arr) is list else [arr] \ No newline at end of file diff --git a/ziffers/defaults.py b/ziffers/defaults.py new file mode 100644 index 0000000..56f598b --- /dev/null +++ b/ziffers/defaults.py @@ -0,0 +1,37 @@ +default_durs = { + 'm': 8.0, # 15360/1920 + 'k': 10240/1920, # ~5.333 + 'l': 4.0, # 7680/1920 + 'd.': 3.0, # + 'p': 5120/1920, # ~2.666 + 'd': 2.0, # 3840/1920 + 'w.': 1.5, # 2280/1920 + 'c': 2560/1920, # ~1.333 + 'w': 1.0, # 1920/1920 + 'h..': 0.875, # 1680/1920 + 'h.': 0.75, # 1440/1920 + 'y': 1280/1920, # ~0.666 + 'h': 0.5, # 960/1920 - 1/2 + 'q..': 840/1920, # ~0.4375 + 'q.': 0.375, # 720/1920 + 'n': 640/1920, # ~0.333 + 'q': 0.25, # 480/1920 - 1/4 + 'e..': 420/1920, # = 0.218 + 'e.': 0.1875, # 360/1920 + 'a': 320/1920, # 0.167 - 1/8 + 'e': 0.125, # 240/1920 + 's..': 210/1920, # ~0.10937 + 's.': 180/1920, # ~0.0937 + 'f': 160/1920, # ~0.083 - 1/16 + 's': 0.0625, # 120/1920 + 't..': 105/1920, # ~0.0546 + 't.': 90/1920, # ~0.0468 + 'x': 80/1920, # ~0.042 - 1/32 + 't': 60/1920, # ~0.031 + 'u.': 45/1920, # ~0.023 + 'g': 40/1920, # ~0.021 - 1/64 + 'u': 30/1920, # ~0.016 + 'j': 15/1920, # ~0.0078 - 1/128 + 'o': 8/1920, # ~0.00416 + 'z': 0.0 # 0 + } diff --git a/ziffers/ebnf.py b/ziffers/ebnf.py deleted file mode 100644 index f2a67a3..0000000 --- a/ziffers/ebnf.py +++ /dev/null @@ -1,40 +0,0 @@ - -ebnf = r""" - ziffers = (bar / octup / octdown / subdiv / escape / rhythm / float / chord / pc / ws?)+ - - escape = (lt (chord / pc) gt) - subdiv = (lbra ziffers rbra) - - chord = pc{2,} - pc = (neg_pc / pc_basic) - neg_pc = (~r"-" pc) - pc_basic = ~r"[0-9TE]" - - rhythm = ~r"[mklpdcwyhnqaefsxtgujoz]" - - float = ~r"\d+\.\d+" - - lpar = "(" - rpar = ")" - lbra = "[" - rbra = "]" - lcbra = "{" - rcbra = "}" - lt = "<" - gt = ">" - - - octup = "^" - octdown = "_" - - bar = "|" - - plus = "+" - minus = "-" - times = "*" - div = "/" - - emptyline = ws+ - comma = "," - ws = ~"\s*" - """ diff --git a/ziffers/mapper.py b/ziffers/mapper.py new file mode 100644 index 0000000..21f921b --- /dev/null +++ b/ziffers/mapper.py @@ -0,0 +1,90 @@ +from lark import Lark, Transformer +from classes import * +from common import flatten +from defaults import default_durs +from collections import Counter + +class ZiffersTransformer(Transformer): + + def root(self, items): + return Ziffers(flatten(items)) + + def list(self,items): + values = flatten(items[0].values) + return Sequence(values=values,text="("+"".join([val.text for val in values])+")") + + def randompitch(self,s): + val = s[0][1:-1].split(",") + return RandomPitch(min=val[0],max=val[1],text=s[0]) + + def range(self,s): + val = s[0].split("..") + return Range(start=val[0],end=val[1],text=s[0]) + + def cycle(self, items): + values = items[0].values + no_spaces = [val for val in values if type(val)!=Meta] + return Cyclic(values=no_spaces,text="<"+"".join([val.text for val in values])+">") + + def pc(self, s): + if(len(s)>1): + counter = Counter() + for d in s: + counter.update(d) + result = dict(counter) + result["text"] = result["text"][::-1] + return Pitch(**result) + else: + val = s[0] + return Pitch(**val) + + def pitch(self,s): + return {"pc":int(s[0].value),"text":s[0].value} + + def prefix(self,s): + return s[0] + + def oct_change(self,s): + octave = s[0] + return [Octave(oct=octave["oct"],text=octave["text"]),s[1]] + + def octave(self,s): + value = sum([1 if char=='^' else -1 for char in s[0].value]) + return {"oct": value, "text":s[0].value} + + def chord(self,s): + return Chord(pcs=s,text="".join([val.text for val in s])) + + def dur_change(self,s): + duration = s[0] + return [Duration(dur=duration["dur"], text=duration["text"]),s[1]] + + def duration(self,s): + durations = [val[1] for val in s] + characters = "".join([val[0] for val in s]) + return {"dur": sum(durations), "text":characters[::-1]} + + def dur(self,s): + key = s[0] + val = default_durs[key] + dots = len(s)-1 + if(dots>1): + val = val * (2.0-(1.0/(2*dots))) + return [key+"."*dots,val] + + def dot(self,s): + return "." + + def dchar(self,s): + chardur = s[0].value + return chardur + + def WS(self,s): + return Meta(text=s[0]) + + def subdivision(self,items): + values = flatten(items[0]) + return Subdivision(values=values,text="["+"".join([val.text for val in values])+"]") + + def subitems(self,s): + return s \ No newline at end of file diff --git a/ziffers/parser.py b/ziffers/parser.py index d790119..74aad8e 100644 --- a/ziffers/parser.py +++ b/ziffers/parser.py @@ -1,57 +1,21 @@ -from parsimonious.grammar import Grammar -from parsimonious.nodes import NodeVisitor from rich import print -from .ebnf import ebnf +from mapper import * +from pathlib import Path +from lark import Lark -__all__ = ('ZiffersVisitor', 'parse_expression',) +grammar_path = Path(__file__).parent +grammar = grammar_path / "ziffers.lark" -GRAMMAR = Grammar(ebnf) +ziffers_parser = Lark.open(grammar, rel_to=__file__, start='value', parser='lalr', transformer=ZiffersTransformer()) -class ZiffersVisitor(NodeVisitor): - - """ - Visitor for the Ziffers syntax. - """ - - def visit_ziffers(self, node, children): - """ - Top-level visiter. Will traverse and build something out of a complete and valid - Ziffers expression. - """ - print(f"Node: {node}, Children: {children}") - result = {'ziffers': []} - - for i in children: - if i[0] in (None, [], {}) and isinstance(i[0], dict): - continue - try: - result['ziffers'].append(i[0]) - except Exception as e: - print(f"[red]Error in ziffers:[/red] {e}") - pass - return result - - def visit_pc(self, node, children): - return {node.expr_name: node.text} - - def visit_escape(self, node, children): - return {node.expr_name: node.text} - - # def visit_subdiv(self, node, visited_children): - #  key, values = visited_children - #  ret)rn {key, dict(values)} - - def generic_visit(self, node, children): - """ - This method seem to be the generic method to include in any NodeVisitor. - Probably better to keep it as is for the moment. This is appending a whole - lot of garbage to the final expression because I don't really know how to - write it properly... - """ - return children or node - -def parse_expression(expression: str) -> dict: - tree = GRAMMAR.parse(expression) - visitor = ZiffersVisitor() - return visitor.visit(tree) +def parse_expression(expr): + return ziffers_parser.parse(expr) +if __name__ == '__main__': + print(ziffers_parser.parse("[1 [2 3]]")) + #print(ziffers_parser.parse("(1 (1,3) 1..3)")) + #print(ziffers_parser.parse("_^ q _qe^3 qww_4 _123 <1 2>")) + #print(ziffers_parser.parse("q _2 _ 3 ^ 343")) + #print(ziffers_parser.parse("2 qe2 e4").values) + #print(ziffers_parser.parse("q 2 <3 343>")) + #print(ziffers_parser.parse("q (2 <3 343 (3 4)>)")) diff --git a/ziffers/ziffers.lark b/ziffers/ziffers.lark new file mode 100644 index 0000000..6fcd6d5 --- /dev/null +++ b/ziffers/ziffers.lark @@ -0,0 +1,23 @@ + + ?value: root + root: (pc | dur_change | oct_change | WS | chord | cycle | randompitch | range | list | subdivision)* + list: "(" root ")" + randompitch: /[\(][-?0-9][,][-?0-9][\)]/ + range: /[-?0-9]\.\.[-?0-9]/ + cycle: "<" root ">" + pc: prefix* pitch + pitch: /[-?0-9TE]/ + prefix: octave | duration + oct_change: octave WS + octave: /[_^]+/ + chord: pc pc+ + dur_change: duration WS + duration: dur+ + dur: dchar dot* + dchar: /[mklpdcwyhnqaefsxtgujzo]/ + dot: "." + subitems: (pc | WS | chord | cycle | subdivision)* + subdivision: "[" subitems "]" + + %import common.SIGNED_NUMBER + %import common.WS \ No newline at end of file