Mercurial > code > home > repos > light9
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): |