annotate flax/Submaster.py @ 15:c76b62eccdec

put **kw back in, they now go to the scale and can override the defaults. put **kw back in, they now go to the scale and can override the defaults. for our purposes, we probably want to edit the defaults so we don't have them in every call.
author dmcc
date Sun, 07 Jul 2002 06:18:40 +0000
parents 45b12307c695
children 5670f66845ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 from __future__ import division
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 from TLUtility import dict_scale, dict_max
45b12307c695 Initial revision
drewp
parents:
diff changeset
3
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 import sys
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 sys.path.append('../light8')
45b12307c695 Initial revision
drewp
parents:
diff changeset
6
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 import Patch
45b12307c695 Initial revision
drewp
parents:
diff changeset
8
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 class Submaster:
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 "Contain a dictionary of levels, but you didn't need to know that"
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 def __init__(self, name, leveldict=None, temporary=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 self.name = name
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 self.temporary = temporary
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 if leveldict:
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 self.levels = leveldict
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 self.levels = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 self.reload()
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 def reload(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 if self.temporary:
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 self.levels.clear()
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 subfile = file("subs/%s" % self.name)
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 for line in subfile.readlines():
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 if not line.strip(): # if line is only whitespace
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 continue # "did i say newspace?"
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 name, val = line.split(':')
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 name = name.strip()
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 self.levels[name] = float(val)
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 except ValueError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 print "(%s) Error with this line: %s" % (self.name,
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 line[:-1])
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 except IOError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 print "Can't read file for sub: %s" % self.name
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 def save(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 if self.temporary:
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
41
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 subfile = file("subs/%s" % self.name, 'w')
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 names = self.levels.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 names.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 for name in names:
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 val = self.levels[name]
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 subfile.write("%s : %s\n" % (name, val))
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 def set_level(self, channelname, level, save=1):
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 self.levels[Patch.resolve_name(channelname)] = level
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 if save:
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 self.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 def set_all_levels(self, leveldict):
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 self.levels.clear()
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 for k, v in leveldict.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 self.set_level(k, v, save=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 self.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 def get_levels(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 return self.levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 def __mul__(self, scalar):
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 return Submaster("%s*%s" % (self.name, scalar),
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 dict_scale(self.levels, scalar), temporary=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 __rmul__ = __mul__
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 def max(self, *othersubs):
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 return sub_maxes(self, *othersubs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 def __repr__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 levels = ' '.join(["%s:%.2f" % item for item in self.levels.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 return "<'%s': [%s]>" % (self.name, levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 def get_dmx_list(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 leveldict = self.get_levels() # gets levels of sub contents
45b12307c695 Initial revision
drewp
parents:
diff changeset
70
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 levels = [0] * 68
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 for k, v in leveldict.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 dmxchan = Patch.get_dmx_channel(k) - 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 levels[dmxchan] = max(v, levels[dmxchan])
45b12307c695 Initial revision
drewp
parents:
diff changeset
75
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 return levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 def normalize_patch_names(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 """Use only the primary patch names."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 # possibly busted -- don't use unless you know what you're doing
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 self.set_all_levels(self.levels.copy())
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 def get_normalized_copy(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 """Get a copy of this sumbaster that only uses the primary patch
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 names. The levels will be the same."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 newsub = Submaster("%s (normalized)" % self.name, temporary=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 newsub.set_all_levels(self.levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 return newsub
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 def crossfade(self, othersub, amount):
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 """Returns a new sub that is a crossfade between this sub and
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 another submaster.
45b12307c695 Initial revision
drewp
parents:
diff changeset
90
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 NOTE: You should only crossfade between normalized submasters."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 otherlevels = othersub.get_levels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 keys_set = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 for k in self.levels.keys() + otherlevels.keys():
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 keys_set[k] = 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 all_keys = keys_set.keys()
45b12307c695 Initial revision
drewp
parents:
diff changeset
97
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 xfaded_sub = Submaster("xfade", temporary=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 for k in all_keys:
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 xfaded_sub.set_level(k,
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 linear_fade(self.levels.get(k, 0),
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 otherlevels.get(k, 0),
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 amount))
45b12307c695 Initial revision
drewp
parents:
diff changeset
104
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 return xfaded_sub
45b12307c695 Initial revision
drewp
parents:
diff changeset
106
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 def linear_fade(start, end, amount):
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 """Fades between two floats by an amount. amount is a float between
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 0 and 1. If amount is 0, it will return the start value. If it is 1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 the end value will be returned."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 level = start + (amount * (end - start))
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 return level
45b12307c695 Initial revision
drewp
parents:
diff changeset
113
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 def sub_maxes(*subs):
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 return Submaster("max(%r)" % (subs,),
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 dict_max(*[sub.levels for sub in subs]), temporary=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
117
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 class Submasters:
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 "Collection o' Submaster objects"
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 self.submasters = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
122
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 import os
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 files = os.listdir('subs')
45b12307c695 Initial revision
drewp
parents:
diff changeset
125
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 for filename in files:
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 # we don't want these files
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 if filename.startswith('.') or filename.endswith('~') or \
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 filename.startswith('CVS'):
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 continue
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 self.submasters[filename] = Submaster(filename)
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 def get_all_subs(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 "All Submaster objects"
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 l = self.submasters.items()
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 l.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 l = [x[1] for x in l]
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 songs = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 notsongs = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 for s in l:
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 if s.name.startswith('song'):
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 songs.append(s)
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 notsongs.append(s)
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 combined = notsongs + songs
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 return combined
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 def get_sub_by_name(self, name):
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 "Makes a new sub if there isn't one."
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 return self.submasters.get(name, Submaster(name))
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 __getitem__ = get_sub_by_name
45b12307c695 Initial revision
drewp
parents:
diff changeset
150
45b12307c695 Initial revision
drewp
parents:
diff changeset
151 if __name__ == "__main__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 Patch.reload_data()
45b12307c695 Initial revision
drewp
parents:
diff changeset
153 s = Submasters()
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 print s.get_all_subs()
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 if 0: # turn this on to normalize all subs
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 for sub in s.get_all_subs():
45b12307c695 Initial revision
drewp
parents:
diff changeset
157 print "before", sub
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 sub.normalize_patch_names()
45b12307c695 Initial revision
drewp
parents:
diff changeset
159 sub.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 print "after", sub