45
|
1 '''And that's my cue to exit(0)...'''
|
0
|
2 from time import time
|
45
|
3 from util import subsetdict
|
0
|
4
|
|
5 class Cue:
|
45
|
6 '''Cues are groups of fades. They can tell you the current levels at a
|
0
|
7 given time. They contain Fades, which are actually children of Cue,
|
|
8 meaning that Cues can contain Cues. This is similar to the Light9 concept
|
45
|
9 of Cues and Fades, but without all the Nodes.'''
|
|
10 def __init__(self, name, starttime, endtime, *fades):
|
0
|
11 'Create a cue'
|
|
12 self.name = name
|
|
13 self.starttime = starttime
|
|
14 self.endtime = endtime
|
|
15 self.fades = fades
|
|
16 self.cuestart = None
|
|
17 self.init_levels = None
|
|
18 def channels_involved(self):
|
|
19 'Return which channels are involved. This is important for marking.'
|
|
20 c = {}
|
|
21 for fade in self.fades:
|
|
22 for f_chan in fade.channels_involved():
|
|
23 c[f_chan] = 1
|
|
24 return c.keys()
|
|
25 def start(self, levels, time):
|
|
26 'Mark the beginning of a cue'
|
|
27 self.init_levels = levels
|
|
28 self.init_time = time
|
|
29
|
|
30 for fade in self.fades:
|
|
31 subdict = subsetdict(levels, fade.channels_involved())
|
|
32 fade.start(subdict, time)
|
|
33 def get_levels(self, curtime):
|
|
34 'Returns the current levels'
|
|
35 d = {}
|
|
36 for fade in self.fades:
|
|
37 fade_d = fade.get_levels(curtime)
|
|
38 for ch, lev in fade_d.items():
|
|
39 d[ch] = max(lev, d.get(ch, 0))
|
|
40 return d
|
|
41
|
|
42 class Fade(Cue):
|
|
43 'See Cue.__doc__'
|
45
|
44 def __init__(self, channel, starttime, endtime=None, endlevel=0, dur=None,
|
|
45 param=None):
|
|
46 'Only specify an end time or a duration'
|
|
47 if not endtime:
|
|
48 endtime = starttime + dur
|
|
49 else:
|
|
50 dur = endtime - starttime
|
|
51 Cue.__init__(self, "%s -> %f" % (channel, endlevel), starttime, endtime)
|
0
|
52 self.channel = channel
|
|
53 self.endlevel = endlevel
|
|
54 self.dur = dur
|
|
55 self.param = param
|
|
56 def start(self, levels, time):
|
|
57 'Mark the beginning of the fade'
|
|
58 self.init_levels = levels
|
|
59 self.init_level = levels[self.channel]
|
|
60 self.init_time = time
|
|
61 def channels_involved(self):
|
|
62 'Speaks for itself, I hope'
|
|
63 return [self.channel]
|
|
64 def get_levels(self, curtime):
|
|
65 elapsed = curtime - self.init_time
|
|
66 if elapsed <= self.starttime:
|
|
67 return self.init_levels
|
|
68 elif elapsed >= self.endtime:
|
|
69 return {self.channel : self.endlevel}
|
|
70 else:
|
45
|
71 percent = float(elapsed) / self.dur
|
0
|
72 return {self.channel : self.init_level +
|
|
73 percent * (self.endlevel - self.init_level)}
|
|
74
|
|
75 if __name__ == '__main__':
|
|
76 f1 = Fade('red', 0, 2, 100)
|
|
77 f2 = Fade('green', 1, 3, 50)
|
|
78 f3 = Fade('blue', 0, 4, 0)
|
|
79 f4 = Fade('clear', 0, 8, 75)
|
|
80 c = Cue("Color shift", 0, 10, f1, f2, f3, f4)
|
|
81 tstart = time()
|
|
82 # note how green is not mentioned -- it goes to 0
|
|
83 c.start({'red' : 0, 'blue' : 100, 'clear' : 25}, tstart)
|
|
84 while time() - tstart < 15:
|
|
85 curtime = time()
|
|
86 levs = c.get_levels(curtime)
|
|
87 s = '\t'.join(["%s: %d" % (k[0], v) for k, v, in levs.items()])
|
|
88 print "%.1f" % (curtime - tstart), s
|