1
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
11 """ Class attaching to the mixer of a given track """
12 _active_instances = []
13
22
23 number_of_arms_pressed = staticmethod(number_of_arms_pressed)
24
33
34 number_of_solos_pressed = staticmethod(number_of_solos_pressed)
35 empty_color = None
36
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
118
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
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
195
203
214
225
237
250
262
274
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
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
296
299
305
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
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
352
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
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
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
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
416 raise self._shift_button != None or AssertionError
417 self._shift_pressed = value != 0
418
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
430
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
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
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
461
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
475