Changeset - 3011c1028eb7
[Not reviewed]
default
0 4 0
dmcc - 22 years ago 2002-07-08 15:50:00

Cue math error fixed.
Cue math error fixed.
Bad cues in ConfigDummy fixed, not fixed in Config yet.
Cue fader back in rsn. Oh yeah.
4 files changed with 384 insertions and 58 deletions:
0 comments (0 inline, 0 general)
light8/ConfigDummy.py
Show inline comments
 
from random import randrange
 
from time import time
 
from __future__ import generators,division
 
from Subs import *
 
from Cue import *
 

	
 
f1 = Fade('red', 0, 2, 100)
 
f2 = Fade('green', 1, 3, 50)
 
f3 = Fade('blue', 0, 4, 0)
 
f4 = Fade('clear', 0, 8, 75) 
 
c1 = Cue("Color shift", 0, 10, f1, f2, f3, f4)
 
f1 = Fade('col blue', 0, 2, 1)
 
f2 = Fade('col gree', 1, 3, .50)
 
f3 = Fade('col oran', 0, 4, 0)
 
f4 = Fade('col red', 0, 8, .75) 
 

	
 
g1 = Fade('col blue', 1, 2, .20)
 
g2 = Fade('col gree', 0, 4, .10)
 
g3 = Fade('cyc', 1, 5, .20)
 
g4 = Fade('god', 0, 4, .15) 
 

	
 
cues = [c1]
 
r1 = Fade('col blue', 0, 2, 0)
 
r2 = Fade('col gree', 1, 3, .10)
 
r3 = Fade('col oran', 0, 4, .6)
 
r4 = Fade('col red', 0, 8, .15) 
 
r5 = Fade('cyc', 1, 5, .90)
 
r6 = Fade('god', 0, 8, .75) 
 

	
 
cues = [
 
    Cue("This", 0, 10, f1, f2, f3, f4),
 
    Cue("That", 0, 5, g1, g2, g3, g4),
 
    Cue("The other", 1, 7, f1, g2, g3, f4),
 
    Cue("Reset", 1, 9, r1, r2, r3, r4, r5, r6),
 
]
 

	
 
patch = {
 
    
 
    'side l' : 45, # posts
 
    'side r' : 46,
 
    ('side l','sidepost1') : 45, # posts
 
    ('side r','sidepost2') : 46,
 
    
 
    'sidefill1' : 13,
 
    'sidefill2' : 14,
 

	
 
    ('patio1','main 1',) : 1,
 
    ('main 2',) : 2,
 
    ('main 3',) : 3,
 
    ('main 4',) : 4,
 
    ('main 5',) : 5,
 
    ('god','main 6') : 6,
 
    ('main 7',) : 7,
 
    ('main 8',) : 8,
 
    ('main 9',) : 9,
 
    ('main 10',) : 10,
 
    ('main 11',):11,
 
    ('patio2','main 12',):12,
 
    'hotback':19,
 

	
 
    'cycleft' : 43,
 
    'cycright' : 44, # ? might be a different circuit
 
    'cycright' : 42,
 
    
 
    'house':68,
 
    ('desk1' ,'b11'):54, # left bank over house
 
    ('marry1' ,'b12'):53,
 
    ('b13',):52,
 
    ('hotbox1' ,'b14'):51,
 
    ('edge' ,'b15'):50,
 
    ('phone','b16'):49,
 
    ('cuba1'   ,'b21'):55, # mid bank
 
    ('b22',):56,
 
    ('b23',):57,
 
    ('b24'):58,
 
    ('b25'):59,
 
    ('desk2'   ,'b26'):60,
 
    ('rock','b31'):61, # right bank
 
    ('b32',):62,
 
    ('hotbox2' ,'b33'):63,
 
    ('b34',):64,
 
    ('marry2' ,'b35'):65,
 
    ('cuba2' ,'b36'):66,
 
    'oran1':21,    'oran2':25,    'oran3':29,    'oran4':33,
 
    'gree1':22,    'gree2':26,    'gree3':30,    'gree4':34,
 
    'blue1':23,    'blue2':27,    'blue3':31,    'blue4':35,
 
    'red1' :24,    'red2' :28,    'red3' :32,    'red4' :36,
 
    'upfill1' : 40,
 
    'upfill2' : 38,
 
    'upfill3' : 37,
 
    'upfill4' : 39,
 
}
 

	
 
from util import maxes,scaledict
 
FL=100
 
def fulls(chans):
 
    # pass a list or multiple args
 
    return dict([(c,FL) for c in chans])
 
def levs(chans,levs):
 
    return dict([(c,v) for c,v in zip(chans,levs)])
 

	
 
def strobe(params, slideradjuster):
 
    patterns = {
 
        'blue' : fulls((23,27,31,35,'b0 4 b','b2 3 b')),
 
        'cyc' : {42:FL,43:FL},
 
        'scp all' : fulls((13,16,18,19,39)),
 
        '1-5' : fulls(range(1, 6)),
 
    }
 
    params.add_param('offtime',SliderParam(range=(0.1,0.3), res=0.001,
 
                                           initial=0.11, length=100))
 
    params.add_param('ontime',SliderParam(range=(0.0,0.8), res=0.001, 
 
                                          length=100))
 
    params.add_param('pattern',ListParam(patterns.keys()))
 
    params.add_param('current',LabelParam('none'))
 
    params.add_param('count',SliderParam(range=(0, 10), res=1, initial=0))
 
    lastchanged = time()
 
    state = 0
 
    blinkcounter = 0
 
    my_pattern = None
 

	
 
    while 1:
 
        if params['count'] and blinkcounter > params['count']:
 
            blinkcounter = 0
 
            slideradjuster.set(0)
 

	
 
        if params['pattern'] != None:
 
            params['current'] = params['pattern']
 
            my_pattern = params['pattern']
 

	
 
        if state == 0:
 
            delay = params['offtime']
 
        else:
 
            delay = params['ontime']
 
            
 
        if time() > (lastchanged + delay):
 
            # ready for change
 
            state = not state
 
            lastchanged = time()
 
            blinkcounter += 0.5
 
