annotate flax/curvecalc @ 202:97e21bc387fe

loading and saving loading and saving fixed the hanging bug in update()
author drewp
date Wed, 16 Jun 2004 14:22:48 +0000
parents f5d3492981ab
children 3905d3c92aaa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 #!/usr/bin/python
45b12307c695 Initial revision
drewp
parents:
diff changeset
2
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
3 """
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
4 todo: curveview should preserve more objects, for speed maybe
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
5
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
6 """
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 from __future__ import division
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
8 import xmlrpclib,time,socket,sys,textwrap,math,glob
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
9 from bisect import bisect_left,bisect,bisect_right
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 import Tkinter as tk
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 from dispatch import dispatcher
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 from twisted.internet import reactor,tksupport
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 from twisted.web.xmlrpc import Proxy
45b12307c695 Initial revision
drewp
parents:
diff changeset
14
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 sys.path.append("../light8")
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 import dmxclient
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 import Submaster
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 from TLUtility import make_attributes_from_args
45b12307c695 Initial revision
drewp
parents:
diff changeset
19
200
f5d3492981ab moved Zoomcontrol to another file
drewp
parents: 197
diff changeset
20 from zoomcontrol import Zoomcontrol
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
21
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 class Curve:
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 """curve does not know its name. see Curveset"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 points = None # x-sorted list of (x,y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 self.points = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
27
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
28 def load(self,filename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
29 for line in file(filename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
30 self.points.append(tuple([float(a) for a in line.split()]))
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
31 self.points.sort()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
32 dispatcher.send("points changed",sender=self)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
33
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
34 def save(self,filename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
35 f = file(filename,'w')
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
36 for p in self.points:
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
37 f.write("%s %s\n" % p)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
38 f.close()
200
f5d3492981ab moved Zoomcontrol to another file
drewp
parents: 197
diff changeset
39
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 def eval(self,t):
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
41 i = bisect_left(self.points,(t,None))-1
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
42
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 if self.points[i][0]>t:
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 return self.points[i][1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 if i>=len(self.points)-1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 return self.points[i][1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
47
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 p1,p2 = self.points[i],self.points[i+1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 frac = (t-p1[0])/(p2[0]-p1[0])
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 y = p1[1]+(p2[1]-p1[1])*frac
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 return y
45b12307c695 Initial revision
drewp
parents:
diff changeset
52
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 __call__=eval
45b12307c695 Initial revision
drewp
parents:
diff changeset
54
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 class Curveview(tk.Canvas):
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 def __init__(self,master,curve,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 self.curve=curve
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
58 tk.Canvas.__init__(self,master,width=10,height=10,
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
59 relief='sunken',bd=1,
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
60 closeenough=5,**kw)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.selected_points=[] # idx of points being dragged
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 self.update()
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
63 self.bind("<Enter>",self.focus)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
64 dispatcher.connect(self.input_time,"input time")
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
65 dispatcher.connect(self.update,"zoom changed")
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
66 dispatcher.connect(self.update,"points changed",sender=self.curve)
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
67 self.bind("<Configure>",self.update)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 def screen_from_world(self,p):
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
69 start,end = self.zoom
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
70 ht = self.winfo_height()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
71 return (p[0]-start)/(end-start)*self.winfo_width(), (ht-5)-p[1]*(ht-10)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 def world_from_screen(self,x,y):
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
73 start,end = self.zoom
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
74 ht = self.winfo_height()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
75 return x/self.winfo_width()*(end-start)+start, ((ht-5)-y)/(ht-10)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
76
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
77 def input_time(self,val):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
78 t=val
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
79 pts = self.screen_from_world((val,0))+self.screen_from_world((val,1))
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
80 self.delete('timecursor')
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
81 self.create_line(*pts,**dict(width=2,fill='red',tags=('timecursor',)))
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
82 def update(self,*args):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
83
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
84 self.zoom = dispatcher.send("zoom area")[0][1]
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
85 cp = self.curve.points
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
86
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
87 visible_x = (self.world_from_screen(0,0)[0],
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
88 self.world_from_screen(self.winfo_width(),0)[0])
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
89
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
90 visleftidx = max(0,bisect_left(cp,(visible_x[0],None))-1)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
91 visrightidx = min(len(cp)-1,bisect_left(cp,(visible_x[1],None))+1)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
92
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
93 visible_points = cp[visleftidx:visrightidx+1]
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
94
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 self.delete('curve')
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 linepts=[]
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
97 for p in visible_points:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 linepts.extend(self.screen_from_world(p))
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
99 if not linepts:
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
100 return
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
101 line = self.create_line(*linepts,**{'tags':'curve'})
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
102
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
103 # canvas doesnt have keyboard focus, so i can't easily change the
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
104 # cursor when ctrl is pressed
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
105 # def curs(ev):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
106 # print ev.state
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
107 # self.bind("<KeyPress>",curs)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
108 # self.bind("<KeyRelease-Control_L>",lambda ev: curs(0))
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
109 self.tag_bind(line,"<Control-ButtonPress-1>",self.newpoint)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
110
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
111 self.dots = {} # idx : canvas rectangle
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
112
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
113 if len(visible_points)<50:
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
114 for i,p in enumerate(visible_points):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
115 rad=3
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
116 p = self.screen_from_world(p)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
117 dot = self.create_rectangle(p[0]-rad,p[1]-rad,p[0]+rad,p[1]+rad,
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
118 outline='black',fill='blue',
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
119 tags=('curve','point'))
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
120 self.tag_bind(dot,"<ButtonPress-1>",
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
121 lambda ev,i=i: self.dotpress(ev,i))
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
122 self.bind("<Motion>",
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 lambda ev,i=i: self.dotmotion(ev,i))
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
124 self.bind("<ButtonRelease-1>",
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 lambda ev,i=i: self.dotrelease(ev,i))
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
126 self.dots[i]=dot
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
127
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
128 self.highlight_selected_dots()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
129
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
130 def newpoint(self,ev):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
131 cp = self.curve.points
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
132
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
133 p = self.world_from_screen(ev.x,ev.y)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
134 i = bisect(cp,(p[0],None))
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
135
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
136 self.unselect()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
137 cp.insert(i,p)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
138 self.update()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
139
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
140 def highlight_selected_dots(self):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
141 for i,d in self.dots.items():
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
142 if i in self.selected_points:
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
143 self.itemconfigure(d,fill='red')
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
144 else:
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
145 self.itemconfigure(d,fill='blue')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
146
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 def dotpress(self,ev,dotidx):
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 self.selected_points=[dotidx]
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
149 self.highlight_selected_dots()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
150
45b12307c695 Initial revision
drewp
parents:
diff changeset
151 def dotmotion(self,ev,dotidx):
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 cp = self.curve.points
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
153
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
154 moved=0
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 for idx in self.selected_points:
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
156 x,y = self.world_from_screen(ev.x,ev.y)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
157 y = max(0,min(1,y))
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
158 if idx>0 and x<=cp[idx-1][0]:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
159 continue
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
160 if idx<len(cp)-1 and x>=cp[idx+1][0]:
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 continue
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
162 moved=1
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
163 cp[idx] = (x,y)
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
164 if moved:
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
165 self.update()
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
166 def unselect(self):
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
167 self.selected_points=[]
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
168 self.highlight_selected_dots()
196
07bac5061d69 evaluates curves based on input time from ascoltami; outputs dmx
drewp
parents: 0
diff changeset
169
07bac5061d69 evaluates curves based on input time from ascoltami; outputs dmx
drewp
parents: 0
diff changeset
170 def dotrelease(self,ev,dotidx):
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
171 self.unselect()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
172
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 class Curveset:
45b12307c695 Initial revision
drewp
parents:
diff changeset
174 curves = None # curvename : curve
45b12307c695 Initial revision
drewp
parents:
diff changeset
175 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 self.curves = {}
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
177 def load(self,basename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
178 """find all files that look like basename-curvename and add
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
179 curves with their contents"""
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
180 for filename in glob.glob("%s-*"%basename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
181 curvename = filename[filename.rfind('-')+1:]
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
182 c=Curve()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
183 c.load(filename)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
184 self.add_curve(curvename,c)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
185 def save(self,basename):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
186 """writes a file for each curve with a name
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
187 like basename-curvename"""
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
188 for name,cur in self.curves.items():
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
189 cur.save("%s-%s" % (basename,name))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 def add_curve(self,name,curve):
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 self.curves[name] = curve
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 dispatcher.send("add_curve",sender=self,name=name)
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 def globalsdict(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 return self.curves.copy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
195
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 class Curvesetview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 curves = None # curvename : Curveview
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 def __init__(self,master,curveset,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 self.curves = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 self.curveset = curveset
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 tk.Frame.__init__(self,master,**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 dispatcher.connect(self.add_curve,"add_curve",sender=self.curveset)
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 def add_curve(self,name):
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 f = tk.Frame(self,relief='raised',bd=1)
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
205 f.pack(side='top',fill='both',exp=1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 tk.Label(f,text="curve %r"%name).pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 cv = Curveview(f,self.curveset.curves[name])
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
208 cv.pack(side='right',fill='both',exp=1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
209 self.curves[name] = cv
45b12307c695 Initial revision
drewp
parents:
diff changeset
210
45b12307c695 Initial revision
drewp
parents:
diff changeset
211 class Music:
45b12307c695 Initial revision
drewp
parents:
diff changeset
212 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
213 self.player=None # xmlrpc Proxy to player
45b12307c695 Initial revision
drewp
parents:
diff changeset
214 self.recenttime=0
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
215
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
216 def current_time(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
217 """return deferred which gets called with the current time"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
218 if self.player is None:
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
219 self.player = Proxy("http://spot:8040")
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
220 d = self.player.callRemote("songlength")
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
221 d.addCallback(lambda l: dispatcher.send("max time",maxtime=l))
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
222 d = self.player.callRemote("songname")
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
223 d.addCallback(lambda n: dispatcher.send("songname",name=n))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
224 d = self.player.callRemote('gettime')
45b12307c695 Initial revision
drewp
parents:
diff changeset
225 def sendtime(t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
226 dispatcher.send("input time",val=t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
227 return t # pass along to the real receiver
45b12307c695 Initial revision
drewp
parents:
diff changeset
228 def error(e):
45b12307c695 Initial revision
drewp
parents:
diff changeset
229 pass#self.player=None
45b12307c695 Initial revision
drewp
parents:
diff changeset
230 d.addCallback(sendtime)
45b12307c695 Initial revision
drewp
parents:
diff changeset
231 return d
45b12307c695 Initial revision
drewp
parents:
diff changeset
232
45b12307c695 Initial revision
drewp
parents:
diff changeset
233 class Subexpr:
45b12307c695 Initial revision
drewp
parents:
diff changeset
234 curveset = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
235 def __init__(self,curveset):
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 self.curveset = curveset
45b12307c695 Initial revision
drewp
parents:
diff changeset
237 self.lasteval = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
238 self.expr=""
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 def eval(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
240 if self.expr=="":
45b12307c695 Initial revision
drewp
parents:
diff changeset
241 dispatcher.send("expr_error",sender=self,exc="no expr, using 0")
45b12307c695 Initial revision
drewp
parents:
diff changeset
242 return 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 glo = self.curveset.globalsdict()
45b12307c695 Initial revision
drewp
parents:
diff changeset
244 glo['t'] = t
45b12307c695 Initial revision
drewp
parents:
diff changeset
245 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
246 self.lasteval = eval(self.expr,glo)
45b12307c695 Initial revision
drewp
parents:
diff changeset
247 except Exception,e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
248 dispatcher.send("expr_error",sender=self,exc=e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
249 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
250 dispatcher.send("expr_error",sender=self,exc="no errors")
45b12307c695 Initial revision
drewp
parents:
diff changeset
251 return self.lasteval
45b12307c695 Initial revision
drewp
parents:
diff changeset
252
45b12307c695 Initial revision
drewp
parents:
diff changeset
253 def expr():
45b12307c695 Initial revision
drewp
parents:
diff changeset
254 doc = "python expression for level as a function of t, using curves"
45b12307c695 Initial revision
drewp
parents:
diff changeset
255 def fget(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
256 return self._expr
45b12307c695 Initial revision
drewp
parents:
diff changeset
257 def fset(self, value):
45b12307c695 Initial revision
drewp
parents:
diff changeset
258 self._expr = value
45b12307c695 Initial revision
drewp
parents:
diff changeset
259 dispatcher("expr_changed",sender=self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
260 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
261 expr = property(**expr())
45b12307c695 Initial revision
drewp
parents:
diff changeset
262
45b12307c695 Initial revision
drewp
parents:
diff changeset
263 class Subexprview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
264 def __init__(self,master,se,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
265 self.subexpr=se
45b12307c695 Initial revision
drewp
parents:
diff changeset
266 tk.Frame.__init__(self,master,**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
267 self.evar = tk.StringVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
268 e = self.ent = tk.Entry(master,textvariable=self.evar)
45b12307c695 Initial revision
drewp
parents:
diff changeset
269 e.pack(side='left',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
270 self.expr_changed()
45b12307c695 Initial revision
drewp
parents:
diff changeset
271 self.evar.trace_variable('w',self.evar_changed)
45b12307c695 Initial revision
drewp
parents:
diff changeset
272 dispatcher.connect(self.expr_changed,"expr_changed",
45b12307c695 Initial revision
drewp
parents:
diff changeset
273 sender=self.subexpr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
274 self.error = tk.Label(master)
45b12307c695 Initial revision
drewp
parents:
diff changeset
275 self.error.pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
276 dispatcher.connect(lambda exc: self.error.config(text=str(exc)),
45b12307c695 Initial revision
drewp
parents:
diff changeset
277 "expr_error",sender=self.subexpr,weak=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
278 def expr_changed(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
279 if self.subexpr.expr!=self.evar.get():
45b12307c695 Initial revision
drewp
parents:
diff changeset
280 self.evar.set(self.subexpr.expr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
281 def evar_changed(self,*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
282 self.subexpr.expr = self.evar.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
283
45b12307c695 Initial revision
drewp
parents:
diff changeset
284 class Subterm:
45b12307c695 Initial revision
drewp
parents:
diff changeset
285 """one Submaster and its Subexpr"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
286 def scaled(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
287 return self.sub * self.subexpr.eval(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
288
45b12307c695 Initial revision
drewp
parents:
diff changeset
289 class Subtermview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
290 def __init__(self,master,st,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
291 self.subterm = st
45b12307c695 Initial revision
drewp
parents:
diff changeset
292 tk.Frame.__init__(self,master,bd=1,relief='raised',**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
293 tk.Label(self,text="sub %r" % self.subterm.sub.name).pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
294 sev=Subexprview(self,self.subterm.subexpr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
295 sev.pack(side='left',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
296
45b12307c695 Initial revision
drewp
parents:
diff changeset
297 class Output:
45b12307c695 Initial revision
drewp
parents:
diff changeset
298 def __init__(self,subterms):
45b12307c695 Initial revision
drewp
parents:
diff changeset
299 make_attributes_from_args('subterms')
45b12307c695 Initial revision
drewp
parents:
diff changeset
300 def send_dmx(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
301
45b12307c695 Initial revision
drewp
parents:
diff changeset
302 scaledsubs=[]
45b12307c695 Initial revision
drewp
parents:
diff changeset
303 for st in self.subterms:
45b12307c695 Initial revision
drewp
parents:
diff changeset
304 scl = st.scaled(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
305 scaledsubs.append(scl)
45b12307c695 Initial revision
drewp
parents:
diff changeset
306 out = Submaster.sub_maxes(*scaledsubs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
307 dispatcher.send("output levels",val=out.get_levels())
45b12307c695 Initial revision
drewp
parents:
diff changeset
308 dmxclient.outputlevels(out.get_dmx_list(),twisted=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
309
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
310 def create_status_lines(master):
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
311 for signame,textfilter in [
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
312 ('input time',lambda t: "%.2fs"%t),
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
313 ('output levels',
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
314 lambda levels: textwrap.fill("; ".join(["%s:%.2f"%(n,v)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
315 for n,v in
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
316 levels.items()]),70)),
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
317 ('update period',lambda t: "%.1fms"%(t*1000)),
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
318 ]:
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
319 l = tk.Label(master,anchor='w',justify='left')
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
320 l.pack(side='top',fill='x')
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
321 dispatcher.connect(lambda val,l=l,sn=signame,tf=textfilter:
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
322 l.config(text=sn+": "+tf(val)),
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
323 signame,weak=0)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
324
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
325 def savesubterms(filename,subterms):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
326 f = file(filename,'w')
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
327 for st in subterms:
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
328 f.write("%s %s\n" % (st.sub.name,st.subexpr.expr))
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
329 f.close()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
330
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
331 def save(song,subterms,curveset):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
332 savesubterms("subterms/"+song,subterms)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
333 curveset.save(basename="curves/"+song)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
334
45b12307c695 Initial revision
drewp
parents:
diff changeset
335 #######################################################################
45b12307c695 Initial revision
drewp
parents:
diff changeset
336 root=tk.Tk()
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
337 root.wm_geometry("790x930")
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
338 #root.tk_focusFollowsMouse()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
339
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
340 music=Music()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
341
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
342 zc = Zoomcontrol(root)
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
343 zc.pack(side='top',fill='x')
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
344
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
345 curveset = Curveset()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
346 csv = Curvesetview(root,curveset)
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
347 csv.pack(side='top',fill='both',exp=1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
348
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
349 song = "16mix.wav"
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
350
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
351 curveset.load(basename="curves/"+song)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
352
45b12307c695 Initial revision
drewp
parents:
diff changeset
353 subterms = []
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
354 for line in file("subterms/"+song):
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
355 subname,expr = line.strip().split(" ",1)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
356
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
357 term = Subterm()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
358
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
359 sexpr = Subexpr(curveset)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
360 sexpr.expr = expr
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
361
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
362 term.sub = Submaster.Submaster(subname)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
363 term.subexpr = sexpr
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
364 subterms.append(term)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
365
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
366 stv=Subtermview(root,term)
197
ba2677823b35 zoom control and other cleanups. also reads song length now
drewp
parents: 196
diff changeset
367 stv.pack(side='top',fill='x')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
368
45b12307c695 Initial revision
drewp
parents:
diff changeset
369 out = Output(subterms)
45b12307c695 Initial revision
drewp
parents:
diff changeset
370
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
371 #save(song,subterms,curveset)
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
372
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
373 create_status_lines(root)
196
07bac5061d69 evaluates curves based on input time from ascoltami; outputs dmx
drewp
parents: 0
diff changeset
374
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
375 recent_t=[]
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
376 later = None
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
377 def update():
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
378 global later
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
379 d = music.current_time()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
380 d.addCallback(update2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
381 d.addErrback(updateerr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
382 def updateerr(e):
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
383 global later
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
384 print "err",e
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
385 if later and not later.cancelled and not later.called: later.cancel()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
386 later = reactor.callLater(1,update)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
387 def update2(t):
202
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
388 global recent_t,later
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
389
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
390 if later and not later.cancelled and not later.called: later.cancel()
97e21bc387fe loading and saving
drewp
parents: 200
diff changeset
391 later = reactor.callLater(.01,update)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
392
45b12307c695 Initial revision
drewp
parents:
diff changeset
393 recent_t = recent_t[-50:]+[t]
45b12307c695 Initial revision
drewp
parents:
diff changeset
394 period = (recent_t[-1]-recent_t[0])/len(recent_t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
395 dispatcher.send("update period",val=period)
45b12307c695 Initial revision
drewp
parents:
diff changeset
396 out.send_dmx(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
397 update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
398
45b12307c695 Initial revision
drewp
parents:
diff changeset
399 tksupport.install(root,ms=10)
45b12307c695 Initial revision
drewp
parents:
diff changeset
400 if 0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
401 sys.path.append("/home/drewp/projects/editor/pour")
45b12307c695 Initial revision
drewp
parents:
diff changeset
402 from utils import runstats
45b12307c695 Initial revision
drewp
parents:
diff changeset
403 runstats("reactor.run()")
45b12307c695 Initial revision
drewp
parents:
diff changeset
404 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
405 reactor.run()