7
7
8
8
class GraaParser ():
9
9
# command constants for dispatcher
10
- EDGE = "edge"
11
- OVERLAY_NODE = "ol_node"
12
- NORMAL_NODE = "n_node"
10
+ EDGE = "edge"
11
+ NODE = "node"
13
12
# some literals
14
13
PARAM_DIVIDER = Suppress (Literal (":" ))
15
14
LPAREN = Suppress (Literal ("<" ))
@@ -30,27 +29,29 @@ class GraaParser():
30
29
lvar = Word ("$." + alphanums )
31
30
graph_id = Word (alphas )
32
31
node_id = graph_id + Word (nums ).setParseAction (lambda t : GraaParser .typify (t [0 ]))
33
- node_type = Word (alphanums )
34
- func_id = Word (alphanums )
35
32
# function parsing
36
33
func = Forward ()
37
34
param = gvar ^ ivar ^ pitch ^ lvar .setParseAction (lambda t : GraaParser .typify (t [0 ])) ^ func
38
35
func_param = ZeroOrMore (param + Optional (PARAM_DIVIDER ))
39
- func << func_id + LPAREN + func_param + RPAREN
36
+ func << Word ( alphanums ) + LPAREN + func_param + RPAREN
40
37
func .setParseAction (lambda t : GraaParser .parse_func (t .asList ()))
41
38
assign = lvar + Suppress ("=" ) + param
42
39
assign .setParseAction (lambda t : GraaParser .parse_assign (t .asList ()))
43
40
# node definitions
44
- ol_node_def = node_id + Suppress ("|" ) + OneOrMore ((assign + Optional (PARAM_DIVIDER )) ^ Literal ("nil" ) ^ Literal ("mute" ) ^ Literal ("unmute" ))
45
- ol_node_def .setParseAction (lambda t : GraaParser .parse_ol_node (t ))
46
- node_def = node_id + Suppress ("|" ) + node_type + Suppress ("~" ) + Group (ZeroOrMore ((gvar ^ ivar ^ pitch ^ lvar ^ assign ) + Optional (PARAM_DIVIDER )))
41
+ sound_func = Word (alphas ) + "~" + Group (ZeroOrMore ((gvar ^ ivar ^ pitch ^ lvar ^ assign ) + Optional (PARAM_DIVIDER )))
42
+ mod_func = assign + Optional (PARAM_DIVIDER )
43
+ ctrl_func = Word (alphas ) + "#" + Group (ZeroOrMore ((gvar ^ ivar ^ pitch ^ lvar ^ assign ) + Optional (PARAM_DIVIDER )))
44
+ slot = Suppress ("|" ) + Group (sound_func ^ mod_func ^ ctrl_func )
45
+ node_def = node_id + OneOrMore (slot )
47
46
node_def .setParseAction (lambda t : GraaParser .parse_node (t ))
48
- #edge definitions
49
- transition = Group ((Literal ("nil" ) ^ param ) + Optional (PARAM_DIVIDER + param ))
50
- edge_def = node_id + Optional (Suppress ("-" ) + transition ) + Suppress ("->" ) + node_id
47
+ #edge definitions
48
+ trans_dur = Group ((param ^ Literal ("nil" )) + Optional (Suppress ("|" ) + param ))
49
+ trans_prob = Group (Literal ("%" ) + (param ^ Literal ("nil" )) + Optional (Suppress ("|" ) + param ))
50
+ transition = Suppress ("--" ) + Group (Optional (trans_dur ) + Optional (trans_prob )) + Suppress ("-->" )
51
+ edge_def = node_id + (transition ^ Suppress ("-->" )) + node_id
51
52
edge_def .setParseAction (lambda t : GraaParser .parse_edge (t ))
52
53
# line definition
53
- line = node_def ^ edge_def ^ ol_node_def
54
+ line = node_def ^ edge_def
54
55
line .setParseAction (lambda t : t .asList ())
55
56
# convert string representation to actual (typed) value
56
57
def typify (arg ):
@@ -74,7 +75,7 @@ def parse_ivar(arg):
74
75
return getattr (__main__ , arg [0 ][0 ])
75
76
def parse_func (arg ):
76
77
#print(arg)
77
- return Func (arg [0 ], arg [1 :], {})
78
+ return Func ("misc" , arg [0 ], arg [1 :], {})
78
79
def parse_assign (arg ):
79
80
return {arg [0 ] : arg [1 ]}
80
81
def parse_pitch (arg ):
@@ -91,56 +92,57 @@ def parse_duration(arg):
91
92
pass
92
93
#tbd
93
94
def parse_node (arg ):
95
+ print ("NODE: " + str (arg ))
94
96
graph_id = arg [0 ]
95
97
node_id = arg [1 ]
96
- node_params = Func ( arg [ 2 ], [], {})
97
- for param in arg [3 ]:
98
- if isinstance (param , dict ):
99
- node_params .kwargs . update (param )
98
+ node_params = []
99
+ for param in arg [2 :]:
100
+ if isinstance (param [ 0 ] , dict ):
101
+ node_params .append (param [ 0 ] )
100
102
else :
101
- node_params .args .append (param )
103
+ kwargs = {}
104
+ args = []
105
+ for arg in param [2 ]:
106
+ if type (arg ) is dict :
107
+ kwargs .update (arg )
108
+ else :
109
+ args .append (arg )
110
+ node_params .append (Func (param [1 ], param [0 ], args , kwargs ))
102
111
# create and return node
103
- return (GraaParser .NORMAL_NODE , graph_id , Node (graph_id , node_id , node_params ))
104
- def parse_ol_node (arg ):
105
- #print(arg)
106
- graph_id = arg [0 ]
107
- node_id = arg [1 ]
108
- node_params = {}
109
- for param in arg [2 :]:
110
- if type (param ) is str :
111
- node_params = param
112
- else :
113
- node_params .update (param )
114
- node = Node (graph_id , node_id , node_params )
115
- return (GraaParser .OVERLAY_NODE , graph_id , node )
112
+ return (GraaParser .NODE , graph_id , Node (graph_id , node_id , node_params ))
116
113
def parse_edge (arg ):
117
- # print(arg)
114
+ print ("EDGE: " + str ( arg ) )
118
115
graph_id = arg [0 ]
119
116
source_node_id = arg [1 ]
120
117
destination_node_id = arg [- 1 ]
121
- edge = None
118
+ edge = Edge ( graph_id , source_node_id , destination_node_id )
122
119
if (len (arg ) == 5 ):
123
- transition = arg [2 ]
124
- edge = Edge (graph_id , source_node_id , destination_node_id , transition [0 ])
125
- if len (transition ) == 2 :
126
- edge .prob = transition [1 ]
127
- else :
128
- edge = Edge (graph_id , source_node_id , destination_node_id , None )
120
+ transition = arg [2 ]
121
+ for elem in transition :
122
+ if elem [0 ] == "%" :
123
+ if elem [1 ] != "nil" :
124
+ edge .prob = elem [1 ]
125
+ if len (elem ) == 3 :
126
+ edge .prob_mod = elem [2 ]
127
+ else :
128
+ if elem [0 ] != "nil" :
129
+ edge .dur = elem [0 ]
130
+ if len (elem ) == 2 :
131
+ edge .dur_mod = elem [1 ]
129
132
return (GraaParser .EDGE , graph_id , edge , source_node_id )
130
133
def parse (arg ):
131
134
return GraaParser .line .parseString (arg )
132
135
133
136
134
137
if __name__ == "__main__" :
135
- #print(GraaParser.param.parseString("4"))
136
- #print(GraaParser.func.parseString("add<add<$3:4>:%as:4>"))
137
- #print(GraaParser.assign.parseString("$3=add<add<$3:4>:%as:>"))
138
- #print(GraaParser.assign.parseString("$step=5"))
139
- #print(GraaParser.node_def.parseString("d1|dirt~0:db:1:$gain=5"))
140
- #print(GraaParser.ol_node_def.parseString("d1|$3=add<$3:1>:$2=add<$2:1>"))
141
- #print("STRING: d1-add<$dur:add<1:%as>:4>:100->d1")
142
- #print(GraaParser.edge_def.parseString("d1-add<$dur:add<1:%as>:4>:100->d1"))
143
- #print(GraaParser.edge_def.parseString("d1->d1"))
144
- #print(GraaParser.line.parseString("d1-%t:100->d1"))
145
- #print(GraaParser.line.parseString("d1|rebuzz~150:100:245:$gain=10"))
146
- print (GraaParser .func .parseString ("bounds<brownian<60:1>:500:300>" ))
138
+ #print(GraaParser.edge_def.parseString("guu1-->guu2"))
139
+ #print(GraaParser.edge_def.parseString("guu1--500-->guu2"))
140
+ #print(GraaParser.edge_def.parseString("guu1--%50-->guu2"))
141
+ #print(GraaParser.edge_def.parseString("guu1--500%25-->guu2"))
142
+ #print(GraaParser.edge_def.parseString("guu1--512|add<dur:25>-->guu2"))
143
+ #print(GraaParser.edge_def.parseString("guu1--512|add<dur:25>%25-->guu2"))
144
+ #print(GraaParser.edge_def.parseString("guu1--%25|add<prob:10>-->guu2"))
145
+ #print(GraaParser.edge_def.parseString("guu1--512|add<dur:25>%25|add<prob:10>-->guu2"))
146
+ print (GraaParser .edge_def .parseString ("guu1--nil|add<dur:25>%25|add<prob:10>-->guu2" ))
147
+ print (GraaParser .edge_def .parseString ("guu1--512|add<dur:25>%nil|add<prob:10>-->guu2" ))
148
+ #print(GraaParser.node_def.parseString("guu1|disk~c4:500:50:gain=0.05:acc=0.5|play#guu:gaa|$3=add<$3:4>"))
0 commit comments