Changeset - 5322639d61e9
[Not reviewed]
default
0 2 0
Drew Perttula - 20 years ago 2005-06-18 02:14:45
drewp@bigasterisk.com
refactoring and little fixes in curvecalc and keyboardcomposer
font change in KC, cleanup of CC's main section, maybe some little
fixes that i can't remember because darcs doesn't show the changes
at the same time i'm writing this message
2 files changed with 67 insertions and 47 deletions:
0 comments (0 inline, 0 general)
bin/curvecalc
Show inline comments
 
@@ -22,12 +22,17 @@ from light9.wavelength import wavelength
 
from light9.uihelpers import toplevelat
 

	
 
class Music:
 
    def __init__(self):
 
        self.player=None # xmlrpc Proxy to player
 
        self.recenttime=0
 

	
 
        dispatcher.connect(self.seekplay_or_pause,"music seek")
 

	
 
    def seekplay_or_pause(self,t):
 
        self.music.seekplay_or_pause(t)
 
        
 
    def current_time(self):
 
        """return deferred which gets called with the current time"""
 
        if self.player is None:
 
            self.player = Proxy(networking.musicUrl())
 
#            d = self.player.callRemote("songlength")
 
@@ -152,16 +157,47 @@ class Subtermview(tk.Frame):
 
        sev=Subexprview(self,self.subterm.subexpr)
 
        sev.pack(side='left',fill='both',exp=1)
 

	
 
class Output:
 
    lastsendtime=0
 
    lastsendlevs=None
 
    def __init__(self,subterms):
 
        make_attributes_from_args('subterms')
 
    def __init__(self,subterms,music):
 
        make_attributes_from_args('subterms','music')
 

	
 
        self.recent_t=[]
 
        self.later = None
 

	
 
        self.update()
 
        
 
    def update(self):
 
        d = music.current_time()
 
        d.addCallback(self.update2)
 
        d.addErrback(self.updateerr)
 
        
 
    def updateerr(self,e):
 

	
 
        print e.getTraceback()
 
        dispatcher.send("update status",val=e.getErrorMessage())
 
        if self.later and not self.later.cancelled and not self.later.called:
 
            self.later.cancel()
 
        self.later = reactor.callLater(1,self.update)
 
        
 
    def update2(self,t):
 
        dispatcher.send("update status",
 
                        val="ok: receiving time from music player")
 
        if self.later and not self.later.cancelled and not self.later.called:
 
            self.later.cancel()
 

	
 
        self.later = reactor.callLater(.05, self.update)
 

	
 
        self.recent_t = self.recent_t[-50:]+[t]
 
        period = (self.recent_t[-1] - self.recent_t[0]) / len(self.recent_t)
 
        dispatcher.send("update period", val=period)
 
        self.send_dmx(t)
 
        
 
    def send_dmx(self,t):
 

	
 
        scaledsubs=[]
 
        for st in self.subterms:
 
            scl = st.scaled(t)
 
            scaledsubs.append(scl)
 
        out = Submaster.sub_maxes(*scaledsubs)
 
        levs = out.get_levels()
 
@@ -209,14 +245,16 @@ class SubtermSetView(tk.Frame):
 

	
 
        self.cur_col += 1
 
        self.cur_col %= self.ncols
 
        if self.cur_col == 0:
 
            self.cur_row += 1
 

	
 
def add_one_subterm(subname, curveset, subterms, root, ssv, expr=''):
 
    expr = expr or '%s(t)' % subname
 
def add_one_subterm(subname, curveset, subterms, root, ssv, expr=None):
 
    if expr is None:
 
        expr = '%s(t)' % subname
 

	
 
    term = Subterm(Submaster.Submaster(subname), Subexpr(curveset,expr))
 
    subterms.append(term)
 

	
 
    stv=Subtermview(ssv,term)
 
    # stv.pack(side='top',fill='x')
 

	
 
