0
|
1 from Timeline import *
|
|
2 from Submaster import Submasters, sub_maxes
|
|
3
|
|
4 class Show:
|
|
5 def __init__(self, timelines, submasters):
|
|
6 self.timelines = dict([(timeline.name, timeline)
|
|
7 for timeline in timelines])
|
|
8 self.submasters = submasters
|
|
9 self.current_timeline = None
|
|
10 self.current_time = 0
|
|
11 def calc_active_submaster(self):
|
|
12 "get levels from the current timeline at the current time"
|
|
13 if not (self.current_timeline or self.current_time):
|
|
14 return {}
|
|
15 tl = self.current_timeline
|
|
16 tl.set_time(self.current_time)
|
|
17 levels = tl.get_levels()
|
|
18 scaledsubs = [self.submasters.get_sub_by_name(sub) * level \
|
|
19 for sub, level in levels.items()]
|
|
20 maxes = sub_maxes(*scaledsubs)
|
|
21
|
|
22 return maxes
|
|
23 def set_timeline(self, name):
|
|
24 "select a timeline"
|
|
25 self.current_timeline = self.timelines.get(name)
|
|
26 if not self.current_timeline:
|
|
27 print "Show: '%s' is not the name of a timeline." % name
|
|
28 else:
|
|
29 self.set_time(0)
|
|
30 def set_time(self, time):
|
|
31 "set time of current timeline"
|
|
32 self.current_time = time
|
|
33 if not self.current_timeline:
|
|
34 return
|
|
35 self.current_timeline.set_time(time)
|
|
36 def get_timelines(self):
|
|
37 "Get names of all timelines"
|
|
38 return self.timelines.keys()
|
|
39
|
|
40 # this is the default blender
|
|
41 linear = LinearBlender()
|
|
42 def T(time, level, **kw):
|
|
43 """This used to be a synonym for TimedEvent:
|
|
44
|
|
45 T = TimedEvent
|
|
46
|
|
47 It now acts in a similar way, except that it will fill in a default
|
|
48 blender if you don't. The default blender is a LinearBlender. It also
|
|
49 sets frame to MISSING so the track can fill it in."""
|
|
50 if 'blender' not in kw:
|
|
51 global linear
|
|
52 kw['blender'] = linear
|
|
53
|
|
54 return TimedEvent(time, level=level, frame=MISSING, **kw)
|
|
55
|
|
56 def translate_tracks_from_file(timelinename):
|
|
57 try:
|
|
58 f = open('timelines/' + timelinename)
|
|
59 except IOError:
|
|
60 return []
|
|
61
|
|
62 events = {}
|
|
63 current_sub = None
|
|
64 current_time = None
|
|
65 lines = f.readlines()
|
|
66 alltext = ' '.join(lines)
|
|
67
|
|
68 for token in alltext.split():
|
|
69 # print 't', token
|
|
70 if token.endswith(':'):
|
|
71 # print 'sub'
|
|
72 current_sub = token[:-1]
|
|
73 current_time = None
|
|
74 else:
|
|
75 if not current_sub:
|
|
76 raise "invalid file format", line
|
|
77 if current_time is not None: # we now have a level
|
|
78 # print 'level'
|
|
79 try:
|
|
80 level = float(token)
|
|
81 except:
|
|
82 print "bad level token", token
|
|
83 level = 0
|
|
84 # time to write
|
|
85 events.setdefault(current_sub, [])
|
|
86 events[current_sub].append((current_time, level))
|
|
87 current_time = None
|
|
88 else:
|
|
89 # print 'time'
|
|
90 try:
|
|
91 current_time = float(token)
|
|
92 except ValueError:
|
|
93 print "bad time token", token
|
|
94 current_time = 0
|
|
95
|
|
96 tracks = []
|
|
97 for sub, timelevels in events.items():
|
|
98 tracks.append(TimelineTrack(sub, default_frame=sub,
|
|
99 *[T(time, level) for time, level in timelevels]))
|
|
100
|
|
101 return tracks
|
|
102
|