@@ -204,78 +228,359 @@ b23 29 22 35 30 b24 33 36 """).split()])
 
        # time to put a new step in the queue?
 
        if time()>lastaddtime+params['steptime']:
 
            lastaddtime=time()
 
            try:
 
                nextstep = stepsiter.next()
 
            except StopIteration:
 
                stepsiter=iter(steps)
 
                nextstep=stepsiter.next()
 
            queued.append( (time(),nextstep) )
 

	
 
        # loop over queue, putting still-active (scaled) steps in shiftedsteps
 
        keepers=[]
 
        shiftedsteps=[]
 
        for started,s in queued:
 
            steptime = time()-started
 
            finish = started+(1.0+params['overlap'])*params['steptime']
 
            pos = (time()-started)/(finish-started)
 
            if time()<finish:
 
                keepers.append((started,s))
 
                shiftedsteps.append( scaledict(s,fn(pos)) )
 

	
 
        if len(keepers)>30:
 
            print "too many steps in chase - dumping some"
 
            queued=keepers[:20]
 
        else:
 
            queued=keepers
 
            
 
            
 
#        pos=(time()%params['steptime'])/params['steptime'] # 0..1 animated variable
 
#        shiftedsteps=[]
 
#        for i,s in zip(range(0,len(steps)),steps):
 
#            shiftedsteps.append( scaledict(s, stepbrightness(i,len(steps),params['overlap'],pos)) )
 
        yield maxes(shiftedsteps)
 

	
 
    
 
def randomdimmer(params, slideradjuster):
 
    params.add_param('magic', CheckboxParam())
 
    params.add_param('cheese', TextParam())
 
    params.add_param('stuff', ListParam(('a', 'b', 'c')))
 

	
 
    curtime = time()
 
    dim = 1
 
    while 4:
 
        if time() - curtime > 1:
 
            dim = randrange(1, 64)
 
            curtime = time()
 
        yield {dim : 100, 20 : params.get_param_value('magic')}
 

	
 

	
 
subs = {
 
    'over pit sm' : levs(range(1, 13),(100,0,0,91,77,79,86,55,92,77,59,0)),
 
    'over pit lg' : fulls(range(1, 13)),
 
    ('house', 'black') : { 68:100 },
 
    ('cyc', 'lightBlue'):{42:FL,43:FL},
 
    ('scp hot ctr', 'yellow'):{18:FL},
 
    ('scp more', '#AAAA00'):{18:FL,14:FL},
 
    ('scp all', '#AAAA00'):fulls((13,16,18,19,39)),
 
    ('col oran', '#EEEE99'):fulls('oran1 oran2 oran3 oran4'.split()),
 
    ('col red', 'red'):fulls('red1 red2 red3 red4'.split()),
 
    ('col blue', 'blue'):fulls('blue1 blue2 blue3 blue4'.split()),
 
    ('col gree', 'green'):fulls('gree1 gree2 gree3 gree4'.split()),
 
    'sidepost':fulls((45,46)),
 
    'edges':fulls((55,60,49,54,61,66)),
 
    'bank1ctr':fulls(('b22','b23','b24','b25')),
 
    'god' : fulls((6,)),
 
    ('strobe', 'grey'):strobe,
 
#    ('strobe', 'grey'):strobe,
 
#    'chase' : chase,
 
#    'chase2' : chase,
 
    'cyc' : fulls(('cycleft','cycright')),
 
    'sidefill' : fulls(('sidefill1','sidefill2')),
 
    'patio left' : { 'patio1':FL },
 
    'patio right' : { 'patio2':FL },
 
    'upfill sides' : fulls(('upfill1','upfill4')),
 
    '*broadway open':{},
 
    '*int mission':{},
 
    '*phone booth':{},
 
    '*off broadway':{},
 
    '*cuba left':{},
 
    '*cuba right':{},
 
    '*cuba dance':{},
 
    '*cuba sky':{},
 
    '*cuba love':{},
 
    '*ext mission':{},
 
    '*hotbox dance':{},
 
    '*hotbox table':{},
 
    '*sewer':{},
 
    '*marry':{},
 
    
 
#    'midstage' : dict([(r, 100) for r in range(11, 21)]),
 
#    'backstage' : dict([(r, 100) for r in range(21, 31)]),
 
#    'frontchase' : mr_effect,
 
    'chase' : chase,
 
    # 'chase2' : chase,
 
#    'random' : randomdimmer,
 
    
 
}
 

	
 
subs["ba outrs"] = fulls("b11 b12 b13 b14 b15 b16 b31 b32 b33 b34 b35 b36".split())
 
subs["ba some"] = {'b12':40,'b13':FL,'b14':FL,'b15':40,
 
                   'b32':40,'b33':FL,'b34':FL,'b35':40,}
 
subs['*curtain'] = subs['ba some'].copy()
 
subs["*marry"] = { "hotbox1" : 100,}
 
subs["*phone booth"] = { "phone" : 100,}
 
subs["*broadway open"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "main 11" : 100, "main 10" : 100, "b34" : 100, "b25" : 100, "b24" : 100,
 
    "b22" : 100, "desk2" : 78, "phone" : 46, "upfill3" : 69, "upfill2" : 100,
 
    "main 3" : 68, "main 2" : 100, "main 5" : 100, "main 4" : 100,
 
    "main 7" : 100, "main 9" : 100, "main 8" : 100, "edge" : 46,
 
    "sidepost1" : 100, "sidepost2" : 100, "marry2" : 100, "marry1" : 100,}
 
subs["*int mission"] = { "sidefill1" : 100, "main 4" : 100, "main 9" : 100,
 
    "main 8" : 100, "b24" : 100, "b23" : 100, "desk1" : 100, "desk2" : 100,
 
    "b22" : 100, "rock" : 100, "marry1" : 100, "cuba1" : 25, "cuba2" : 51,
 
    "main 10" : 100,}
 
subs["*broadway open"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "main 11" : 100, "main 10" : 100, "b34" : 100, "b25" : 100, "b24" : 100,
 
    "b22" : 100, "desk2" : 78, "phone" : 46, "hotbox1" : 100, "upfill3" : 69,
 
    "upfill2" : 100, "main 3" : 68, "main 2" : 100, "main 5" : 100,
 
    "main 4" : 100, "main 7" : 100, "hotbox2" : 100, "main 9" : 100,
 
    "main 8" : 100, "edge" : 46, "sidepost1" : 100, "sidepost2" : 100,
 
    "marry2" : 100, "marry1" : 100,}
 
subs["*broadway open"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "cycright" : 41, "upfill3" : 69, "upfill2" : 100, "upfill1" : 56,
 
    "side l" : 100, "b25" : 100, "cycleft" : 41, "b22" : 100, "desk2" : 78,
 
    "phone" : 46, "hotbox1" : 100, "upfill4" : 56, "b24" : 100, "side r" : 100,
 
    "main 11" : 100, "main 10" : 100, "main 3" : 68, "main 2" : 100,
 
    "main 5" : 100, "main 4" : 100, "main 7" : 100, "hotbox2" : 100,
 
    "main 9" : 100, "main 8" : 100, "b34" : 100, "edge" : 46, "god" : 100,
 
    "marry2" : 100, "marry1" : 100,}
 
subs["*broadway open"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "cycright" : 41, "upfill3" : 69, "upfill2" : 100, "upfill1" : 56,
 
    "b34" : 100, "b25" : 100, "side l" : 100, "b22" : 100, "desk2" : 78,
 
    "phone" : 80, "hotbox1" : 100, "upfill4" : 56, "b24" : 100, "side r" : 100,
 
    "main 11" : 100, "main 10" : 100, "main 3" : 100, "main 2" : 100,
 
    "main 5" : 100, "main 4" : 100, "main 7" : 100, "hotbox2" : 100,
 
    "main 9" : 100, "main 8" : 100, "cycleft" : 41, "edge" : 80,
 
    "god" : 100, "marry2" : 100, "marry1" : 100,}
 
subs["*int mission"] = { "sidefill2" : 51, "sidefill1" : 0, "upfill4" : 0,
 
    "main 11" : 100, "main 10" : 100, "b34" : 0, "b25" : 0, "b24" : 100,
 
    "b23" : 100, "desk1" : 53, "desk2" : 100, "b22" : 100, "hotbox2" : 85,
 
    "hotbox1" : 25, "b32" : 62, "upfill3" : 37, "upfill2" : 66, "main 3" : 0,
 
    "main 5" : 70, "main 4" : 100, "main 7" : 100, "main 9" : 100,
 
    "main 8" : 100, "rock" : 52, "marry2" : 100, "marry1" : 61, "cuba1" : 0,
 
    "cuba2" : 78,}
 
subs["*int mission"] = { "sidefill2" : 51, "sidefill1" : 0, "upfill4" : 0,
 
    "main 11" : 100, "main 10" : 100, "b34" : 0, "b25" : 0, "b24" : 100,
 
    "b23" : 100, "desk1" : 53, "desk2" : 100, "b22" : 100, "hotbox2" : 85,
 
    "hotbox1" : 25, "cycright" : 66, "b32" : 62, "upfill3" : 37,
 
    "upfill2" : 66, "main 3" : 57, "main 2" : 0, "main 5" : 70, "main 4" : 100,
 
    "main 7" : 100, "main 9" : 100, "main 8" : 100, "rock" : 52,
 
    "marry2" : 100, "marry1" : 61, "cuba1" : 0, "cuba2" : 78,}
 
subs["*hotbox dance"] = { "red3" : 100, "sidefill2" : 46, "red1" : 100,
 
    "cycright" : 19, "upfill3" : 32, "upfill2" : 46, "upfill1" : 26,
 
    "red2" : 100, "side l" : 46, "b25" : 46, "cycleft" : 19, "sidefill1" : 46,
 
    "desk2" : 36, "b22" : 46, "phone" : 37, "hotbox1" : 46, "upfill4" : 26,
 
    "b24" : 46, "side r" : 46, "main 11" : 46, "main 10" : 46, "main 3" : 46,
 
    "main 2" : 46, "main 5" : 46, "main 4" : 46, "main 7" : 46, "hotbox2" : 46,
 
    "main 9" : 46, "main 8" : 46, "red4" : 100, "b34" : 46, "edge" : 37,
 
    "god" : 100, "marry2" : 46, "marry1" : 46,}
 
subs["*hotbox dance"] = { "cycright" : 19, "upfill3" : 32, "upfill2" : 46,
 
    "upfill1" : 26, "sidefill2" : 0, "b25" : 0, "side l" : 46, "b23" : 0,
 
    "desk1" : 0, "desk2" : 0, "upfill4" : 26, "side r" : 46, "main 11" : 46,
 
    "main 10" : 46, "god" : 100, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0,
 
    "marry2" : 0, "marry1" : 0, "cuba1" : 0, "cuba2" : 0, "b13" : 0,
 
    "red3" : 100, "red2" : 100, "sidefill1" : 0, "b24" : 0, "red4" : 100,
 
    "b34" : 30, "cycleft" : 19, "b32" : 43, "b22" : 0, "phone" : 0,
 
    "hotbox1" : 42, "main 3" : 46, "main 2" : 46, "main 5" : 46,
 
    "main 4" : 46, "main 7" : 100, "hotbox2" : 78, "main 9" : 46,
 
    "main 8" : 46, "hotback" : 100, "rock" : 0, "red1" : 100,}
 
subs["*hotbox dance"] = { "cycright" : 19, "upfill3" : 32, "upfill2" : 46,
 
    "upfill1" : 26, "sidefill2" : 0, "b25" : 0, "side l" : 46, "b23" : 0,
 
    "desk1" : 0, "desk2" : 24, "upfill4" : 26, "side r" : 46, "main 11" : 46,
 
    "main 10" : 100, "god" : 100, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0,
 
    "marry2" : 0, "marry1" : 0, "cuba1" : 0, "cuba2" : 0, "b13" : 0,
 
    "red3" : 100, "red2" : 100, "sidefill1" : 0, "b24" : 0, "red4" : 100,
 
    "b34" : 30, "cycleft" : 19, "b32" : 43, "b22" : 0, "phone" : 0,
 
    "hotbox1" : 42, "main 3" : 46, "main 2" : 46, "main 5" : 100,
 
    "main 4" : 46, "main 7" : 100, "hotbox2" : 78, "main 9" : 46,
 
    "main 8" : 46, "hotback" : 100, "rock" : 0, "red1" : 100,}
 
subs["*hotbox table"] = { "sidefill2" : 0, "main 3" : 80, "main 2" : 62,
 
    "main 11" : 0, "main 4" : 29, "main 7" : 10, "main 9" : 64, "main 8" : 10,
 
    "b25" : 0, "b22" : 100, "phone" : 0, "edge" : 0, "b13" : 0, "marry2" : 0,
 
    "main 5" : 34, "marry1" : 0, "hotback" : 0, "cuba1" : 22, "cuba2" : 0,}
 
subs["*hotbox table"] = { "sidefill2" : 0, "main 11" : 0, "b25" : 0,
 
    "b22" : 100, "desk2" : 58, "phone" : 0, "main 3" : 80, "main 2" : 62,
 
    "main 5" : 34, "main 4" : 100, "main 7" : 10, "hotbox2" : 46,
 
    "main 9" : 64, "main 8" : 10, "edge" : 0, "b13" : 0, "rock" : 22,
 
    "marry2" : 0, "marry1" : 0, "hotback" : 0, "cuba1" : 22, "cuba2" : 0,}
 
subs["*hotbox small table"] = { "red3" : 100, "red2" : 100, "main 3" : 80,
 
    "main 2" : 62, "main 5" : 34, "main 4" : 100, "main 7" : 10,
 
    "red4" : 100, "main 9" : 64, "main 8" : 10, "rock" : 22, "red1" : 100,
 
    "desk2" : 58, "b22" : 100, "hotbox2" : 46, "upfill4" : 62, "god" : 100,
 
    "upfill1" : 62, "cuba1" : 22,}
 
subs["*hotbox small table"] = { "red3" : 100, "red2" : 100, "red1" : 100,
 
    "upfill4" : 62, "main 11" : 0, "main 10" : 0, "upfill1" : 62,
 
    "red4" : 100, "b25" : 5, "b22" : 100, "desk2" : 58, "desk1" : 52,
 
    "hotbox2" : 0, "sidefill2" : 0, "main 3" : 47, "main 2" : 0,
 
    "main 5" : 0, "main 4" : 0, "main 7" : 0, "phone" : 0, "main 9" : 11,
 
    "main 8" : 0, "god" : 100, "edge" : 0, "rock" : 0, "marry2" : 0,
 
    "marry1" : 0, "hotback" : 0, "cuba1" : 0, "cuba2" : 0,}
 
subs["*ext mission"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "cycright" : 41, "upfill3" : 69, "upfill2" : 100, "upfill1" : 56,
 
    "side l" : 100, "b25" : 100, "cycleft" : 41, "b22" : 100, "desk2" : 78,
 
    "phone" : 80, "hotbox1" : 100, "upfill4" : 56, "b24" : 100, "side r" : 100,
 
    "main 11" : 100, "main 10" : 100, "main 3" : 100, "main 2" : 100,
 
    "main 5" : 100, "main 4" : 100, "main 7" : 100, "hotbox2" : 100,
 
    "main 9" : 100, "main 8" : 100, "b34" : 100, "edge" : 80, "god" : 100,
 
    "marry2" : 100, "marry1" : 100,}
 
subs["*ext mission"] = { "sidefill2" : 100, "sidefill1" : 59,
 
    "cycright" : 53, "upfill3" : 0, "upfill2" : 0, "upfill1" : 0,
 
    "b34" : 100, "b25" : 100, "side l" : 100, "b23" : 100, "b22" : 49,
 
    "b32" : 80, "phone" : 0, "hotbox1" : 0, "upfill4" : 0, "b24" : 100,
 
    "desk2" : 78, "main 11" : 100, "main 10" : 100, "main 3" : 0,
 
    "main 2" : 100, "main 5" : 100, "main 4" : 0, "main 7" : 100,
 
    "hotbox2" : 100, "main 9" : 100, "main 8" : 100, "god" : 100,
 
    "cycleft" : 0, "edge" : 0, "b13" : 0, "rock" : 60, "marry2" : 100,
 
    "marry1" : 0, "side r" : 100,}
 
subs["*broadway night 1-7"] = { "sidefill2" : 37, "sidefill1" : 37,
 
    "cycright" : 15, "upfill3" : 25, "upfill2" : 37, "upfill1" : 20,
 
    "side l" : 37, "b25" : 37, "cycleft" : 15, "b22" : 37, "desk2" : 28,
 
    "phone" : 29, "hotbox1" : 37, "upfill4" : 20, "b24" : 37, "side r" : 37,
 
    "main 11" : 37, "main 10" : 37, "main 3" : 37, "main 2" : 37,
 
    "main 5" : 37, "main 4" : 37, "main 7" : 37, "hotbox2" : 37,
 
    "main 9" : 37, "main 8" : 37, "b34" : 37, "edge" : 29, "god" : 100,
 
    "marry2" : 37, "marry1" : 37,}
 
subs["*broadway night 1-7"] = { "sidefill2" : 37, "sidefill1" : 37,
 
    "upfill3" : 11, "upfill2" : 23, "b34" : 37, "b25" : 37, "b24" : 94,
 
    "b23" : 100, "b22" : 61, "desk2" : 28, "hotbox2" : 37, "hotbox1" : 37,
 
    "blue1" : 93, "main 11" : 37, "blue3" : 93, "blue2" : 93, "blue4" : 93,
 
    "main 10" : 37, "main 3" : 25, "main 2" : 37, "main 5" : 37,
 
    "main 4" : 37, "main 7" : 37, "main 9" : 37, "main 8" : 37, "edge" : 12,
 
    "god" : 100, "marry2" : 37, "marry1" : 37,}
 
subs["*broadway night 1-7"] = { "sidefill2" : 37, "sidefill1" : 37,
 
    "upfill3" : 11, "upfill2" : 23, "b34" : 37, "b25" : 37, "b24" : 94,
 
    "b23" : 100, "b22" : 61, "desk2" : 0, "desk1" : 0, "hotbox2" : 37,
 
    "hotbox1" : 0, "blue1" : 93, "main 11" : 37, "blue3" : 93, "blue2" : 93,
 
    "blue4" : 93, "main 10" : 37, "main 3" : 25, "main 2" : 37, "main 5" : 37,
 
    "main 4" : 37, "main 7" : 37, "main 9" : 37, "main 8" : 37, "edge" : 12,
 
    "god" : 100, "marry2" : 37, "marry1" : 37,}
 
subs["*broadway night 1-7"] = { "sidefill2" : 37, "sidefill1" : 37,
 
    "upfill3" : 11, "upfill2" : 23, "b34" : 28, "b25" : 37, "b24" : 94,
 
    "b23" : 100, "b22" : 82, "desk2" : 0, "desk1" : 0, "hotbox2" : 11,
 
    "hotbox1" : 0, "blue1" : 93, "main 11" : 37, "blue3" : 93, "blue2" : 93,
 
    "blue4" : 93, "main 10" : 37, "main 3" : 25, "main 2" : 37, "main 5" : 37,
 
    "main 4" : 37, "main 7" : 37, "main 9" : 37, "main 8" : 37, "edge" : 12,
 
    "god" : 100, "marry2" : 0, "marry1" : 37,}
 
subs["*cuba right"] = { "main 3" : 31, "main 2" : 0, "main 10" : 100,
 
    "b34" : 100, "b22" : 31, "desk2" : 85, "desk1" : 39, "edge" : 31,
 
    "sidefill1" : 7, "cuba1" : 100, "cuba2" : 100,}
 
subs["*cuba dance"] = { "sidefill2" : 100, "sidefill1" : 100,
 
    "upfill4" : 100, "upfill3" : 81, "upfill2" : 100, "upfill1" : 100,
 
    "b34" : 100, "b25" : 100, "b24" : 100, "b23" : 100, "desk1" : 100,
 
    "desk2" : 100, "b22" : 100, "phone" : 100, "main 11" : 100, "main 10" : 100,
 
    "main 3" : 100, "main 2" : 100, "main 5" : 100, "main 4" : 100,
 
    "main 7" : 100, "main 9" : 100, "main 8" : 100, "edge" : 100,
 
    "god" : 100, "marry2" : 100, "marry1" : 100, "hotback" : 100,
 
    "cuba1" : 100, "cuba2" : 100,}
 
subs["*cuba love"] = { "sidefill2" : 0, "sidefill1" : 0, "upfill4" : 61,
 
    "main 11" : 100, "main 10" : 100, "upfill1" : 61, "b25" : 100,
 
    "b24" : 100, "b23" : 100, "b22" : 100, "desk2" : 0, "desk1" : 0,
 
    "phone" : 0, "hotbox1" : 0, "upfill3" : 61, "upfill2" : 61, "main 3" : 0,
 
    "main 2" : 100, "main 5" : 100, "main 4" : 100, "main 7" : 100,
 
    "main 9" : 73, "main 8" : 100, "edge" : 0, "hotback" : 0, "marry2" : 0,
 
    "marry1" : 0, "cuba1" : 0, "cuba2" : 0,}
 
subs["*cuba love"] = { "sidefill2" : 0, "sidefill1" : 0, "upfill4" : 0,
 
    "main 11" : 28, "main 10" : 28, "upfill1" : 0, "b34" : 9, "b25" : 100,
 
    "b24" : 59, "b23" : 59, "b22" : 100, "desk2" : 0, "desk1" : 0,
 
    "phone" : 0, "hotbox1" : 0, "upfill3" : 43, "upfill2" : 43, "main 3" : 0,
 
    "main 2" : 100, "main 5" : 16, "main 4" : 16, "main 7" : 0, "main 9" : 73,
 
    "main 8" : 100, "edge" : 0, "marry2" : 9, "marry1" : 0, "hotback" : 0,
 
    "cuba1" : 0, "cuba2" : 0,}
 
subs["*cuba love"] = { "sidefill2" : 0, "sidefill1" : 0, "upfill4" : 0,
 
    "main 11" : 28, "main 10" : 28, "upfill1" : 0, "b34" : 9, "b25" : 100,
 
    "b24" : 59, "b23" : 59, "b22" : 100, "desk2" : 0, "desk1" : 0,
 
    "phone" : 0, "hotbox1" : 0, "upfill3" : 43, "upfill2" : 43, "main 3" : 0,
 
    "main 2" : 100, "main 5" : 16, "main 4" : 16, "main 7" : 0, "main 9" : 65,
 
    "main 8" : 74, "edge" : 0, "marry2" : 9, "marry1" : 0, "hotback" : 0,
 
    "cuba1" : 0, "cuba2" : 0,}
 
subs["*cuba love"] = { "sidefill2" : 0, "sidefill1" : 0, "upfill4" : 0,
 
    "main 11" : 28, "main 10" : 28, "upfill1" : 0, "b34" : 9, "b25" : 100,
 
    "b24" : 59, "b23" : 59, "b22" : 100, "desk2" : 16, "desk1" : 0,
 
    "phone" : 0, "hotbox1" : 0, "upfill3" : 43, "upfill2" : 43, "main 3" : 28,
 
    "main 2" : 100, "main 5" : 16, "main 4" : 16, "main 7" : 0, "main 9" : 65,
 
    "main 8" : 74, "edge" : 0, "marry2" : 9, "marry1" : 0, "hotback" : 0,
 
    "cuba1" : 0, "cuba2" : 0,}
 
subs["*ext mission night"] = { "sidefill2" : 39, "sidefill1" : 23,
 
    "cycright" : 20, "main 11" : 29, "main 10" : 29, "upfill1" : 8,
 
    "b34" : 39, "b25" : 39, "side l" : 39, "b23" : 39, "b22" : 19,
 
    "b32" : 31, "upfill4" : 8, "b24" : 39, "side r" : 39, "desk2" : 18,
 
    "main 2" : 39, "main 5" : 39, "main 9" : 39, "main 8" : 39, "god" : 100,
 
    "marry2" : 39,}
 
subs["*ext mission night"] = { "sidefill2" : 39, "sidefill1" : 23,
 
    "cycright" : 20, "main 11" : 29, "main 10" : 29, "upfill1" : 8,
 
    "b34" : 39, "b25" : 39, "side l" : 39, "b23" : 39, "b22" : 19,
 
    "b32" : 31, "upfill4" : 8, "b24" : 39, "side r" : 39, "desk2" : 18,
 
    "main 2" : 39, "main 5" : 39, "main 9" : 39, "main 8" : 39, "god" : 100,
 
    "marry2" : 39,}
 
subs["*ext mission night"] = { "cycright" : 6, "main 11" : 15,
 
    "main 10" : 15, "upfill1" : 0, "b25" : 25, "side l" : 39, "b23" : 25,
 
    "b22" : 5, "desk2" : 4, "upfill4" : 0, "side r" : 39, "upfill3" : 0,
 
    "upfill2" : 0, "patio1" : 0, "god" : 86, "edge" : 0, "b13" : 0,
 
    "sidepost2" : 0, "marry2" : 25, "marry1" : 0, "cuba1" : 5, "cuba2" : 0,
 
    "sidepost1" : 0, "sidefill2" : 25, "sidefill1" : 9, "b24" : 25,
 
    "b34" : 25, "cycleft" : 0, "b32" : 17, "desk1" : 0, "hotbox2" : 25,
 
    "hotbox1" : 0, "main 3" : 0, "main 2" : 25, "main 5" : 25, "main 4" : 25,
 
    "main 7" : 25, "phone" : 0, "main 9" : 25, "main 8" : 25, "patio2" : 0,
 
    "hotback" : 0, "rock" : 17,}
 
subs["*ext mission night"] = { "b32" : 27, "sidefill2" : 34, "sidefill1" : 20,
 
    "cycright" : 18, "main 11" : 34, "main 10" : 34, "upfill1" : 8,
 
    "b34" : 34, "b25" : 34, "side l" : 34, "b23" : 34, "b22" : 16,
 
    "desk2" : 26, "hotbox2" : 34, "upfill4" : 8, "b24" : 34, "side r" : 34,
 
    "main 2" : 34, "main 5" : 34, "main 4" : 25, "main 7" : 34, "main 9" : 34,
 
    "main 8" : 34, "rock" : 20, "god" : 100, "marry2" : 34, "cuba1" : 5,}
 
subs["*2-2"] = { "b32" : 27, "sidefill2" : 34, "sidefill1" : 20,
 
    "cycright" : 18, "main 11" : 34, "main 10" : 34, "upfill1" : 70,
 
    "b34" : 34, "b25" : 34, "side l" : 34, "b23" : 34, "b22" : 16,
 
    "desk2" : 26, "hotbox2" : 34, "upfill4" : 70, "b24" : 34, "side r" : 34,
 
    "main 2" : 34, "main 5" : 34, "main 4" : 25, "main 7" : 34, "main 9" : 34,
 
    "main 8" : 34, "rock" : 20, "god" : 100, "marry2" : 34, "cuba1" : 5,}
 
subs["*2-2"] = { "sidefill2" : 0, "sidefill1" : 0, "cycright" : 18,
 
    "main 11" : 5, "main 10" : 5, "upfill1" : 70, "b34" : 34, "b25" : 71,
 
    "side l" : 34, "b23" : 67, "b22" : 50, "b32" : 57, "desk1" : 0,
 
    "hotbox2" : 59, "upfill4" : 70, "b24" : 67, "desk2" : 26, "main 3" : 0,
 
    "main 2" : 5, "main 5" : 5, "main 4" : 0, "main 7" : 5, "main 9" : 5,
 
    "main 8" : 5, "rock" : 20, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0,
 
    "god" : 100, "marry2" : 50, "cuba1" : 0, "side r" : 34,}
 
subs["*sewer"] = { "main 10" : 71, "upfill4" : 100, "main 11" : 66,
 
    "main 4" : 71, "upfill1" : 88, "main 8" : 71, "main 7" : 71,
 
    "main 5" : 100, "hotbox1" : 88, "hotback" : 66, "marry2" : 66,
 
    "upfill3" : 88, "marry1" : 66, "upfill2" : 100,}
 
subs["*2-2"] = { "sidefill2" : 0, "sidefill1" : 0, "cycright" : 18,
 
    "main 11" : 5, "main 10" : 5, "upfill1" : 70, "b34" : 34, "b25" : 71,
 
    "side l" : 34, "b23" : 67, "b22" : 50, "b32" : 57, "desk1" : 0,
 
    "hotbox2" : 59, "upfill4" : 70, "b24" : 67, "desk2" : 26, "main 3" : 0,
 
    "main 2" : 5, "main 5" : 56, "main 4" : 0, "main 7" : 5, "main 9" : 5,
 
    "main 8" : 5, "rock" : 20, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0,
 
    "god" : 100, "marry2" : 50, "cuba1" : 0, "side r" : 34,}
 
subs["*sewer"] = { "sidefill2" : 33, "sidefill1" : 33, "upfill4" : 10,
 
    "upfill3" : 22, "main 10" : 48, "upfill1" : 14, "b25" : 16, "b24" : 19,
 
    "b23" : 46, "b22" : 50, "hotbox1" : 0, "main 11" : 40, "upfill2" : 61,
 
    "main 2" : 54, "main 5" : 20, "main 4" : 45, "main 7" : 0, "main 9" : 84,
 
    "main 8" : 45, "hotback" : 40, "marry2" : 0, "marry1" : 0,}
 
subs["*sewer"] = { "sidefill2" : 33, "sidefill1" : 33, "upfill4" : 10,
 
    "upfill3" : 22, "main 10" : 48, "upfill1" : 14, "b25" : 16, "b24" : 19,
 
    "b23" : 64, "b22" : 50, "hotbox1" : 0, "main 11" : 40, "upfill2" : 61,
 
    "main 2" : 54, "main 5" : 20, "main 4" : 45, "main 7" : 0, "main 9" : 84,
 
    "main 8" : 45, "hotback" : 40, "sidepost1" : 31, "sidepost2" : 31,
 
    "marry2" : 0, "marry1" : 0,}
 
subs["*sewer"] = { "sidefill2" : 33, "sidefill1" : 33, "upfill4" : 10,
 
    "upfill3" : 22, "main 10" : 48, "upfill1" : 14, "b25" : 16, "b24" : 19,
 
    "b23" : 64, "b22" : 50, "hotbox1" : 0, "main 11" : 40, "upfill2" : 61,
 
    "main 2" : 54, "main 5" : 20, "main 4" : 45, "main 7" : 0, "main 9" : 84,
 
    "main 8" : 45, "hotback" : 40, "sidepost1" : 31, "sidepost2" : 31,
 
    "marry2" : 0, "marry1" : 0, "cuba1" : 59,}
 
subs["*marry"] = { "b32" : 23, "sidefill2" : 30, "sidefill1" : 17,
 
    "cycright" : 15, "main 11" : 30, "main 10" : 30, "upfill1" : 48,
 
    "b34" : 30, "b25" : 30, "side l" : 30, "b23" : 30, "b22" : 14,
 
    "desk2" : 23, "hotbox2" : 30, "upfill4" : 48, "b24" : 30, "side r" : 30,
 
    "main 3" : 30, "main 2" : 30, "main 5" : 30, "main 4" : 22, "main 7" : 30,
 
    "main 9" : 30, "main 8" : 30, "rock" : 17, "edge" : 15, "god" : 100,
 
    "marry2" : 30, "cuba1" : 4,}
 
subs["*marry"] = { "sidefill2" : 0, "sidefill1" : 0, "cycright" : 100,
 
    "main 11" : 55, "main 10" : 55, "upfill1" : 48, "b34" : 30, "b25" : 0,
 
    "side l" : 30, "b23" : 100, "b22" : 14, "b32" : 23, "main 4" : 0,
 
    "hotbox2" : 43, "hotbox1" : 49, "upfill4" : 48, "b24" : 100,
 
    "desk2" : 23, "patio2" : 0, "main 3" : 0, "main 2" : 30, "main 5" : 0,
 
    "patio1" : 0, "main 7" : 30, "phone" : 0, "main 9" : 30, "main 8" : 0,
 
    "rock" : 17, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0, "god" : 100,
 
    "marry2" : 34, "marry1" : 69, "cuba1" : 0, "cuba2" : 0, "side r" : 30,}
 
subs["*marry"] = { "sidefill2" : 0, "sidefill1" : 0, "cycright" : 100,
 
    "main 11" : 55, "main 10" : 55, "upfill1" : 48, "b34" : 30, "patio1" : 0,
 
    "b25" : 0, "side l" : 30, "b23" : 100, "b22" : 14, "b32" : 23,
 
    "hotbox2" : 43, "hotbox1" : 49, "upfill4" : 48, "b24" : 100,
 
    "desk2" : 23, "patio2" : 0, "main 3" : 0, "main 2" : 30, "main 5" : 0,
 
    "main 4" : 0, "main 7" : 30, "phone" : 0, "main 9" : 30, "main 8" : 0,
 
    "rock" : 17, "edge" : 0, "sidepost1" : 0, "sidepost2" : 0, "god" : 100,
 
    "marry2" : 34, "marry1" : 69, "cuba1" : 0, "cuba2" : 0, "side r" : 30,}
light8/Cue.py
Show inline comments
 
"""And that's my cue to exit(0)..."""
 
