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

Source Code for Module _Framework.ChannelStripComponent

  1  #Embedded file name: /Users/versonator/Hudson/live/Projects/AppLive/Resources/MIDI Remote Scripts/_Framework/ChannelStripComponent.py 
  2  import Live 
  3  from itertools import chain 
  4  from ControlSurfaceComponent import ControlSurfaceComponent 
  5  from ButtonElement import ButtonElement 
  6  from EncoderElement import EncoderElement 
  7  from DisplayDataSource import DisplayDataSource 
  8  from _Framework.Util import nop 
  9   
10 -class ChannelStripComponent(ControlSurfaceComponent):
11 """ Class attaching to the mixer of a given track """ 12 _active_instances = [] 13
15 result = 0 16 for strip in ChannelStripComponent._active_instances: 17 if not isinstance(strip, ChannelStripComponent): 18 raise AssertionError 19 strip.arm_button_pressed() and result += 1 20 21 return result
22 23 number_of_arms_pressed = staticmethod(number_of_arms_pressed) 24
26 result = 0 27 for strip in ChannelStripComponent._active_instances: 28 if not isinstance(strip, ChannelStripComponent): 29 raise AssertionError 30 strip.solo_button_pressed() and result += 1 31 32 return result
33 34 number_of_solos_pressed = staticmethod(number_of_solos_pressed) 35 empty_color = None 36
37 - def __init__(self):
38 ControlSurfaceComponent.__init__(self) 39 ChannelStripComponent._active_instances.append(self) 40 self._track = None 41 self._send_controls = [] 42 self._pan_control = None 43 self._volume_control = None 44 self._select_button = None 45 self._mute_button = None 46 self._solo_button = None 47 self._arm_button = None 48 self._shift_button = None 49 self._crossfade_toggle = None 50 self._track_name_data_source = None 51 self._shift_pressed = False 52 self._solo_pressed = False 53 self._arm_pressed = False 54 self._invert_mute_feedback = False 55 self._empty_control_slots = self.register_slot_manager()
56
57 - def disconnect(self):
58 """ releasing references and removing listeners""" 59 ChannelStripComponent._active_instances.remove(self) 60 if self._select_button != None: 61 self._select_button.remove_value_listener(self._select_value) 62 self._select_button.reset() 63 self._select_button = None 64 if self._mute_button != None: 65 self._mute_button.remove_value_listener(self._mute_value) 66 self._mute_button.reset() 67 self._mute_button = None 68 if self._solo_button != None: 69 self._solo_button.remove_value_listener(self._solo_value) 70 self._solo_button.reset() 71 self._solo_button = None 72 if self._arm_button != None: 73 self._arm_button.remove_value_listener(self._arm_value) 74 self._arm_button.reset() 75 self._arm_button = None 76 if self._shift_button != None: 77 self._shift_button.remove_value_listener(self._shift_value) 78 self._shift_button.reset() 79 self._shift_button = None 80 if self._crossfade_toggle != None: 81 self._crossfade_toggle.remove_value_listener(self._crossfade_toggle_value) 82 self._crossfade_toggle.reset() 83 self._crossfade_toggle = None 84 if self._track_name_data_source != None: 85 self._track_name_data_source.set_display_string('') 86 self._track_name_data_source = None 87 if self._track != None: 88 if self._track != self.song().master_track: 89 if self._track.mixer_device.sends_has_listener(self._on_sends_changed): 90 self._track.mixer_device.remove_sends_listener(self._on_sends_changed) 91 if self._track.mute_has_listener(self._on_mute_changed): 92 self._track.remove_mute_listener(self._on_mute_changed) 93 if self._track.name_has_listener(self._on_track_name_changed): 94 self._track.remove_name_listener(self._on_track_name_changed) 95 if self._track.solo_has_listener(self._on_solo_changed): 96 self._track.remove_solo_listener(self._on_solo_changed) 97 if self._track.mixer_device.crossfade_assign_has_listener(self._on_cf_assign_changed): 98 self._track.mixer_device.remove_crossfade_assign_listener(self._on_cf_assign_changed) 99 if self._track not in self.song().return_tracks: 100 if self._track.can_be_armed and self._track.arm_has_listener(self._on_arm_changed): 101 self._track.remove_arm_listener(self._on_arm_changed) 102 if self._track.current_input_routing_has_listener(self._on_input_routing_changed): 103 self._track.remove_current_input_routing_listener(self._on_input_routing_changed) 104 if self._pan_control != None: 105 self._pan_control.release_parameter() 106 self._pan_control = None 107 if self._volume_control != None: 108 self._volume_control.release_parameter() 109 self._volume_control = None 110 if self._send_controls != None: 111 for send_control in self._send_controls: 112 if send_control != None: 113 send_control.release_parameter() 114 115 self._send_controls = None 116 self._track = None 117 super(ChannelStripComponent, self).disconnect()
118
119 - def set_track(self, track):
120 if not isinstance(track, (type(None), Live.Track.Track)): 121 raise AssertionError 122 if self._track != None: 123 if self._track != self.song().master_track: 124 if self._track.mixer_device.sends_has_listener(self._on_sends_changed): 125 self._track.mixer_device.remove_sends_listener(self._on_sends_changed) 126 if self._track.mute_has_listener(self._on_mute_changed): 127 self._track.remove_mute_listener(self._on_mute_changed) 128 if self._track.name_has_listener(self._on_track_name_changed): 129 self._track.remove_name_listener(self._on_track_name_changed) 130 if self._track.solo_has_listener(self._on_solo_changed): 131 self._track.remove_solo_listener(self._on_solo_changed) 132 if self._track.mixer_device.crossfade_assign_has_listener(self._on_cf_assign_changed): 133 self._track.mixer_device.remove_crossfade_assign_listener(self._on_cf_assign_changed) 134 if self._track not in self.song().return_tracks: 135 if self._track.can_be_armed and self._track.arm_has_listener(self._on_arm_changed): 136 self._track.remove_arm_listener(self._on_arm_changed) 137 if self._track.current_input_routing_has_listener(self._on_input_routing_changed): 138 self._track.remove_current_input_routing_listener(self._on_input_routing_changed) 139 if self._pan_control != None: 140 self._pan_control.release_parameter() 141 if self._volume_control != None: 142 self._volume_control.release_parameter() 143 if self._send_controls != None: 144 for send_control in self._send_controls: 145 if send_control != None: 146 send_control.release_parameter() 147 148 self._track = track 149 raise self._track != None and (isinstance(self._track, Live.Track.Track) or AssertionError) 150 if not self._track in tuple(self.song().tracks) + tuple(self.song().return_tracks) + (self.song().master_track,): 151 raise AssertionError 152 if self._track != self.song().master_track: 153 self._track.add_solo_listener(self._on_solo_changed) 154 self._track.mixer_device.add_sends_listener(self._on_sends_changed) 155 self._track.add_mute_listener(self._on_mute_changed) 156 self._track.add_name_listener(self._on_track_name_changed) 157 self._track.mixer_device.add_crossfade_assign_listener(self._on_cf_assign_changed) 158 if self._track not in self.song().return_tracks: 159 self._track.can_be_armed and self._track.add_arm_listener(self._on_arm_changed) 160 self._track.add_current_input_routing_listener(self._on_input_routing_changed) 161 for button in (self._select_button, 162 self._mute_button, 163 self._solo_button, 164 self._arm_button, 165 self._crossfade_toggle): 166 if button != None: 167 button.turn_off() 168 169 self._update_track_name_data_source() 170 self.update()
171
173 if self._track_name_data_source != None: 174 if self._track != None: 175 self._track_name_data_source.set_display_string(self._track.name) 176 else: 177 self._track_name_data_source.set_display_string(' - ')
178
179 - def set_send_controls(self, controls):
180 if self._send_controls != None: 181 for send_control in self._send_controls: 182 if send_control != None: 183 send_control.release_parameter() 184 185 self._send_controls = controls 186 self.update()
187
188 - def set_pan_control(self, control):
189 if not isinstance(control, (type(None), EncoderElement)): 190 raise AssertionError 191 if control != self._pan_control: 192 self._pan_control != None and self._pan_control.release_parameter() 193 self._pan_control = control 194 self.update()
195
196 - def set_volume_control(self, control):
197 if not isinstance(control, (type(None), EncoderElement)): 198 raise AssertionError 199 if control != self._volume_control: 200 self._volume_control != None and self._volume_control.release_parameter() 201 self._volume_control = control 202 self.update()
203
204 - def set_select_button(self, button):
205 if not (button == None or isinstance(button, ButtonElement)): 206 raise AssertionError 207 if button != self._select_button: 208 if self._select_button != None: 209 self._select_button.remove_value_listener(self._select_value) 210 self._select_button.reset() 211 self._select_button = button 212 self._select_button != None and self._select_button.add_value_listener(self._select_value) 213 self.update()
214
215 - def set_mute_button(self, button):
216 if not (button == None or isinstance(button, ButtonElement)): 217 raise AssertionError 218 if button != self._mute_button: 219 if self._mute_button != None: 220 self._mute_button.remove_value_listener(self._mute_value) 221 self._mute_button.reset() 222 self._mute_button = button 223 self._mute_button != None and self._mute_button.add_value_listener(self._mute_value) 224 self.update()
225
226 - def set_solo_button(self, button):
227 if not (button == None or isinstance(button, ButtonElement)): 228 raise AssertionError 229 if button != self._solo_button: 230 if self._solo_button != None: 231 self._solo_button.remove_value_listener(self._solo_value) 232 self._solo_button.reset() 233 self._solo_pressed = False 234 self._solo_button = button 235 self._solo_button != None and self._solo_button.add_value_listener(self._solo_value) 236 self.update()
237
238 - def set_arm_button(self, button):
239 if not self._track != self.song().master_track: 240 raise AssertionError 241 if not (button == None or isinstance(button, ButtonElement)): 242 raise AssertionError 243 if button != self._arm_button: 244 self._arm_button != None and self._arm_button.remove_value_listener(self._arm_value) 245 self._arm_button.reset() 246 self._arm_pressed = False 247 self._arm_button = button 248 self._arm_button != None and self._arm_button.add_value_listener(self._arm_value) 249 self.update()
250
251 - def set_shift_button(self, button):
252 if not self._track != self.song().master_track: 253 raise AssertionError 254 if not (button == None or isinstance(button, ButtonElement) and button.is_momentary()): 255 raise AssertionError 256 if button != self._shift_button: 257 self._shift_button != None and self._shift_button.remove_value_listener(self._shift_value) 258 self._shift_button.reset() 259 self._shift_button = button 260 self._shift_button != None and self._shift_button.add_value_listener(self._shift_value) 261 self.update()
262
263 - def set_crossfade_toggle(self, button):
264 if not self._track != self.song().master_track: 265 raise AssertionError 266 if not (button == None or isinstance(button, ButtonElement)): 267 raise AssertionError 268 if button != self._crossfade_toggle: 269 self._crossfade_toggle != None and self._crossfade_toggle.remove_value_listener(self._crossfade_toggle_value) 270 self._crossfade_toggle.reset() 271 self._crossfade_toggle = button 272 self._crossfade_toggle != None and self._crossfade_toggle.add_value_listener(self._crossfade_toggle_value) 273 self.update()
274
275 - def set_invert_mute_feedback(self, invert_feedback):
276 if not isinstance(invert_feedback, type(False)): 277 raise AssertionError 278 self._invert_mute_feedback = invert_feedback != self._invert_mute_feedback and invert_feedback 279 self.update()
280
281 - def on_enabled_changed(self):
282 self.update()
283
285 if self.is_enabled() and self._select_button != None: 286 if self._track != None or self.empty_color == None: 287 if self.song().view.selected_track == self._track: 288 self._select_button.turn_on() 289 else: 290 self._select_button.turn_off() 291 else: 292 self._select_button.set_light(self.empty_color)
293
294 - def solo_button_pressed(self):
295 return self._solo_pressed
296
297 - def arm_button_pressed(self):
298 return self._arm_pressed
299
300 - def track_name_data_source(self):
301 if self._track_name_data_source == None: 302 self._track_name_data_source = DisplayDataSource() 303 self._update_track_name_data_source() 304 return self._track_name_data_source
305
306 - def _connect_parameters(self):
307 if self._pan_control != None: 308 self._pan_control.connect_to(self._track.mixer_device.panning) 309 if self._volume_control != None: 310 self._volume_control.connect_to(self._track.mixer_device.volume) 311 if self._send_controls != None: 312 index = 0 313 for send_control in self._send_controls: 314 if send_control != None: 315 if index < len(self._track.mixer_device.sends): 316 send_control.connect_to(self._track.mixer_device.sends[index]) 317 else: 318 send_control.release_parameter() 319 self._empty_control_slots.register_slot(send_control, nop, 'value') 320 index += 1
321
322 - def _disconnect_parameters(self):
323 if self._pan_control != None: 324 self._pan_control.release_parameter() 325 self._empty_control_slots.register_slot(self._pan_control, nop, 'value') 326 if self._volume_control != None: 327 self._volume_control.release_parameter() 328 self._empty_control_slots.register_slot(self._volume_control, nop, 'value') 329 if self._send_controls != None: 330 for send_control in self._send_controls: 331 if send_control != None: 332 send_control.release_parameter() 333 self._empty_control_slots.register_slot(send_control, nop, 'value')
334
335 - def update(self):
336 if self._allow_updates: 337 if self.is_enabled(): 338 self._empty_control_slots.disconnect() 339 if self._track != None: 340 self._connect_parameters() 341 else: 342 self._disconnect_parameters() 343 self.on_selected_track_changed() 344 self._on_mute_changed() 345 self._on_solo_changed() 346 self._on_arm_changed() 347 self._on_cf_assign_changed() 348 else: 349 self._disconnect_parameters() 350 else: 351 self._update_requests += 1
352
353 - def _select_value(self, value):
354 if not self._select_button != None: 355 raise AssertionError 356 if not isinstance(value, int): 357 raise AssertionError 358 if self.is_enabled(): 359 if self._track != None: 360 self.song().view.selected_track = (value != 0 or not self._select_button.is_momentary()) and self.song().view.selected_track != self._track and self._track
361
362 - def _mute_value(self, value):
363 if not self._mute_button != None: 364 raise AssertionError 365 if not isinstance(value, int): 366 raise AssertionError 367 if self.is_enabled(): 368 self._track.mute = self._track != None and self._track != self.song().master_track and (not self._mute_button.is_momentary() or value != 0) and not self._track.mute
369
370 - def update_solo_state(self, solo_exclusive, new_value, respect_multi_selection, track):
371 if track == self._track or respect_multi_selection and track.is_part_of_selection: 372 track.solo = new_value 373 elif solo_exclusive and track.solo: 374 track.solo = False
375
376 - def _solo_value(self, value):
377 if not self._solo_button != None: 378 raise AssertionError 379 if not value in range(128): 380 raise AssertionError 381 if self.is_enabled(): 382 if self._track != None and self._track != self.song().master_track: 383 self._solo_pressed = value != 0 and self._solo_button.is_momentary() 384 expected_solos_pressed = (value != 0 or not self._solo_button.is_momentary()) and 0 385 expected_solos_pressed = self._solo_pressed and 1 386 solo_exclusive = self.song().exclusive_solo != self._shift_pressed and (not self._solo_button.is_momentary() or ChannelStripComponent.number_of_solos_pressed() == expected_solos_pressed) 387 new_value = not self._track.solo 388 respect_multi_selection = self._track.is_part_of_selection 389 for track in self.song().tracks: 390 self.update_solo_state(solo_exclusive, new_value, respect_multi_selection, track) 391 392 for track in self.song().return_tracks: 393 self.update_solo_state(solo_exclusive, new_value, respect_multi_selection, track)
394
395 - def _arm_value(self, value):
396 if not self._arm_button != None: 397 raise AssertionError 398 if not value in range(128): 399 raise AssertionError 400 if self.is_enabled(): 401 if self._track != None and self._track.can_be_armed: 402 self._arm_pressed = value != 0 and self._arm_button.is_momentary() 403 expected_arms_pressed = (not self._arm_button.is_momentary() or value != 0) and 0 404 expected_arms_pressed = self._arm_pressed and 1 405 arm_exclusive = self.song().exclusive_arm != self._shift_pressed and (not self._arm_button.is_momentary() or ChannelStripComponent.number_of_arms_pressed() == expected_arms_pressed) 406 new_value = not self._track.arm 407 respect_multi_selection = self._track.is_part_of_selection 408 for track in self.song().tracks: 409 if track.can_be_armed: 410 if track == self._track or respect_multi_selection and track.is_part_of_selection: 411 track.arm = new_value 412 elif arm_exclusive and track.arm: 413 track.arm = False
414
415 - def _shift_value(self, value):
416 raise self._shift_button != None or AssertionError 417 self._shift_pressed = value != 0
418
419 - def _crossfade_toggle_value(self, value):
420 if not self._crossfade_toggle != None: 421 raise AssertionError 422 if not isinstance(value, int): 423 raise AssertionError 424 if self.is_enabled(): 425 self._track.mixer_device.crossfade_assign = self._track != None and (value != 0 or not self._crossfade_toggle.is_momentary()) and (self._track.mixer_device.crossfade_assign - 1) % len(self._track.mixer_device.crossfade_assignments.values)
426
427 - def _on_sends_changed(self):
428 if self.is_enabled(): 429 self.update()
430
431 - def _on_mute_changed(self):
432 if self.is_enabled() and self._mute_button != None: 433 if self._track != None or self.empty_color == None: 434 if self._track in chain(self.song().tracks, self.song().return_tracks) and self._track.mute != self._invert_mute_feedback: 435 self._mute_button.turn_on() 436 else: 437 self._mute_button.turn_off() 438 else: 439 self._mute_button.set_light(self.empty_color)
440
441 - def _on_solo_changed(self):
442 if self.is_enabled() and self._solo_button != None: 443 if self._track != None or self.empty_color == None: 444 if self._track in chain(self.song().tracks, self.song().return_tracks) and self._track.solo: 445 self._solo_button.turn_on() 446 else: 447 self._solo_button.turn_off() 448 else: 449 self._solo_button.set_light(self.empty_color)
450
451 - def _on_arm_changed(self):
452 if self.is_enabled() and self._arm_button != None: 453 if self._track != None and self._track in self.song().tracks and self._track.can_be_armed and self._track.arm: 454 self._arm_button.turn_on() 455 else: 456 self._arm_button.turn_off()
457
458 - def _on_track_name_changed(self):
459 if self._track != None: 460 self._update_track_name_data_source()
461
462 - def _on_cf_assign_changed(self):
463 if self.is_enabled() and self._crossfade_toggle != None: 464 if self._track != None and self._track in chain(self.song().tracks, self.song().return_tracks) and self._track.mixer_device.crossfade_assign != 1: 465 self._crossfade_toggle.turn_on() 466 else: 467 self._crossfade_toggle.turn_off()
468
470 if not self._track != None: 471 raise AssertionError 472 if self.is_enabled(): 473 self._track.can_be_armed and not self._track.arm_has_listener(self._on_arm_changed) and self._track.add_arm_listener(self._on_arm_changed) 474 self._on_arm_changed()
475