1
2 import Live
3 from _Generic.Devices import device_parameters_to_map, number_of_parameter_banks, parameter_banks, parameter_bank_names, best_of_parameter_bank
4 from ControlSurfaceComponent import ControlSurfaceComponent
5 from ButtonElement import ButtonElement
6 from DisplayDataSource import DisplayDataSource
7 from DeviceBankRegistry import DeviceBankRegistry
8
10 """ Class representing a device in Live """
11
12 - def __init__(self, device_bank_registry = None, *a, **k):
13 super(DeviceComponent, self).__init__(*a, **k)
14 self._device_bank_registry = device_bank_registry or DeviceBankRegistry()
15 self._device_bank_registry.add_device_bank_listener(self._on_device_bank_changed)
16 self._device = None
17 self._device_listeners = []
18 self._parameter_controls = None
19 self._bank_up_button = None
20 self._bank_down_button = None
21 self._bank_buttons = None
22 self._on_off_button = None
23 self._lock_button = None
24 self._lock_callback = None
25 self._device_name_data_source = None
26 self._bank_index = 0
27 self._bank_name = '<No Bank>'
28 self._locked_to_device = False
29
62
65
68
93
115
129
134
136 if lock:
137 self.set_device(device)
138 self._locked_to_device = lock
139 if self.is_enabled() and self._lock_button != None:
140 self._lock_button.set_light(self._locked_to_device)
141
151
161
163 raise self._lock_callback == None or AssertionError
164 raise callback != None or AssertionError
165 raise dir(callback).count('im_func') is 1 or AssertionError
166 self._lock_callback = callback
167
172
178
180 return listener in self._device_listeners
181
185
189
191 if self.is_enabled() and self._device != None:
192 self._device_bank_registry.set_device_bank(self._device, self._bank_index)
193 if self._parameter_controls != None:
194 old_bank_name = self._bank_name
195 self._assign_parameters()
196 if self._bank_name != old_bank_name:
197 self._show_msg_callback(self._device.name + ' Bank: ' + self._bank_name)
198 if self._bank_up_button != None and self._bank_down_button != None:
199 can_bank_up = self._bank_index == None or self._number_of_parameter_banks() > self._bank_index + 1
200 can_bank_down = self._bank_index == None or self._bank_index > 0
201 self._bank_up_button.set_light(can_bank_up)
202 self._bank_down_button.set_light(can_bank_down)
203 if self._bank_buttons != None:
204 for index, button in enumerate(self._bank_buttons):
205 button.set_light(index == self._bank_index)
206
207 else:
208 if self._lock_button != None:
209 self._lock_button.turn_off()
210 if self._bank_up_button != None:
211 self._bank_up_button.turn_off()
212 if self._bank_down_button != None:
213 self._bank_down_button.turn_off()
214 if self._bank_buttons != None:
215 for button in self._bank_buttons:
216 button.turn_off()
217
218 if self._parameter_controls != None:
219 self._release_parameters(self._parameter_controls)
220
222 raise self._bank_up_button != None or AssertionError
223 raise value != None or AssertionError
224 raise isinstance(value, int) or AssertionError
225 if self.is_enabled():
226 if not self._bank_up_button.is_momentary() or value is not 0:
227 if self._device != None:
228 num_banks = self._number_of_parameter_banks()
229 if self._bank_down_button == None:
230 self._bank_name = ''
231 self._bank_index = (self._bank_index + 1) % num_banks if self._bank_index != None else 0
232 self.update()
233 elif self._bank_index == None or num_banks > self._bank_index + 1:
234 self._bank_name = ''
235 self._bank_index = self._bank_index + 1 if self._bank_index != None else 0
236 self.update()
237
239 if not self._bank_down_button != None:
240 raise AssertionError
241 raise value != None or AssertionError
242 if not isinstance(value, int):
243 raise AssertionError
244 if self.is_enabled():
245 self._bank_name = (not self._bank_down_button.is_momentary() or value is not 0) and self._device != None and (self._bank_index == None or self._bank_index > 0) and ''
246 self._bank_index = self._bank_index - 1 if self._bank_index != None else max(0, self._number_of_parameter_banks() - 1)
247 self.update()
248
250 if not self._lock_button != None:
251 raise AssertionError
252 raise self._lock_callback != None or AssertionError
253 raise value != None or AssertionError
254 raise isinstance(value, int) or AssertionError
255 (not self._lock_button.is_momentary() or value is not 0) and self._lock_callback()
256
264
266 if not self._bank_buttons != None:
267 raise AssertionError
268 raise value != None or AssertionError
269 raise button != None or AssertionError
270 raise isinstance(value, int) or AssertionError
271 raise isinstance(button, ButtonElement) or AssertionError
272 if not list(self._bank_buttons).count(button) == 1:
273 raise AssertionError
274 if self.is_enabled() and self._device != None:
275 if not button.is_momentary() or value is not 0:
276 bank = list(self._bank_buttons).index(button)
277 self._bank_name = bank != self._bank_index and self._number_of_parameter_banks() > bank and ''
278 self._bank_index = bank
279 self.update()
280 else:
281 self._show_msg_callback(self._device.name + ' Bank: ' + self._bank_name)
282
284 direct_banking = self._bank_buttons != None
285 roundtrip_banking = self._bank_up_button != None
286 increment_banking = self._bank_up_button != None and self._bank_down_button != None
287 return direct_banking or roundtrip_banking or increment_banking
288
302
309
312
314 result = None
315 if self._device != None:
316 for parameter in self._device.parameters:
317 if str(parameter.name).startswith('Device On'):
318 result = parameter
319 break
320
321 return result
322
333
335 return best_of_parameter_bank(self._device)
336
338 return parameter_banks(self._device)
339
341 return parameter_bank_names(self._device)
342
344 return device_parameters_to_map(self._device)
345
347 return number_of_parameter_banks(self._device)
348
350 bank_name = self._bank_name
351 bank = []
352 best_of = self._best_of_parameter_bank()
353 banks = self._parameter_banks()
354 if banks:
355 if self._bank_index != None and self._is_banking_enabled() or not best_of:
356 index = self._bank_index if self._bank_index != None else 0
357 bank = banks[index]
358 bank_name = self._parameter_bank_names()[index]
359 else:
360 bank = best_of
361 bank_name = 'Best of Parameters'
362 return (bank_name, bank)
363
365 if device == self._device:
366 self._bank_index = bank
367 self.update()
368
374