diff light8/Cue.py @ 0:45b12307c695

Initial revision
author drewp
date Wed, 03 Jul 2002 09:37:57 +0000
parents
children 62c47c3a90cb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/light8/Cue.py	Wed Jul 03 09:37:57 2002 +0000
@@ -0,0 +1,130 @@
+"""And that's my cue to exit(0)..."""
+from time import time
+from util import subsetdict, scaledict
+
+class Cue:
+    """Cues are groups of fades.  They can tell you the current levels at a 
+    given time.  They contain Fades, which are actually children of Cue,
+    meaning that Cues can contain Cues.  This is similar to the Light9 concept
+    of Cues and Fades, but without all the Nodes."""
+    def __init__(self, name, starttime, dur, *fades):
+        'Create a cue'
+
+        endtime = starttime + dur
+        dur = endtime - starttime
+
+        self.name = name
+        self.starttime = starttime
+        self.dur = dur
+        self.endtime = endtime
+        self.fades = fades
+        self.cuestart = None
+        self.init_levels = None
+    def channels_involved(self):
+        'Return which channels are involved.  This is important for marking.'
+        c = {}
+        for fade in self.fades:
+            for f_chan in fade.channels_involved():
+                c[f_chan] = 1
+        return c.keys()
+    def start(self, levels, time):
+        'Mark the beginning of a cue'
+        # print "cue marked with", levels
+        self.init_levels = levels
+        self.init_time = time
+
+        for fade in self.fades:
+            subdict = subsetdict(levels, fade.channels_involved())
+            fade.start(subdict, time)
+    def get_levels(self, curtime):
+        'Returns the current levels'
+        d = {}
+        for fade in self.fades:
+            fade_d = fade.get_levels(curtime)
+            for ch, lev in fade_d.items():
+                d[ch] = max(lev, d.get(ch, 0))
+        return d
+    def get_end_levels(self):
+        'Returns the final levels'
+        d = {}
+        for fade in self.fades:
+            fade_d = fade.get_end_levels()
+            for ch, lev in fade_d.items():
+                d[ch] = max(lev, d.get(ch, 0))
+        return d
+
+class Fade(Cue):
+    'See Cue.__doc__'
+    def __init__(self, channel, starttime, dur=None, endlevel=0, param=None):
+        'Fades are simple Cues'
+        Cue.__init__(self, "%s -> %.1f" % (channel, endlevel), starttime, dur)
+        self.channel = channel
+        self.endlevel = endlevel
+        self.dur = dur
+        self.param = param
+    def start(self, levels, time):
+        'Mark the beginning of the fade'
+        # print "fade", self.name, "marked with", levels
+        self.init_levels = levels
+        self.init_level = levels[self.channel]
+        self.init_time = time
+    def channels_involved(self):
+        'Speaks for itself, I hope'
+        return [self.channel]
+    def get_levels(self, curtime):
+        elapsed = curtime - self.init_time
+        if elapsed <= self.starttime:
+            return self.init_levels
+        elif elapsed >= self.endtime:
+            return {self.channel : self.endlevel}
+        else:
+            percent = float((curtime - self.init_time) - self.starttime) / \
+                        self.dur
+            return {self.channel : self.init_level + 
+                percent * (self.endlevel - self.init_level)}
+    def get_end_levels(self):
+        return {self.channel : self.endlevel}
+
+class SimpleCue(Cue):
+    'See Cue.__doc__'
+    def __init__(self, name, target, dur, **info):
+        Cue.__init__(self, name, 0, dur)
+        self.target = target
+        self.dur = dur
+        self.info = info
+    def start(self, levels, time):
+        'Mark the beginning of the fade'
+        self.init_levels = levels
+        self.init_time = time
+    def channels_involved(self):
+        'Speaks for itself, I hope'
+        return self.target.keys()
+    def get_levels(self, curtime):
+        elapsed = curtime - self.init_time
+        if elapsed >= self.endtime:
+            return self.target
+        else:
+            percent = float((curtime - self.init_time) - self.starttime) / \
+                        self.dur
+            return dict([(n, self.init_levels[n] + 
+                percent * (lev - self.init_levels[n]))
+                    for n, lev in self.target])
+            # return {self.channel : self.init_level + 
+                # percent * (self.endlevel - self.init_level)}
+    def get_end_levels(self):
+        return self.target
+
+if __name__ == '__main__':
+    f1 = Fade('red', 0, 2, 100)
+    f2 = Fade('green', 1, 3, 50)
+    f3 = Fade('blue', 0, 4, 0)
+    f4 = Fade('clear', 0, 8, 75) 
+    c = Cue("Color shift", 0, 10, f1, f2, f3, f4)
+    tstart = time()
+    # note how green is not mentioned -- it goes to 0
+    c.start({'red' : 0, 'blue' : 100, 'clear' : 25}, tstart)
+    while time() - tstart < 15:
+        curtime = time()
+        levs = c.get_levels(curtime)
+        s = '\t'.join(["%s: %d" % (k[0], v) for k, v, in levs.items()])
+        print "%.1f" % (curtime - tstart), s