Mercurial > code > home > repos > light9
annotate light8/Cue.py @ 2419:e3af0ac507c8
new exposure-finder algorithm
author | drewp@bigasterisk.com |
---|---|
date | Tue, 21 May 2024 14:08:17 -0700 |
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 |