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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 from time import time
63
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
3 from util import subsetdict, scaledict
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
4
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 given time. They contain Fades, which are actually children of Cue,
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
032b2b67bc10 result of July 7th on-site editing
dmcc
parents: 51
diff changeset
10 def __init__(self, name, starttime, dur, *fades):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 'Create a cue'
53
032b2b67bc10 result of July 7th on-site editing
dmcc
parents: 51
diff changeset
12
032b2b67bc10 result of July 7th on-site editing
dmcc
parents: 51
diff changeset
13 endtime = starttime + dur
032b2b67bc10 result of July 7th on-site editing
dmcc
parents: 51
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 self.name = name
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 self.endtime = endtime
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 self.fades = fades
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 self.cuestart = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 self.init_levels = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 def channels_involved(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 'Return which channels are involved. This is important for marking.'
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 c = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 for fade in self.fades:
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 for f_chan in fade.channels_involved():
45b12307c695 Initial revision
drewp
parents:
diff changeset
28 c[f_chan] = 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 return c.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 def start(self, levels, time):
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 'Mark the beginning of a cue'
54
3011c1028eb7 Cue math error fixed.
dmcc
parents: 53
diff changeset
32 # print "cue marked with", levels
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 self.init_levels = levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 self.init_time = time
45b12307c695 Initial revision
drewp
parents:
diff changeset
35
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 for fade in self.fades:
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 subdict = subsetdict(levels, fade.channels_involved())
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 fade.start(subdict, time)
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 def get_levels(self, curtime):
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 'Returns the current levels'
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 d = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 for fade in self.fades:
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 fade_d = fade.get_levels(curtime)
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 for ch, lev in fade_d.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 d[ch] = max(lev, d.get(ch, 0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
55
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 class Fade(Cue):
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 'See Cue.__doc__'
53
032b2b67bc10 result of July 7th on-site editing
dmcc
parents: 51
diff changeset
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
3011c1028eb7 Cue math error fixed.
dmcc
parents: 53
diff changeset
60 Cue.__init__(self, "%s -> %.1f" % (channel, endlevel), starttime, dur)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.channel = channel
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 self.endlevel = endlevel
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 self.dur = dur
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 self.param = param
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 def start(self, levels, time):
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 'Mark the beginning of the fade'
54
3011c1028eb7 Cue math error fixed.
dmcc
parents: 53
diff changeset
67 # print "fade", self.name, "marked with", levels
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 self.init_levels = levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 self.init_level = levels[self.channel]
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 self.init_time = time
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 def channels_involved(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 'Speaks for itself, I hope'
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 return [self.channel]
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 def get_levels(self, curtime):
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 elapsed = curtime - self.init_time
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 if elapsed <= self.starttime:
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 return self.init_levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 elif elapsed >= self.endtime:
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 return {self.channel : self.endlevel}
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 else:
54
3011c1028eb7 Cue math error fixed.
dmcc
parents: 53
diff changeset
81 percent = float((curtime - self.init_time) - self.starttime) / \
3011c1028eb7 Cue math error fixed.
dmcc
parents: 53
diff changeset
82 self.dur
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 return {self.channel : self.init_level +
45b12307c695 Initial revision
drewp
parents:
diff changeset
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
45b12307c695 Initial revision
drewp
parents:
diff changeset
87
63
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
88 class SimpleCue(Cue):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
89 'See Cue.__doc__'
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
90 def __init__(self, name, target, dur, **info):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
91 Cue.__init__(self, name, 0, dur)
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
92 self.target = target
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
93 self.dur = dur
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
94 self.info = info
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
95 def start(self, levels, time):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
96 'Mark the beginning of the fade'
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
97 self.init_levels = levels
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
98 self.init_time = time
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
99 def channels_involved(self):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
100 'Speaks for itself, I hope'
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
101 return self.target.keys()
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
102 def get_levels(self, curtime):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
103 elapsed = curtime - self.init_time
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
104 if elapsed >= self.endtime:
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
105 return self.target
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
106 else:
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
107 percent = float((curtime - self.init_time) - self.starttime) / \
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
108 self.dur
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
109 return dict([(n, self.init_levels[n] +
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
110 percent * (lev - self.init_levels[n]))
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
111 for n, lev in self.target])
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
112 # return {self.channel : self.init_level +
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
113 # percent * (self.endlevel - self.init_level)}
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
114 def get_end_levels(self):
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
115 return self.target
e5d14320fbd5 SimpleCues created (took 7 minutes or so)
dmcc
parents: 54
diff changeset
116
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 if __name__ == '__main__':
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 f1 = Fade('red', 0, 2, 100)
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 f2 = Fade('green', 1, 3, 50)
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 f3 = Fade('blue', 0, 4, 0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 f4 = Fade('clear', 0, 8, 75)
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 c = Cue("Color shift", 0, 10, f1, f2, f3, f4)
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 tstart = time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 # note how green is not mentioned -- it goes to 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 c.start({'red' : 0, 'blue' : 100, 'clear' : 25}, tstart)
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 while time() - tstart < 15:
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 curtime = time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 levs = c.get_levels(curtime)
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 s = '\t'.join(["%s: %d" % (k[0], v) for k, v, in levs.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 print "%.1f" % (curtime - tstart), s