comparison light8/Lightboard.py @ 107:47bda76f5236

backed up backuper backed up backuper panels and Lightboard: "What's up?" feature: list subs that are on Lightboard: new incorporator algorithm that is 0-5x faster (usually 2x)
author dmcc
date Sun, 21 Jul 2002 07:20:33 +0000
parents 15ead14b4dd1
children afbdae5e1359
comparison
equal deleted inserted replaced
106:d8e2492e2947 107:47bda76f5236
27 self.parportdmx = parportdmx 27 self.parportdmx = parportdmx
28 self.DUMMY = DUMMY 28 self.DUMMY = DUMMY
29 self.jostle_mode = 0 29 self.jostle_mode = 0
30 self.lastline = None 30 self.lastline = None
31 31
32 self.channel_levels = [] 32 self.channel_levels = [] # these are actually the labels for the
33 # channel levels, and should probably be moved
34 # to panels.Leveldisplay
33 self.scalelevels = {} 35 self.scalelevels = {}
36
37 self.lastsublevels = {} # to determine which subs changed
38 self.unchangedeffect = {} # dict of levels for lights that didn't
39 # change last time
40 self.lastunchangedgroup = {}
41
34 # doesn't draw any UI yet-- look for self.xfader.setupwidget() 42 # doesn't draw any UI yet-- look for self.xfader.setupwidget()
35 self.xfader = Xfader(self.scalelevels) 43 self.xfader = Xfader(self.scalelevels)
36 self.oldlevels = [None] * 68 # never replace this; just clear it 44 self.oldlevels = [None] * 68 # never replace this; just clear it
37 self.subediting = Subediting(currentoutputlevels=self.oldlevels) 45 self.subediting = Subediting(currentoutputlevels=self.oldlevels)
38 46
70 ExternalSliders(), 78 ExternalSliders(),
71 self) 79 self)
72 self.slidermapper.pack() 80 self.slidermapper.pack()
73 81
74 print "\tsubmaster control" 82 print "\tsubmaster control"
75 self.subpanels = Subpanels(sub_tl, effect_tl, scene_tl, self, self.scalelevels, 83 self.subpanels = Subpanels(sub_tl, effect_tl, scene_tl, self,
76 Subs, self.xfader, self.changelevel, 84 self.scalelevels, Subs, self.xfader,
77 self.subediting, Subs.longestsubname()) 85 self.changelevel, self.subediting,
86 Subs.longestsubname())
87
88 for n, lev in self.scalelevels.items():
89 self.lastsublevels[n] = lev.get()
78 90
79 print "\tlevel display" 91 print "\tlevel display"
80 leveldisplay_tl = toplevelat('leveldisplay') 92 leveldisplay_tl = toplevelat('leveldisplay')
81 leveldisplay_tl.bind('<Escape>', sys.exit) 93 leveldisplay_tl.bind('<Escape>', sys.exit)
82 94
83 self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels) 95 self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels)
84 for i in range(0,len(self.channel_levels)): 96 # I don't think we need this
85 self.channel_levels[i].config(text=self.oldlevels[i]) 97 # for i in range(0,len(self.channel_levels)):
86 colorlabel(self.channel_levels[i]) 98 # self.channel_levels[i].config(text=self.oldlevels[i])
99 # colorlabel(self.channel_levels[i])
87 100
88 print "\tconsole" 101 print "\tconsole"
89 Console(self) 102 Console(self)
90 103
91 # root frame 104 # root frame
92 print "\tcontrol panel" 105 print "\tcontrol panel"
93 self.master.configure(bg='black') 106 self.master.configure(bg='black')
94 controlpanel = Controlpanel(self.master, self.xfader, self.refresh, 107 controlpanel = Controlpanel(self.master, self.xfader, self.refresh,
95 self.quit, self.toggle_jostle) 108 self.quit, self.toggle_jostle, self.nonzerosubs)
96 109
97 print "\tcrossfader" 110 print "\tcrossfader"
98 xf=Frame(self.master) 111 xf=Frame(self.master)
99 xf.pack(side='right') 112 xf.pack(side='right')
100 113
169 182
170 # this is called on a loop, and ALSO by the Scales 183 # this is called on a loop, and ALSO by the Scales
171 def changelevel(self, *args): 184 def changelevel(self, *args):
172 'Amp trims slider' 185 'Amp trims slider'
173 186
174 levels = [0] * 68
175 for name, s in Subs.subs.items():
176 newlevels = s.get_levels(level=self.scalelevels[name].get())
177 for (ch, fadelev) in newlevels.items():
178 levels[ch-1] = max(levels[ch-1], fadelev)
179
180 levels = [int(l) for l in levels]
181
182 # load levels from external sliders 187 # load levels from external sliders
183 extlevels = self.slidermapper.get_levels() 188 extlevels = self.slidermapper.get_levels()
184 for name, val in extlevels.items(): 189 for name, val in extlevels.items():
185 if name in self.scalelevels: 190 if name in self.scalelevels:
186 sl = self.scalelevels[name] 191 sl = self.scalelevels[name]
187 # sl.disable_traces()
188 sl.set(val) 192 sl.set(val)
189 # sl.recreate_traces() 193
194 # newstart = time()
195
196 # learn what changed
197 unchangedgroup = {}
198 changedgroup = {}
199 for name, lastlevel in self.lastsublevels.items():
200 newlevel = self.scalelevels[name].get()
201 if lastlevel != newlevel:
202 changedgroup[name] = newlevel
203 else:
204 unchangedgroup[name] = newlevel
205
206 changedeffect = {}
207 if not changedgroup:
208 # should load levels from last time
209 pass
210 else:
211 # calculate effect of new group. this should take no time if
212 # nothing changed
213 for name, level in changedgroup.items():
214 newlevels = Subs.subs[name].get_levels(level=level)
215 for (ch, fadelev) in newlevels.items():
216 changedeffect[ch-1] = \
217 max(changedeffect.get(ch-1, 0), fadelev)
218
219 if unchangedgroup != self.lastunchangedgroup:
220 # unchanged group changed! (confusing, huh?)
221 # this means: the static subs from the last time are not the same
222 # as they are this time, so we recalculate effect of unchanged group
223 self.unchangedeffect = {}
224 for name, level in unchangedgroup.items():
225 newlevels = Subs.subs[name].get_levels(level=level)
226 for (ch, fadelev) in newlevels.items():
227 self.unchangedeffect[ch-1] = \
228 max(self.unchangedeffect.get(ch-1, 0), fadelev)
229 self.lastunchangedgroup = unchangedgroup
230
231 # record sublevels for future generations (iterations, that is)
232 for name in self.lastsublevels:
233 self.lastsublevels[name] = self.scalelevels[name]
234
235 # merge effects together
236 levels = [0] * 68
237 if changedeffect:
238 levels = [int(max(changedeffect.get(ch, 0),
239 self.unchangedeffect.get(ch, 0)))
240 for ch in range(0, 68)]
241 else:
242 levels = [int(self.unchangedeffect.get(ch, 0))
243 for ch in range(0, 68)]
244
245 '''
246 newend = time()
247
248 levels_opt = levels
249
250 oldstart = time()
251 # i tried to optimize this to a dictionary, but there was no speed
252 # improvement
253 levels = [0] * 68
254 for name, s in Subs.subs.items():
255 sublevel = self.scalelevels[name].get()
256 newlevels = s.get_levels(level=sublevel)
257 self.lastsublevels[name] = sublevel # XXX remove
258 for (ch, fadelev) in newlevels.items():
259 levels[ch-1] = max(levels[ch-1], fadelev)
260 levels = [int(l) for l in levels]
261 oldend = time()
262
263 newtime = newend - newstart
264 oldtime = oldend - oldstart
265 print "new", newtime, 'old', (oldend - oldstart), 'sup', \
266 oldtime / newtime
267
268 if levels != levels_opt:
269 raise "not equal"
270 # for l, lo in zip(levels, levels_opt):
271 # print l, lo
272 '''
190 273
191 for lev,lab,oldlev,numlab in zip(levels, self.channel_levels, 274 for lev,lab,oldlev,numlab in zip(levels, self.channel_levels,
192 self.oldlevels, 275 self.oldlevels,
193 self.leveldisplay.number_labels): 276 self.leveldisplay.number_labels):
194 if lev != oldlev: 277 if lev != oldlev:
199 else: 282 else:
200 numlab['bg'] = 'red' 283 numlab['bg'] = 'red'
201 else: 284 else:
202 numlab['bg'] = 'grey40' 285 numlab['bg'] = 'grey40'
203 286
204 self.oldlevels[:] = levels[:] # replace the elements in oldlevels - don't make a new list (Subediting is watching it) 287 # replace the elements in oldlevels - don't make a new list
288 # (Subediting is watching it)
289 self.oldlevels[:] = levels[:]
205 290
206 if self.jostle_mode: 291 if self.jostle_mode:
207 delta = random.randrange(-1, 2, 1) # (-1, 0, or 1) 292 delta = random.randrange(-1, 2, 1) # (-1, 0, or 1)
208 # print "delta", delta 293 # print "delta", delta
209 levels = [min(100, max(x + delta, 0)) for x in levels] 294 levels = [min(100, max(x + delta, 0)) for x in levels]
262 cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file) 347 cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file)
263 except cPickle.UnpickleableError: 348 except cPickle.UnpickleableError:
264 print "UnpickleableError! There's yer problem." 349 print "UnpickleableError! There's yer problem."
265 def toggle_jostle(self, *args): 350 def toggle_jostle(self, *args):
266 self.jostle_mode = not self.jostle_mode 351 self.jostle_mode = not self.jostle_mode
267 print "Light 8.8: Jostle mode", ('off', 'on')[self.jostle_mode] 352 if self.jostle_mode:
353 print 'Light 8.8: Perhaps we can jost-le your memory?'
354 else:
355 print 'Light 8.8: He remembers! (jostle off)'
356 def nonzerosubs(self, *args):
357 print "Light 8.8: Active subs:"
358 for n, dv in self.scalelevels.items():
359 if dv.get() > 0:
360 print "%-.4f: %s" % (dv.get(), n)
268 def record_start(self): 361 def record_start(self):
269 print "Light 8.8: Recorder started" 362 print "Light 8.8: Recorder started"
270 self.rec_file.write("%s:\t%s\n" % (time(), "--- Start ---")) 363 self.rec_file.write("%s:\t%s\n" % (time(), "--- Start ---"))
271 self.record_stamp() 364 self.record_stamp()
272 def record_end(self): 365 def record_end(self):