Package _Framework :: Module DeviceComponent
[hide private]
[frames] | no frames]

Source Code for Module _Framework.DeviceComponent

  1  #Embedded file name: /Users/versonator/Hudson/live/Projects/AppLive/Resources/MIDI Remote Scripts/_Framework/DeviceComponent.py 
  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   
9 -class DeviceComponent(ControlSurfaceComponent):
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
30 - def disconnect(self):
31 self._device_bank_registry.remove_device_bank_listener(self._on_device_bank_changed) 32 self._device_bank_registry = None 33 self._lock_callback = None 34 self._release_parameters(self._parameter_controls) 35 self._parameter_controls = None 36 if self._bank_up_button != None: 37 self._bank_up_button.remove_value_listener(self._bank_up_value) 38 self._bank_up_button = None 39 if self._bank_down_button != None: 40 self._bank_down_button.remove_value_listener(self._bank_down_value) 41 self._bank_down_button = None 42 if self._bank_buttons != None: 43 for button in self._bank_buttons: 44 button.remove_value_listener(self._bank_value) 45 46 self._bank_buttons = None 47 if self._on_off_button != None: 48 self._on_off_button.remove_value_listener(self._on_off_value) 49 self._on_off_button = None 50 if self._lock_button != None: 51 self._lock_button.remove_value_listener(self._lock_value) 52 self._lock_button = None 53 if self._device != None: 54 parameter = self._on_off_parameter() 55 if parameter != None: 56 parameter.remove_value_listener(self._on_on_off_changed) 57 self._device.remove_name_listener(self._on_device_name_changed) 58 self._device.remove_parameters_listener(self._on_parameters_changed) 59 self._device = None 60 self._device_listeners = None 61 super(DeviceComponent, self).disconnect()
62
63 - def on_enabled_changed(self):
64 self.update()
65
66 - def device(self):
67 return self._device
68
69 - def set_device(self, device):
70 if not (device == None or isinstance(device, Live.Device.Device)): 71 raise AssertionError 72 if not self._locked_to_device and device != self._device: 73 if self._device != None: 74 self._device.remove_name_listener(self._on_device_name_changed) 75 self._device.remove_parameters_listener(self._on_parameters_changed) 76 parameter = self._on_off_parameter() 77 if parameter != None: 78 parameter.remove_value_listener(self._on_on_off_changed) 79 self._release_parameters(self._parameter_controls) 80 self._device = device 81 if self._device != None: 82 self._bank_index = 0 83 self._device.add_name_listener(self._on_device_name_changed) 84 self._device.add_parameters_listener(self._on_parameters_changed) 85 parameter = self._on_off_parameter() 86 parameter != None and parameter.add_value_listener(self._on_on_off_changed) 87 self._bank_index = self._device_bank_registry.get_device_bank(self._device) 88 self._bank_name = '<No Bank>' 89 self._on_device_name_changed() 90 self.update() 91 for listener in self._device_listeners: 92 listener()
93
94 - def set_bank_nav_buttons(self, down_button, up_button):
95 if not (up_button != None or down_button == None): 96 raise AssertionError 97 if not (up_button == None or isinstance(up_button, ButtonElement)): 98 raise AssertionError 99 if not (down_button == None or isinstance(down_button, ButtonElement)): 100 raise AssertionError 101 do_update = False 102 if up_button != self._bank_up_button: 103 do_update = True 104 if self._bank_up_button != None: 105 self._bank_up_button.remove_value_listener(self._bank_up_value) 106 self._bank_up_button = up_button 107 if self._bank_up_button != None: 108 self._bank_up_button.add_value_listener(self._bank_up_value) 109 if down_button != self._bank_down_button: 110 do_update = True 111 self._bank_down_button != None and self._bank_down_button.remove_value_listener(self._bank_down_value) 112 self._bank_down_button = down_button 113 self._bank_down_button != None and self._bank_down_button.add_value_listener(self._bank_down_value) 114 do_update and self.update()
115
116 - def set_bank_buttons(self, buttons):
117 if not (buttons == None or isinstance(buttons, tuple)): 118 raise AssertionError 119 if self._bank_buttons != None: 120 for button in self._bank_buttons: 121 button.remove_value_listener(self._bank_value) 122 123 self._bank_buttons = buttons 124 identify_sender = self._bank_buttons != None and True 125 for button in self._bank_buttons: 126 button.add_value_listener(self._bank_value, identify_sender) 127 128 self.update()
129
130 - def set_parameter_controls(self, controls):
131 self._release_parameters(self._parameter_controls) 132 self._parameter_controls = controls 133 self.update()
134
135 - def set_lock_to_device(self, lock, device):
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
142 - def set_lock_button(self, button):
143 if not (button == None or isinstance(button, ButtonElement)): 144 raise AssertionError 145 if self._lock_button != None: 146 self._lock_button.remove_value_listener(self._lock_value) 147 self._lock_button = None 148 self._lock_button = button 149 self._lock_button != None and self._lock_button.add_value_listener(self._lock_value) 150 self.update()
151
152 - def set_on_off_button(self, button):
153 if not (button == None or isinstance(button, ButtonElement)): 154 raise AssertionError 155 if self._on_off_button != None: 156 self._on_off_button.remove_value_listener(self._on_off_value) 157 self._on_off_button = None 158 self._on_off_button = button 159 self._on_off_button != None and self._on_off_button.add_value_listener(self._on_off_value) 160 self.update()
161
162 - def set_lock_callback(self, callback):
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
168 - def restore_bank(self, bank_index):
169 if self._device != None and self._is_banking_enabled() and self._locked_to_device and self._number_of_parameter_banks() > bank_index and self._bank_index != bank_index: 170 self._bank_index = bank_index 171 self.update()
172
173 - def device_name_data_source(self):
174 if self._device_name_data_source == None: 175 self._device_name_data_source = DisplayDataSource() 176 self._on_device_name_changed() 177 return self._device_name_data_source
178
179 - def device_has_listener(self, listener):
180 return listener in self._device_listeners
181
182 - def add_device_listener(self, listener):
183 raise not self.device_has_listener(listener) or AssertionError 184 self._device_listeners.append(listener)
185
186 - def remove_device_listener(self, listener):
187 raise self.device_has_listener(listener) or AssertionError 188 self._device_listeners.remove(listener)
189
190 - def update(self):
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
221 - def _bank_up_value(self, value):
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
238 - def _bank_down_value(self, value):
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
249 - def _lock_value(self, value):
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
257 - def _on_off_value(self, value):
258 if not self._on_off_button != None: 259 raise AssertionError 260 if not value in range(128): 261 raise AssertionError 262 parameter = (not self._on_off_button.is_momentary() or value is not 0) and self._on_off_parameter() 263 parameter.value = parameter != None and parameter.is_enabled and float(int(parameter.value == 0.0))
264
265 - def _bank_value(self, value, button):
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
283 - def _is_banking_enabled(self):
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
289 - def _assign_parameters(self):
290 raise self.is_enabled() or AssertionError 291 raise self._device != None or AssertionError 292 raise self._parameter_controls != None or AssertionError 293 self._bank_name, bank = self._current_bank_details() 294 for control, parameter in zip(self._parameter_controls, bank): 295 if control != None: 296 if parameter != None: 297 control.connect_to(parameter) 298 else: 299 control.release_parameter() 300 301 self._release_parameters(self._parameter_controls[len(bank):])
302
303 - def _on_device_name_changed(self):
304 if self._device_name_data_source != None: 305 if self.is_enabled() and self._device != None: 306 self._device_name_data_source.set_display_string(self._device.name) 307 else: 308 self._device_name_data_source.set_display_string('No Device')
309
310 - def _on_parameters_changed(self):
311 self.update()
312
313 - def _on_off_parameter(self):
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
323 - def _on_on_off_changed(self):
324 if self.is_enabled() and self._on_off_button != None: 325 turn_on = False 326 if self._device != None: 327 parameter = self._on_off_parameter() 328 if parameter != None: 329 turn_on = parameter.value > 0.0 330 turn_on and self._on_off_button.turn_on() 331 else: 332 self._on_off_button.turn_off()
333
334 - def _best_of_parameter_bank(self):
335 return best_of_parameter_bank(self._device)
336
337 - def _parameter_banks(self):
338 return parameter_banks(self._device)
339
340 - def _parameter_bank_names(self):
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
349 - def _current_bank_details(self):
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
364 - def _on_device_bank_changed(self, device, bank):
365 if device == self._device: 366 self._bank_index = bank 367 self.update()
368
369 - def _release_parameters(self, controls):
370 if controls != None: 371 for control in controls: 372 if control != None: 373 control.release_parameter()
374