class xtouch(ControlSurface): def __init__(self, c_instance): super(xtouch, self).__init__(c_instance) with self.component_guard(): self.__c_instance = c_instance self._highlighting_session_component = None self._device_selection_follows_track_selection = False self._device_component = None self._pad_control_device = None self._track_control_device = None self._should_update_tracks = 0 self._map_modes = Live.MidiMap.MapMode self.current_track_offset = 0 self.current_scene_offset = 0 self.mixer = MixerComponent(128, 24) num_of_tracks = len(self.song().tracks) for index in range(num_of_tracks): self.song().tracks[index].view.add_selected_device_listener( self._reload_track_control) self._reload_track_control() def best_of_parameter_bank(self): return [] def _do_deactivate_pad_control(self): with self.component_guard(): if (self._pad_control_device is not None): device_controls = (None, None, None, None, None, None, None, None) self._pad_control_device.set_parameter_controls( tuple(device_controls)) self._pad_control_device.set_lock_to_device( "", self.actual_device) self._pad_control_device.set_device(None) self._pad_control_device = None def activate_pad_control(self, track, pad): self._do_deactivate_pad_control() with self.component_guard(): self._deactivate_track_control() track_id = track + 8 tracks = self.mixer.song().tracks if track_id < len(tracks): track = tracks[track_id] if (len(track.devices) > 0): drumpad = track.devices[0].drum_pads[36 + pad] if len(drumpad.chains) > 0: if len(drumpad.chains[0].devices) > 0: self.actual_device = drumpad.chains[0].devices[0] def log(msg): self.log_message(msg) self._pad_control_device = CustomDeviceComponent( log) device_controls = ( EncoderElement(MIDI_CC_TYPE, 10, 1, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 2, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 3, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 4, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 5, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 6, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 7, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 8, self._map_modes.absolute), ) self.actual_device.playback_mode = 0 self.actual_device.parameters[31].value = 1.0 self._pad_control_device.set_device( self.actual_device) self._pad_control_device.set_parameter_controls( tuple(device_controls)) self._pad_control_device.set_lock_to_device( "lock", self.actual_device) self.log_message("AA " + str(self._pad_control_device. _current_bank_details())) def deactivate_pad_control(self): with self.component_guard(): self._do_deactivate_pad_control() self._reload_track_control() def _activate_track_control(self): if self._pad_control_device is not None: return if (len(self.mixer.selected_strip()._track.devices) > 0): devices = self.mixer.selected_strip()._track.devices self.actual_device = devices[0] self._track_control_device = DeviceComponent() device_controls = ( EncoderElement(MIDI_CC_TYPE, 10, 1, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 2, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 3, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 4, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 5, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 6, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 7, self._map_modes.absolute), EncoderElement(MIDI_CC_TYPE, 10, 8, self._map_modes.absolute), ) self._track_control_device.set_device(self.actual_device) self._track_control_device.set_parameter_controls( tuple(device_controls)) self._track_control_device.set_lock_to_device( "lock", self.actual_device) def _deactivate_track_control(self): if (self._track_control_device is not None): device_controls = (None, None, None, None, None, None, None, None) self._track_control_device.set_parameter_controls( tuple(device_controls)) self._track_control_device.set_lock_to_device( "", self.actual_device) self._track_control_device.set_device(None) self._track_control_device = None def _reload_track_control(self, value=None): self._deactivate_track_control() self._activate_track_control() def _highlight_tracks(self): j = [0] def update_next_track(selected): if selected: self.__c_instance.send_midi((10 | 0x90, 8 + j[0], 127)) else: self.__c_instance.send_midi((10 | 0x80, 8 + j[0], 0)) j[0] += 1 selected_track = self.song().view.selected_track for i in [0, 1, 2, 3, 4, 5, 6, 7, 17, 18]: track_selected = False if i < len(self.song().tracks): if self.song().tracks[i] == selected_track: track_selected = True update_next_track(track_selected) update_next_track(self.song().return_tracks[0] == selected_track) update_next_track(self.song().return_tracks[1] == selected_track) update_next_track(self.song().master_track == selected_track) def _on_selected_track_changed(self): ControlSurface._on_selected_track_changed(self) self._display_reset_delay = 0 self._reload_track_control() self._should_update_tracks = 3 def build_midi_map(self, midi_map_handle): ControlSurface.build_midi_map(self, midi_map_handle) for i in range(0, 16): Live.MidiMap.forward_midi_note(self.__c_instance.handle(), midi_map_handle, 10, 8 + i) def receive_midi(self, midi_bytes): ControlSurface.receive_midi(self, midi_bytes) if (midi_bytes[0] == 10 | 0x90) or (midi_bytes[0] == 10 | 0x80): if midi_bytes[1] >= 8 and midi_bytes[1] <= 24: track_id = midi_bytes[1] - 8 if (track_id < 8): self.song().view.selected_track = self.song( ).tracks[track_id] elif (track_id < 10): self.song().view.selected_track = self.song().tracks[ 9 + track_id] elif (track_id < 12): self.song().view.selected_track = self.song( ).return_tracks[track_id - 10] else: self.song().view.selected_track = self.song().master_track self._should_update_tracks = 2 def update_display(self): ControlSurface.update_display(self) if self._should_update_tracks == 1: self._highlight_tracks() self._should_update_tracks = 0 if self._should_update_tracks > 1: self._should_update_tracks -= 1 def disconnect(self): super(xtouch, self).disconnect()