from time import time
 
from util import subsetdict
 

	
 
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 -> %f" % (channel, endlevel), starttime, dur)
 
        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(elapsed) / self.dur
 
            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}
 

	
 
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
light8/Fader.py
Show inline comments
 
from Tix import *
 
from time import time # time is on my side
 
from util import subsetdict
 
from FlyingFader import FlyingFader
 

	
 
# statuses are:
 
# stopped - no cue is loaded or cue is stopped
 
# running - cue is running, not complete
 
# finished - cue is finished, next is loaded
 

	
 
stdfont = ('Arial', 10)
 

	
 
def get_selection(listbox):
 
    'Given a listbox, returns first selection as integer'
 
    selection = int(listbox.curselection()[0]) # blech
 
    return selection
 

	
 
class Fader(Frame):
 
    'User interface for cue fader'
 
    def __init__(self, master, cues, scalelevels):
 
        self.master = master
 
        self.cues = cues
 
        self.scalelevels = scalelevels
 
        self.time_start = 0
 
        self.init_layout()
 
        self.stop()
 
    def init_layout(self):
 
        Frame.__init__(self, self.master)
 

	
 
        # info variables
 
        self.cuename = StringVar()
 
        self.cuelength = DoubleVar()
 
        self.cuetarget = StringVar()
 

	
 
        # info about a running cue
 
        self.cuestatus = StringVar() # text description
 
        self.cuestatus.set("stopped")
 
        
 
        self.cuepercent = DoubleVar() # percent complete
 
        self.cuepercent.set(0)
 
        self.cuepercent.trace('w', self.update_percent)
 
        self.cuetimeelapse = StringVar() # time elapsed
 
        self.cuetimeelapse.set('0s')
 
        self.cuetimeleft = StringVar() # time left
 
        self.cuetimeleft.set('0s')
 

	
 
        buttonframe = Frame(self)
 
        topframe = Frame(self) # to contain cue list and infoframe
 
        infoframe = Frame(topframe)
 
        topframe.pack()
 

	
 
        self.listbox = ScrolledListBox(buttonframe, 
 
        self.listbox = ScrolledListBox(topframe, 
 
            command=self.update_selection)
 
        self.listbox.listbox.configure({'exportselection' : 0, 
 
            'selectmode' : EXTENDED})
 
        for c in self.cues:
 
            self.listbox.listbox.insert(END, c.name)
 
        self.listbox.pack(side=TOP)
 
        self.listbox.pack(side=LEFT)
 
        self.listbox.listbox.bind("<<ListboxSelect>>", self.update_selection, 
 
            add=1)
 
        Button(buttonframe, text="Go", command=self.go, font=stdfont,
 
            bg='green').pack(side=LEFT)
 
        Button(buttonframe, text="Stop", command=self.stop, font=stdfont,
 
            bg='red').pack(side=LEFT)
 
        Button(buttonframe, text="Prev", command=self.prev, 
 
            font=stdfont).pack(side=LEFT)
 
        Button(buttonframe, text="Next", command=self.next, 
 
            font=stdfont).pack(side=LEFT)
 
        nextbutton = Button(buttonframe, text="Next", command=self.next, 
 
            font=stdfont)
 
        # Button(buttonframe, text="Load", command=self.mark_start, bg='grey80',
 
            # font=stdfont).pack(side=LEFT)
 

	
 
        infoframe = Frame(self)
 
        Label(infoframe, textvariable=self.cuename, 
 
            font=('Arial', 12), bg='lightBlue').grid(columnspan=4, sticky=NE+SW)
 

	
 
        Label(infoframe, text="Length", font=stdfont, 
 
            bg='lightPink').grid(row=1, sticky=NE+SW)
 
        Label(infoframe, textvariable=self.cuelength, 
 
            font=stdfont).grid(row=1, column=1, columnspan=3, sticky=NE+SW)
 

	
 
        Label(infoframe, text="Target", font=stdfont,
 
            bg='lightPink', wraplength=50).grid(row=2, sticky=NE+SW)
 
            bg='lightPink').grid(row=2, sticky=NE+SW)
 
        Label(infoframe, textvariable=self.cuetarget, 
 
            font=stdfont).grid(row=2, column=1, columnspan=3, sticky=NE+SW)
 
            font=stdfont, wraplength=250).grid(row=2, column=1, columnspan=3, 
 
                sticky=NE+SW)
 

	
 
        Label(infoframe, text="Status", font=stdfont,
 
            bg='lightPink').grid(row=3, sticky=NE+SW)
 
        Label(infoframe, textvariable=self.cuestatus, 
 
            font=stdfont).grid(row=3, column=1, columnspan=3, sticky=NE+SW)
 

	
 
        Label(infoframe, text="Time Elapsed", font=stdfont,
 
            bg='lightPink').grid(row=4, sticky=NE+SW)
 
        Label(infoframe, textvariable=self.cuetimeelapse, 
 
            font=stdfont).grid(row=4, column=1, sticky=NE+SW)
 

	
 
        Label(infoframe, text="Time Remain", font=stdfont,
 
            bg='lightPink').grid(row=4, column=2, sticky=NE+SW)
 
        Label(infoframe, textvariable=self.cuetimeleft, 
 
            font=stdfont).grid(row=4, column=3, sticky=NE+SW)
 

	
 
        Label(infoframe, text="Percent Complete", font=stdfont,
 
            bg='lightPink').grid(row=5, column=0, sticky=NE+SW)
 
        self.percentlabel = Label(infoframe, 
 
            font=stdfont)
 
        self.percentlabel.grid(row=5, column=1, columnspan=3, sticky=NE+SW)
 

	
 
        s = Scale(infoframe, variable=self.cuepercent,
 
        # s = Scale(infoframe, variable=self.cuepercent,
 
        s = Scale(buttonframe, variable=self.cuepercent,
 
                        showvalue=0, length=220,
 
                        width=18, sliderlength=30,
 
                        to=100,res=.1,from_=0,bd=1, font=stdfont,
 
                        orient='horiz')
 
        s.grid(row=6, columnspan=4, sticky='ew')
 
        # s.grid(row=6, columnspan=4, sticky='ew')
 
        nextbutton.pack(side=RIGHT)
 
        s.pack(side=RIGHT, expand=1, fill=X)
 

	
 
        infoframe.pack(side=RIGHT, fill=BOTH, expand=1)
 
        buttonframe.pack(side=BOTTOM)
 
        buttonframe.pack(side=BOTTOM, expand=1, fill=X)
 

	
 
        self.listbox.listbox.select_set(0)
 
        self.update_selection()
 
    def mark_start(self):
 
        self.time_start = time()
 
        startlevels = dict([(k, v.get()) for k, v in self.scalelevels.items()])
 
        # print "going to mark with", startlevels
 
        self.current.start(startlevels, self.time_start)
 
    def update_percent(self, *args):
 
        if self.cuestatus.get() != 'running':
 
            self.cuestatus.set("running")
 
            self.time_start = time()
 
            startlevels = dict([(k, v.get()) 
 
                for k, v in self.scalelevels.items()])
 
            self.current.start(startlevels, self.time_start)
 
            self.mark_start()
 

	
 
        percent = self.cuepercent.get()
 
        self.percentlabel.config(text='%.1f%%' % percent)
 
        percent /= 100
 

	
 
        elapsed = percent * self.current.dur
 
        self.cuetimeelapse.set('%.1fs' % elapsed)
 
        self.cuetimeleft.set('%.1fs' % (self.current.dur - elapsed))
 

	
 
        newlevels = self.current.get_levels(self.time_start + elapsed)
 
        # print "newlevels", newlevels
 
        for ch, lev in newlevels.items():
 
            try:
 
                self.scalelevels[ch].set(lev / 100.0)
 
                self.scalelevels[ch].set(lev)
 
            except KeyError:
 
                pass
 

	
 
    def update_selection(self, *args):
 
        selection = int(self.listbox.listbox.curselection()[0]) # blech
 
        self.cuestatus.set('stopped')
 
        selection = get_selection(self.listbox.listbox)
 
        self.current = self.cues[selection]
 
        self.cuename.set(self.current.name)
 
        self.cuelength.set(self.current.dur)
 
        target = ', '.join(['%s -> %.1f' % (n, lev) 
 
        target = ', '.join(['%s -> %.2f' % (n, lev) 
 
            for n, lev in self.current.get_end_levels().items()])
 
        self.cuetarget.set(target)
 
        self.cuetimeelapse.set('0s')
 
        self.cuetimeleft.set('%.1fs' % self.current.dur)
 
        self.cuepercent.set(0)
 
    def go(self):
 
        self.update_selection()
 
        self.cuestatus.set("running")
 
        self.time_start = time()
 
        startlevels = dict([(k, v.get()) for k, v in self.scalelevels.items()])
 
        self.current.start(startlevels, self.time_start)
 
        self.mark_start()
 
        self.running_loop()
 
    def stop(self):
 
        self.cuestatus.set('stopped')
 
    def prev(self):
 
        self.cuestatus.set('stopped')
 
        selection = int(self.listbox.listbox.curselection()[0]) # blech
 
        self.stop()
 
        selection = get_selection(self.listbox.listbox)
 
        if selection != 0:
 
            self.listbox.listbox.select_clear(selection)
 
            self.listbox.listbox.select_set(selection - 1)
 
            self.update_selection()
 
            self.mark_start()
 
    def next(self):
 
        self.cuestatus.set('stopped')
 
        selection = int(self.listbox.listbox.curselection()[0]) # blech
 
        self.stop()
 
        selection = get_selection(self.listbox.listbox)
 
        if selection != self.listbox.listbox.size() - 1:
 
            self.listbox.listbox.select_clear(selection)
 
            self.listbox.listbox.select_set(selection + 1)
 
            self.update_selection()
 
            self.mark_start()
 
    def running_loop(self):
 
        if self.cuestatus.get() == 'stopped':
 
            return
 
        curtime = time()
 
        elapsed = (curtime - self.time_start)
 

	
 
        if elapsed > self.current.dur:
 
            self.cuestatus.set('finished')
 
            self.cuestatus.set('stopped')
 
            self.cuepercent.set(100)
 

	
 
            # advance cues if okay
 
            self.next()
 
            return
 

	
 
        self.cuepercent.set(100 * elapsed / self.current.dur)
 
        self.after(30, self.running_loop)
light8/rsn.py
Show inline comments
 
#!/usr/bin/env python
 
from __future__ import nested_scopes
 

	
 
from Tix import *
 
from time import sleep
 
from signal import signal, SIGINT
 
import sys, cPickle
 

	
 
import io
 
from uihelpers import *
 
from panels import *
 
from Xfader import *
 
from subediting import Subediting
 
from Fader import Fader
 
import stage
 

	
 

	
 
if len(sys.argv) >= 2:
 
    DUMMY = 0
 
    print "This is the real thing, baby"
 
    window_title = "Light 8.8 (On Air)"
 
else:
 
    DUMMY = 1
 
    print "Dummy mode"
 
    window_title = "Light 8.8 (Bogus)"
 

	
 
root = Tk()
 
root.wm_title(window_title)
 
root.wm_geometry('+462+470')
 
root.tk_focusFollowsMouse()
 

	
 
import Subs, Patch
 

	
 
def get_data(*args):
 
    Subs.reload_data(DUMMY)
 
    Patch.reload_data(DUMMY)
 
    print "Patch:", Patch.patch
 
    print "Subs:", ', '.join(Subs.subs.keys())
 

	
 
get_data()
 

	
 
parportdmx = io.ParportDMX(DUMMY)
 

	
 
class Lightboard:
 
    def __init__(self, master):
 
        self.master = master
 

	
 
        self.channel_levels = []
 
        self.scalelevels = {}
 
        self.xfader = Xfader(self.scalelevels) # doesn't draw any UI yet-- look for self.xfader.setupwidget()
 
        self.oldlevels = [None] * 68 # never replace this; just clear it
 
        self.subediting = Subediting(currentoutputlevels=self.oldlevels)
 

	
 
        self.buildinterface()
 
        self.load()
 
        self.backgroundloop()
 
        
 
    def buildinterface(self):
 
        global DUMMY
 
        for w in self.master.winfo_children():
 
            w.destroy()
 

	
 
        stage_tl = toplevelat(22,30)
 
        s = stage.Stage(stage_tl)
 
        stage.createlights(s)
 
        s.setsubediting(self.subediting)
 
        s.pack()
 

	
 
        sub_tl = toplevelat(0,0)
 
        effect_tl = toplevelat(462,4)
 

	
 
        self.subpanels = Subpanels(sub_tl, effect_tl, self, self.scalelevels,
 
                                   Subs, self.xfader, self.changelevel,
 
                                   self.subediting, Subs.longestsubname())
 

	
 
        leveldisplay_tl = toplevelat(873,400)
 
        leveldisplay_tl.bind('<Escape>', sys.exit)
 

	
 
        self.leveldisplay = Leveldisplay(leveldisplay_tl, self.channel_levels)
 
        for i in range(0,len(self.channel_levels)):
 
            self.channel_levels[i].config(text=self.oldlevels[i])
 
            colorlabel(self.channel_levels[i])
 

	
 
        Console(self)
 

	
 
        # root frame
 
        controlpanel = Controlpanel(root, self.xfader, self.refresh, self.quit)
 
        
 
        xf=Frame(root)
 
        xf.pack(side='right')
 

	
 
        root.bind('<q>', self.quit)
 
        root.bind('<r>', self.refresh)
 
        leveldisplay_tl.bind('<q>', self.quit)
 
        leveldisplay_tl.bind('<r>', self.refresh)
 

	
 
        self.xfader.setupwidget(xf)
 
        controlpanel.pack()
 

	
 
        # cuefader_tl = toplevelat(98, 480)
 
        # cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels)
 
        # cuefader.pack()
 
        cuefader_tl = toplevelat(78, 480)
 
        cuefader = Fader(cuefader_tl, Subs.cues, self.scalelevels)
 
        cuefader.pack()
 

	
 
    def refresh(self, *args):
 
        'rebuild interface, reload data'
 
        get_data()
 
        self.subediting.refresh()
 
        self.buildinterface()
 
        bindkeys(root,'<Escape>', self.quit)
 

	
 
    def stageassub(self):
 
        """returns the current onstage lighting as a levels
 
        dictionary, skipping the zeros, and using names where
 
        possible"""
 
        levs=self.oldlevels
 
        
 
        return dict([(Patch.get_channel_name(i),l) for i,l
 
                     in zip(range(1,len(levs)+1),levs)
 
                     if l>0])
 
    def save_sub(self, name, levels):
 
        if not name:
 
            print "Enter sub name in console."
 
            return
 

	
 
        st = ''
 
        linebuf = 'subs["%s"] = {' % name
 
        for channame,lev in levels.items():
 
            if len(linebuf) > 60: 
 
                st += linebuf + '\n   '
 
                linebuf = ''
 

	
 
            linebuf += ' "%s" : %d,' % (channame, lev)
 
        st += linebuf + '}\n'
 
        if DUMMY:
 
            filename = 'ConfigDummy.py'
 
        else:
 
            filename = 'Config.py'
 
        f = open(filename, 'a')
 
        f.write(st)
 
        f.close()
 
        print 'Added sub:', st
 
        self.refresh()
 

	
 
    # this is called on a loop, and ALSO by the Scales
 
    def changelevel(self, *args):
 
        'Amp trims slider'
 

	
 
        levels = [0] * 68
 
        for name, s in Subs.subs.items():
 
            newlevels = s.get_levels(level=self.scalelevels[name].get())
0 comments (0 inline, 0 general)