diff --git a/flax/KeyboardComposer.py b/flax/KeyboardComposer.py --- a/flax/KeyboardComposer.py +++ b/flax/KeyboardComposer.py @@ -188,9 +188,9 @@ class KeyboardComposer(Frame): self.send_levels() self.after(10, self.send_frequent_updates) def send_levels(self): - print self.submasters.get_sub_by_name('frontwhite') levels = self.get_dmx_list() - dmxclient.outputlevels(levels) + # dmxclient.outputlevels(levels) + # print "sending levels", levels def send_levels_loop(self): self.send_levels() self.after(1000, self.send_levels_loop) diff --git a/flax/Submaster.py b/flax/Submaster.py --- a/flax/Submaster.py +++ b/flax/Submaster.py @@ -57,15 +57,20 @@ class Submaster: def max(self, *othersubs): return sub_maxes(self, *othersubs) def __repr__(self): - return "<%s: %r>" % (self.name, self.levels) + levels = ' '.join(["%s:%.2f" % item for item in self.levels.items()]) + return "<'%s': [%s]>" % (self.name, levels) def get_dmx_list(self): leveldict = self.get_levels() # gets levels of sub contents levels = [0] * 68 for k, v in leveldict.items(): - levels[Patch.get_dmx_channel(k) - 1] = v + dmxchan = Patch.get_dmx_channel(k) - 1 + levels[dmxchan] = max(v, levels[dmxchan]) return levels + def normalize_patch_names(self): + # possibly busted -- don't use unless you know what you're doing + self.set_all_levels(self.levels.copy()) def sub_maxes(*subs): return Submaster("max(%r)" % (subs,), @@ -80,7 +85,9 @@ class Submasters: files = os.listdir('subs') for filename in files: - if filename.startswith('.') or filename.endswith('~'): + # we don't want these files + if filename.startswith('.') or filename.endswith('~') or \ + filename.startswith('CVS'): continue self.submasters[filename] = Submaster(filename) def get_all_subs(self): @@ -94,6 +101,10 @@ class Submasters: if __name__ == "__main__": Patch.reload_data() s = Submasters() - newsub = s['newsub'] - newsub.set_all_levels({'5' : 1, '7': 0.2}) print s.get_all_subs() + if 0: # turn this on to normalize all subs + for sub in s.get_all_subs(): + print "before", sub + sub.normalize_patch_names() + sub.save() + print "after", sub diff --git a/flax/Timeline.py b/flax/Timeline.py --- a/flax/Timeline.py +++ b/flax/Timeline.py @@ -137,7 +137,7 @@ class SmoothBlender(Blender): class Strobe(Blender): "Strobes the frame on the right side between offlevel and onlevel." def __init__(self, ontime, offtime, onlevel=1, offlevel=0): - "times are in seconds" + "times are in seconds (floats)" make_attributes_from_args('ontime', 'offtime', 'onlevel', 'offlevel') self.cycletime = ontime + offtime def __call__(self, startframe, endframe, blendtime, time_since_startframe): @@ -159,10 +159,38 @@ class TimelineTrack: else: self.default_frame = None self.name = name - self.events = list(timedevents) + self.set_events(list(timedevents)) + def set_events(self, events): + """This is given a list of TimedEvents. They need not be sorted.""" + self.events = events + self._cleaup_events() + def _cleaup_events(self): + """This makes sure all events are in the right order and have defaults + filled in if they have missing frames.""" self.events.sort() - self.fill_in_missing_subs() - def fill_in_missing_subs(self): + self.fill_in_missing frames() + def add_event(self, event): + """Add a TimedEvent object to this TimelineTrack""" + self.events.append(event) + self._cleaup_events(self.events) + def delete_event(self, event): + """Delete event by TimedEvent object""" + self.events.remove(event) + self._cleaup_events(self.events) + def delete_event_by_name(self, name): + """Deletes all events matching a certain name""" + self.events = [e for e in self.events if e.name is not name] + self._cleaup_events(self.events) + def delete_event_by_time(self, starttime, endtime=None): + """Deletes all events within a certain time range, inclusive. endtime + is optional.""" + endtime = endtime or starttime + self.events = [e for e in self.events + if e.time >= starttime and e.time <= endtime] + self._cleaup_events(self.events) + def fill_in_missing frames(self): + """Runs through all events and sets TimedEvent with missing frames to + the default frame.""" for event in self.events: if event.frame == MISSING: event.frame = self.default_frame