Mercurial > code > home > repos > light9
annotate light8/Cue.py @ 271:97c08a1c4351
gyrocontroller: remap buttons, fix keep mode
Also, solo mode is now default, colors are brighter, numeric names for subs
are converted to subs with only that channel up, send zeroes when exiting
author | David McClosky <dmcc@bigasterisk.com> |
---|---|
date | Fri, 17 Jun 2005 04:23:07 +0000 |
parents | e5d14320fbd5 |
children |
rev | line source |
---|---|
46
cfb00e8cc0ea
(22:36:03) drewp: plaese use stronger quotes """ on Cue:1 to help my highlighter
dmcc
parents:
45
diff
changeset
|
1 """And that's my cue to exit(0)...""" |
0 | 2 from time import time |
63 | 3 from util import subsetdict, scaledict |
0 | 4 |
5 class Cue: | |
46
cfb00e8cc0ea
(22:36:03) drewp: plaese use stronger quotes """ on Cue:1 to help my highlighter
dmcc
parents:
45
diff
changeset
|
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 | |
46
cfb00e8cc0ea
(22:36:03) drewp: plaese use stronger quotes """ on Cue:1 to help my highlighter
dmcc
parents:
45
diff
changeset
|
9 of Cues and Fades, but without all the Nodes.""" |
53 | 10 def __init__(self, name, starttime, dur, *fades): |
0 | 11 'Create a cue' |
53 | 12 |
13 endtime = starttime + dur | |
14 dur = endtime - starttime | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
15 |
0 | 16 self.name = name |
17 self.starttime = starttime | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
18 self.dur = dur |
0 | 19 self.endtime = endtime |
20 self.fades = fades | |
21 self.cuestart = None | |
22 self.init_levels = None | |
23 def channels_involved(self): | |
24 'Return which channels are involved. This is important for marking.' | |
25 c = {} | |
26 for fade in self.fades: | |
27 for f_chan in fade.channels_involved(): | |
28 c[f_chan] = 1 | |
29 return c.keys() | |
30 def start(self, levels, time): | |
31 'Mark the beginning of a cue' | |
54 | 32 # print "cue marked with", levels |
0 | 33 self.init_levels = levels |
34 self.init_time = time | |
35 | |
36 for fade in self.fades: | |
37 subdict = subsetdict(levels, fade.channels_involved()) | |
38 fade.start(subdict, time) | |
39 def get_levels(self, curtime): | |
40 'Returns the current levels' | |
41 d = {} | |
42 for fade in self.fades: | |
43 fade_d = fade.get_levels(curtime) | |
44 for ch, lev in fade_d.items(): | |
45 d[ch] = max(lev, d.get(ch, 0)) | |
46 return d | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
47 def get_end_levels(self): |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
48 'Returns the final levels' |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
49 d = {} |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
50 for fade in self.fades: |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
51 fade_d = fade.get_end_levels() |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
52 for ch, lev in fade_d.items(): |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
53 d[ch] = max(lev, d.get(ch, 0)) |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
54 return d |
0 | 55 |
56 class Fade(Cue): | |
57 'See Cue.__doc__' | |
53 | 58 def __init__(self, channel, starttime, dur=None, endlevel=0, param=None): |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
59 'Fades are simple Cues' |
54 | 60 Cue.__init__(self, "%s -> %.1f" % (channel, endlevel), starttime, dur) |
0 | 61 self.channel = channel |
62 self.endlevel = endlevel | |
63 self.dur = dur | |
64 self.param = param | |
65 def start(self, levels, time): | |
66 'Mark the beginning of the fade' | |
54 | 67 # print "fade", self.name, "marked with", levels |
0 | 68 self.init_levels = levels |
69 self.init_level = levels[self.channel] | |
70 self.init_time = time | |
71 def channels_involved(self): | |
72 'Speaks for itself, I hope' | |
73 return [self.channel] | |
74 def get_levels(self, curtime): | |
75 elapsed = curtime - self.init_time | |
76 if elapsed <= self.starttime: | |
77 return self.init_levels | |
78 elif elapsed >= self.endtime: | |
79 return {self.channel : self.endlevel} | |
80 else: | |
54 | 81 percent = float((curtime - self.init_time) - self.starttime) / \ |
82 self.dur | |
0 | 83 return {self.channel : self.init_level + |
84 percent * (self.endlevel - self.init_level)} | |
51
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
85 def get_end_levels(self): |
71489bb71528
- Meet Fader. He is going to grow up and be a crossfader some day
dmcc
parents:
46
diff
changeset
|
86 return {self.channel : self.endlevel} |
0 | 87 |
63 | 88 class SimpleCue(Cue): |
89 'See Cue.__doc__' | |
90 def __init__(self, name, target, dur, **info): | |
91 Cue.__init__(self, name, 0, dur) | |
92 self.target = target | |
93 self.dur = dur | |
94 self.info = info | |
95 def start(self, levels, time): | |
96 'Mark the beginning of the fade' | |
97 self.init_levels = levels | |
98 self.init_time = time | |
99 def channels_involved(self): | |
100 'Speaks for itself, I hope' | |
101 return self.target.keys() | |
102 def get_levels(self, curtime): | |
103 elapsed = curtime - self.init_time | |
104 if elapsed >= self.endtime: | |
105 return self.target | |
106 else: | |
107 percent = float((curtime - self.init_time) - self.starttime) / \ | |
108 self.dur | |
109 return dict([(n, self.init_levels[n] + | |
110 percent * (lev - self.init_levels[n])) | |
111 for n, lev in self.target]) | |
112 # return {self.channel : self.init_level + | |
113 # percent * (self.endlevel - self.init_level)} | |
114 def get_end_levels(self): | |
115 return self.target | |
116 | |
0 | 117 if __name__ == '__main__': |
118 f1 = Fade('red', 0, 2, 100) | |
119 f2 = Fade('green', 1, 3, 50) | |
120 f3 = Fade('blue', 0, 4, 0) | |
121 f4 = Fade('clear', 0, 8, 75) | |
122 c = Cue("Color shift", 0, 10, f1, f2, f3, f4) | |
123 tstart = time() | |
124 # note how green is not mentioned -- it goes to 0 | |
125 c.start({'red' : 0, 'blue' : 100, 'clear' : 25}, tstart) | |
126 while time() - tstart < 15: | |
127 curtime = time() | |
128 levs = c.get_levels(curtime) | |
129 s = '\t'.join(["%s: %d" % (k[0], v) for k, v, in levs.items()]) | |
130 print "%.1f" % (curtime - tstart), s |