@@ -240,13 +278,26 @@ def sub_commands_tk(master, curveset, su
 
    tk.Label(f, text="new subterm named:").pack(side='left')
 
    entry = tk.Entry(f, textvariable=newname)
 
    entry.pack(side='left', fill='x', exp=1)
 
    entry.bind("<Key-Return>", lambda evt: add_cmd())
 

	
 
    return f
 
    
 

	
 
def add_subterms_from_file(filename, curveset, subterms, root, ssv):
 
    for line in file(filename):
 
        try:
 
            subname,expr = line.strip().split(" ",1)
 
        except ValueError:
 
            subname = line.strip()
 
            expr = ""
 

	
 
        term = add_one_subterm(subname, curveset, subterms, root, ssv, expr)
 

	
 
        # stv=Subtermview(root,term)
 
        # stv.pack(side='top',fill='x')
 

	
 
#######################################################################
 
root=tk.Tk()
 
root.tk_setPalette("gray50")
 
toplevelat("curvecalc",root)
 
root.tk_focusFollowsMouse()
 

	
 
@@ -256,13 +307,12 @@ options,args = parser.parse_args()
 
try:
 
    song = args[0]
 
except IndexError:
 
    raise SystemExit("song name is required, e.g. '05-mix'")
 

	
 
music=Music()
 
dispatcher.connect(lambda t: music.seekplay_or_pause(t),"music seek")
 

	
 
zc = Zoomcontrol(root)
 
zc.pack(side='top',fill='x')
 

	
 
curveset = Curveset()
 
csv = Curvesetview(root,curveset)
 
@@ -279,25 +329,16 @@ dispatcher.send("max time",maxtime=maxti
 
dispatcher.connect(lambda: maxtime, "get max time",weak=0)
 
curveset.load(basename=os.path.join(showconfig.curvesDir(),song))
 

	
 
subterms = []
 
sub_commands_tk(root, curveset, subterms, root, ssv).pack(side='top',fill='x')
 

	
 
for line in file(showconfig.subtermsForSong(song)):
 
    try:
 
        subname,expr = line.strip().split(" ",1)
 
    except ValueError:
 
        subname = line.strip()
 
        expr = ""
 
add_subterms_from_file(showconfig.subtermsForSong(song),
 
                       curveset, subterms, root, ssv)
 

	
 
    term = add_one_subterm(subname, curveset, subterms, root, ssv, expr)
 
    
 
    # stv=Subtermview(root,term)
 
    # stv.pack(side='top',fill='x')
 

	
 
out = Output(subterms)
 
out = Output(subterms, music)
 

	
 
def savekey(*args):
 
    print "saving",song
 
    savesubterms(showconfig.subtermsForSong(song),subterms)
 
    curveset.save(basename=os.path.join(showconfig.curvesDir(),song))
 
    print "saved"
 
@@ -308,38 +349,12 @@ root.bind("<Control-Key-r>", lambda evt:
 
create_status_lines(root)
 
for helpline in ["Bindings: C-s save subterms; B1 drag point; C-B1 curve add point; 1..5 add point at time; Esc see current time; S-Esc see curtime to end; Mousewheel zoom; C-p play/pause music at mouse",
 
                 "Available in functions: nsin/ncos period=amp=1; within(a,b) bef(x) aft(x) compare to time; smoove(x) cubic smoothstep; curvename(t) eval curve"]:
 
    tk.Label(root,text=helpline, font="Helvetica -12 italic",
 
             anchor='w').pack(side='top',fill='x')
 

	
 
recent_t=[]
 
later = None
 
def update():
 
    global later
 
    d = music.current_time()
 
    d.addCallback(update2)
 
    d.addErrback(updateerr)
 
def updateerr(e):
 
    global later
 
    dispatcher.send("update status",val=e.getErrorMessage())
 
    if later and not later.cancelled and not later.called: later.cancel()
 
    later = reactor.callLater(1,update)
 
def update2(t):
 
    global recent_t,later
 
    dispatcher.send("update status",
 
                    val="ok: receiving time from music player")
 
    if later and not later.cancelled and not later.called: later.cancel()
 
    
 
    later = reactor.callLater(.05,update)
 

	
 
    recent_t = recent_t[-50:]+[t]
 
    period = (recent_t[-1]-recent_t[0])/len(recent_t)
 
    dispatcher.send("update period",val=period)
 
    out.send_dmx(t)
 
update()
 

	
 
#def logprint(msg):
 
#    print "log",msg
 
#twisted.python.log.addObserver(logprint)
 

	
 
root.bind("<Control-Key-q>",lambda ev: reactor.stop)
 
root.bind("<Destroy>",lambda ev: reactor.stop)
bin/keyboardcomposer
Show inline comments
 
@@ -43,13 +43,13 @@ class SubScale(Scale, Fadable):
 
class SubmasterTk(Frame):
 
    def __init__(self, master, name, current_level):
 
        Frame.__init__(self, master, bd=1, relief='raised', bg='black')
 
        self.slider_var = DoubleVar()
 
        self.slider_var.set(current_level)
 
        self.scale = SubScale(self, variable=self.slider_var, width=20)
 
        namelabel = Label(self, text=name, font="Arial 11", bg='black',
 
        namelabel = Label(self, text=name, font="Arial 9", bg='black',
 
            fg='white')
 
        namelabel.pack(side=TOP)
 
        levellabel = Label(self, textvariable=self.slider_var, font="Arial 11",
 
            bg='black', fg='white')
 
        levellabel.pack(side=TOP)
 
        self.scale.pack(side=BOTTOM, expand=1, fill=BOTH)
 
@@ -276,7 +276,12 @@ if __name__ == "__main__":
 
        print e
 

	
 
    root.protocol('WM_DELETE_WINDOW', reactor.stop)
 
    reactor.addSystemEventTrigger('after', 'shutdown', kc.save)
 
    
 
    tksupport.install(root,ms=10)
 
    reactor.run()
 
    if 0:
 
        sys.path.append("/home/drewp/projects/cuisine/pour")
 
        from utils import runstats
 
        runstats("reactor.run()")
 
    else:
 
        reactor.run()
0 comments (0 inline, 0 general)