def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._session_ring.set_enabled(True) self._session_navigation = SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation.layer = Layer(priority = 4, down_button = self._button[14], up_button = self._button[15], left_button = self._button[12], right_button = self._button[13]) self._session_navigation.set_enabled(True) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(priority = 4, clip_launch_buttons = self._matrix.submatrix[:,:]) self._session.set_enabled(True)
def _create_session(self): self._session_ring = SessionRingComponent(num_tracks=NUM_TRACKS, num_scenes=NUM_SCENES, is_enabled=False, name=u'Session_Ring') self._session = SessionComponent(session_ring=self._session_ring, name=u'Session') self._session.set_rgb_mode(LIVE_COLORS_TO_MIDI_VALUES, RGB_COLOR_TABLE)
def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 1, num_scenes = 4, tracks_to_use = lambda : self.song.visible_tracks + self.song.return_tracks) self._session_ring.set_enabled(False) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(scene_launch_buttons = self._scene_launch_matrix) self._session_navigation =SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation.layer = Layer(left_button = self._button[1], right_button = self._button[0]) self._session_navigation.set_enabled(True)
class Blocks(ControlSurface): def __init__(self, *a, **k): super(Blocks, self).__init__(*a, **k) with self.component_guard(): self._create_controls() self._create_session() self._create_navigation() self._create_drums() self._create_drum_finder() self._create_modes() self.set_feedback_channels(FEEDBACK_CHANNELS) self.__on_target_track_changed.subject = self._target_track_provider self.__on_armed_tracks_changed.subject = self._target_track_provider self.__on_percussion_instrument_found.subject = self._percussion_instrument_finder self.__on_percussion_instrument_found() self.__on_tempo_changed_in_live.subject = self.song self.__on_tempo_changed_in_live() self.__on_session_record_changed.subject = self.song self._set_feedback_velocity() def _create_controls(self): self._pads_raw = [ ButtonElement(True, MIDI_NOTE_TYPE, 0, identifier, name=u'Pad_{}'.format(identifier), skin=skin) for identifier in range(100) ] self._session_matrix = ButtonMatrixElement( rows=[[self._pads_raw[offset + col] for col in range(NUM_TRACKS)] for offset in range(80, 49, -10)], name=u'Session_Matrix') self._scene_launch_button_matrix = ButtonMatrixElement( rows=[[ self._pads_raw[identifier] for identifier in range(89, 58, -10) ]], name=u'Scene_Launch_Button_Matrix') self._stop_all_clips_button = ButtonElement( True, MIDI_NOTE_TYPE, 0, 127, skin=skin, name=u'Stop_All_Clips_Button') self._nav_down_button = self._pads_raw[90] self._nav_up_button = self._pads_raw[91] self._nav_left_button = self._pads_raw[92] self._nav_right_button = self._pads_raw[93] self._mode_cycle_button = ButtonElement(True, MIDI_CC_TYPE, 0, 127, skin=skin, name=u'Mode_Button') self._drum_pads = ButtonMatrixElement( rows=[[self._pads_raw[offset + col] for col in range(4)] for offset in range(48, 35, -4)], name=u'Drum_Pads') self._tempo_encoder = EncoderElement( MIDI_PB_TYPE, 0, 0, Live.MidiMap.MapMode.absolute, send_should_depend_on_forwarding=False, name=u'Tempo_Encoder') self._tempo_encoder.reset = nop self._sysex_element = SysexElement(sysex_identifier=SYSEX_HEADER, name=u'Sysex_Element') self._sysex_element.add_value_listener(nop) self._surface_update_message_element = ButtonElement( True, MIDI_CC_TYPE, 0, 64, name=u'Surface_Update_Message_Element') self.__on_surface_update_message_received.subject = self._surface_update_message_element def _create_session(self): self._session_ring = SessionRingComponent(num_tracks=NUM_TRACKS, num_scenes=NUM_SCENES, is_enabled=False, name=u'Session_Ring') self._session = SessionComponent(session_ring=self._session_ring, name=u'Session') self._session.set_rgb_mode(LIVE_COLORS_TO_MIDI_VALUES, RGB_COLOR_TABLE) def _create_navigation(self): self._session_navigation = SessionNavigationComponent( session_ring=self._session_ring, name=u'Session_Navigation') def _create_drums(self): self._drum_group = DrumGroupComponent( name=u'Drum_Group', translation_channel=DRUM_FEEDBACK_CHANNEL) def _create_drum_finder(self): self._target_track_provider = TargetTrackProvider() self._percussion_instrument_finder = self.register_disconnectable( PercussionInstrumentFinder( device_parent=self._target_track_provider.target_track)) def _create_modes(self): self._note_modes = ModesComponent(name=u'Note_Modes', is_enabled=False) self._melodic_pad_translator = ElementTranslator( self._pads_raw, MELODIC_FEEDBACK_CHANNEL, NON_FEEDBACK_CHANNEL) self._note_modes.add_mode(u'drum', [ partial(self._send_mode_message, u'drum'), LayerMode(self._drum_group, Layer(matrix=self._drum_pads)) ]) self._note_modes.add_mode(u'melodic', [ partial(self._send_mode_message, u'melodic'), self._melodic_pad_translator ]) self._note_modes.add_mode( u'disabled', [partial(self._send_mode_message, u'disabled')]) self._modes = ModesComponent(name=u'Modes') self._modes.add_mode(u'session', [ partial(self._send_mode_message, u'session'), partial(self._clear_send_cache, self._pads_raw), LayerMode( self._session, Layer(clip_launch_buttons=self._session_matrix, scene_launch_buttons=self._scene_launch_button_matrix, stop_all_clips_button=self._stop_all_clips_button)), LayerMode( self._session_navigation, Layer(down_button=self._nav_down_button, up_button=self._nav_up_button, left_button=self._nav_left_button, right_button=self._nav_right_button)) ]) self._modes.add_mode(u'note', [self._note_modes, self._select_note_mode]) self._modes.cycle_mode_button.set_control_element( self._mode_cycle_button) self._modes.selected_mode = u'session' @listens(u'target_track') def __on_target_track_changed(self): self._percussion_instrument_finder.device_parent = self._target_track_provider.target_track self._select_note_mode() @listens(u'instrument') def __on_percussion_instrument_found(self): self._drum_group.set_drum_group_device( self._percussion_instrument_finder.drum_group) self._select_note_mode() @listens(u'armed_tracks') def __on_armed_tracks_changed(self): self._set_feedback_velocity() @listens(u'tempo') def __on_tempo_changed_in_live(self): normalized_tempo = old_div( clamp(self.song.tempo, TEMPO_MIN, TEMPO_MAX) - TEMPO_MIN, TEMPO_MAX - TEMPO_MIN) value_to_send = clamp(int(normalized_tempo * PB_VALUE_RANGE_MAX), 0, PB_VALUE_RANGE_MAX) self._tempo_encoder.send_value(value_to_send) @listens(u'session_record') def __on_session_record_changed(self): self._set_feedback_velocity() @listens(u'value') def __on_surface_update_message_received(self, value): if value: self._clear_send_cache(self.controls) self.update() self.__on_tempo_changed_in_live() def _set_feedback_velocity(self): target_track = self._target_track_provider.target_track if self.song.session_record and liveobj_valid( target_track) and target_track.arm: feedback_velocity = Rgb.RED.midi_value else: feedback_velocity = Rgb.GREEN.midi_value self._c_instance.set_feedback_velocity(int(feedback_velocity)) def _select_note_mode(self): track = self._target_track_provider.target_track drum_device = self._percussion_instrument_finder.drum_group if not is_playable(track): self._note_modes.selected_mode = u'disabled' elif drum_device: self._note_modes.selected_mode = u'drum' else: self._note_modes.selected_mode = u'melodic' if self._note_modes.selected_mode == u'disabled': self.release_controlled_track() else: self.set_controlled_track(track) def _send_mode_message(self, mode): self._send_midi( (CC_STATUS + MODE_MSG_CHANNEL, MODE_NAMES_TO_IDS[mode], 127)) def _clear_send_cache(self, controls): for control in controls: control.clear_send_cache() def port_settings_changed(self): super(Blocks, self).port_settings_changed() self.set_feedback_channels(FEEDBACK_CHANNELS)
class GuitarWing(LividControlSurface): _sysex_id = 20 _model_name = 'GuitarWing' def __init__(self, *a, **k): super(GuitarWing, self).__init__(*a, **k) self._skin = Skin(GuitarWingColors) with self.component_guard(): self._setup_controls() self._setup_m4l_interface() self._setup_session_control() self._setup_mixer_control() self._setup_device_control() self._setup_transport_control() self._setup_view_control() def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(10)] self._fader = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = SLIDERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._fader_button = [MonoEncoderElement(msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = SLIDERS[index], name = 'Fader_Button_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._ccs = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CCS[index], name = 'CCs_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(4)] self._pad = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = PADS[index], name = 'Pad_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(5)] self._padCC = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = PADS[index], name = 'PadCC_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(5)] self._accel = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = ACCELS[index], name = 'Accel_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._parameter_control_matrix = ButtonMatrixElement(rows = [ [ self._fader[0], self._fader[1], self._fader[2], self._accel[2], self._ccs[0], self._ccs[1], self._ccs[2], self._ccs[3] ]]) self._scene_launch_matrix = ButtonMatrixElement(rows = [self._pad[:4]]) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 1, num_scenes = 4, tracks_to_use = lambda : self.song.visible_tracks + self.song.return_tracks) self._session_ring.set_enabled(False) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(scene_launch_buttons = self._scene_launch_matrix) self._session_navigation =SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation.layer = Layer(left_button = self._button[1], right_button = self._button[0]) self._session_navigation.set_enabled(True) def _setup_mixer_control(self): self._mixer = MonoMixerComponent(name = 'Mixer', tracks_provider = self._session_ring, track_assigner = SimpleTrackAssigner(), invert_mute_feedback = True, auto_name = True, enable_skinning = True, channel_strip_component_type = MonoChannelStripComponent) self.song.view.selected_track = self._mixer.channel_strip(0)._track def _setup_transport_control(self): self._transport = TransportComponent() self._transport.layer = Layer(play_button = self._button[6], loop_button = self._button[7], seek_backward_button = self._button[8], record_button = self._button[9]) self._transport.set_enabled(True) def _setup_device_control(self): self._device = DeviceComponent(name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._device.layer = Layer(parameter_controls = self._parameter_control_matrix) self._device.set_enabled(True) def _setup_m4l_interface(self): self._m4l_interface = M4LInterfaceComponent(controls=self.controls, component_guard=self.component_guard) self.get_control_names = self._m4l_interface.get_control_names self.get_control = self._m4l_interface.get_control self.grab_control = self._m4l_interface.grab_control self.release_control = self._m4l_interface.release_control def _setup_view_control(self): self._view_control = ViewControlComponent() self._view_control.layer = Layer(prev_track_button = self._button[1], next_track_button = self._button[0])
class Cntrlr(LividControlSurface): __module__ = __name__ __doc__ = " Monomodular controller script for Livid CNTRLR " _sysex_id = 8 _model_name = 'Cntrlr' _host_name = 'Cntrlr' monomodular = None device_provider_class = ModDeviceProvider def __init__(self, *a, **k): super(Cntrlr, self).__init__(*a, **k) self._skin = Skin(CntrlrColors) self._device_selection_follows_track_selection = FOLLOW with self.component_guard(): self._setup_controls() self._define_sysex() self._setup_background() #self._setup_autoarm() self._setup_viewcontrol() self._setup_session_control() self._setup_mixer_control() self._setup_transport_control() #self._setup_device_control() #self._setup_device_selector() #self._setup_session_recording_component() #self._setup_modes() self._setup_m4l_interface() def _initialize_script(self): super(Cntrlr, self)._initialize_script() self._connected = True #self._main_modes.selected_mode = 'MixMode' self._session_ring._update_highlight() self._session_ring.track_offset = 0 if liveobj_valid(self.song.visible_tracks[0]): self.song.view.selected_track = self.song.visible_tracks[0] def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._fader = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_FADERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(8)] self._dial_left = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_LEFT[index], name = 'Dial_Left_' + str(index), num = CNTRLR_KNOBS_LEFT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._dial_right = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_RIGHT[index], name = 'Dial_Right_' + str(index), num = CNTRLR_KNOBS_RIGHT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder = [CodecEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_DIALS[index], name = 'Encoder_' + str(index), num = CNTRLR_DIALS[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder_button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_DIAL_BUTTONS[index], name = 'Encoder_Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._grid = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_GRID[index], name = 'Grid_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(16)] self._button = [MonoButtonElement(is_momentary = is_momentary,msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(32)] self._knobs = self._dial_left + self._dial_right self._fader_matrix = ButtonMatrixElement(name = 'Fader_Matrix', rows = [self._fader]) self._matrix = ButtonMatrixElement(name = 'Matrix', rows = [self._grid[index*4:(index*4)+4] for index in range(4)]) self._knob_left_matrix = ButtonMatrixElement(name = 'Knob_Left_Matrix', rows = [self._dial_left[index*4:(index*4)+4] for index in range(3)]) self._knob_right_matrix = ButtonMatrixElement(name = 'Knob_Right_Matrix', rows = [self._dial_right[index*4:(index*4)+4] for index in range(3)]) self._dial_matrix = ButtonMatrixElement(name = 'Dial_Matrix', rows = [self._encoder[index*4:(index*4)+4] for index in range(3)]) self._dial_button_matrix = ButtonMatrixElement(name = 'Dial_Button_Matrix', rows = [self._encoder_button[index*4:(index*4)+4] for index in range(1,3)]) self._key_matrix = ButtonMatrixElement(name = 'Key_Matrix', rows = [self._button[0:16], self._button[16:32]]) self._translated_controls = self._fader + self._knobs + self._encoder[4:] + self._grid + self._button def _setup_background(self): self._background = BackgroundComponent(name = 'Background') self._background.layer = Layer(priority = 3, matrix = self._matrix.submatrix[:,:], faders = self._fader_matrix.submatrix[:,:], left_knobs = self._knob_left_matrix.submatrix[:,:], right_knobs = self._knob_right_matrix.submatrix[:,:], dials = self._dial_matrix, dial_buttons = self._dial_button_matrix.submatrix[:,:], keys = self._key_matrix.submatrix[:,:]) self._background.set_enabled(True) def _define_sysex(self): #self.encoder_navigation_on = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_encoder_encosion_mode', message = [13, 0, 0, 0]) pass def _setup_transport_control(self): self._transport = CntrlrTransportComponent(name = 'Transport') self._transport._play_toggle.view_transform = lambda value: 'Transport.PlayOn' if value else 'Transport.PlayOff' self._transport._record_toggle.view_transform = lambda value: 'Transport.RecordOn' if value else 'Transport.RecordOff' self._transport._nudge_up_toggle.view_transform = lambda value: 'Transport.NudgeOn' if value else 'Transport.NudgeOff' self._transport._nudge_down_toggle.view_transform = lambda value: 'Transport.NudgeOn' if value else 'Transport.NudgeOff' self._transport._loop_toggle.view_transform = lambda value: 'Transport.LoopOn' if value else 'Transport.LoopOff' self._transport.layer = Layer(priority = 4, play_button = self._button[28], stop_button = self._button[29], record_button = self._button[30], tap_tempo_button = self._button[31], nudge_up_button = self._button[3], nudge_down_button = self._button[19], loop_button = self._button[23]) self._transport.set_enabled(True) def _setup_autoarm(self): self._auto_arm = CntrlrAutoArmComponent(name='Auto_Arm') #self._auto_arm._update_notification = lambda a: None self._auto_arm.can_auto_arm_track = self._can_auto_arm_track def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = FixedLengthSessionRecordingComponent(clip_creator = self._clip_creator, view_controller = ViewControlComponent(), name = 'SessionRecorder') # is_enabled = False) self._recorder.main_layer = AddLayerMode(self._recorder, Layer(priority = 4, record_button = self._button[29])) #self._recorder.shift_layer = AddLayerMode(self._recorder, Layer(priority = 4, automation_button = self._button[29])) self._recorder.set_enabled(False) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._session_ring.set_enabled(True) self._session_navigation = SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation.layer = Layer(priority = 4, down_button = self._button[14], up_button = self._button[15], left_button = self._button[12], right_button = self._button[13]) self._session_navigation.set_enabled(True) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(priority = 4, clip_launch_buttons = self._matrix.submatrix[:,:]) self._session.set_enabled(True) def _setup_mixer_control(self): self._mixer_session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._mixer = MonoMixerComponent(name = 'Mixer', tracks_provider = self._mixer_session_ring, track_assigner = simple_track_assigner, invert_mute_feedback = True, auto_name = True, enable_skinning = True) self._mixer.layer = Layer(priority = 4, solo_buttons = self._key_matrix.submatrix[8:11, 0], stop_clip_buttons = self._key_matrix.submatrix[:3, 0], track_select_buttons = self._key_matrix.submatrix[4:8, 0],) for strip in self._mixer._channel_strips: strip._on_select_button_double_clicked = self._toggle_view self._mixer.set_enabled(True) def _toggle_view(self, *a): debug('toggle_view') debug('Clip is visible:', self.application.view.is_view_visible('Detail/Clip')) debug('Device is visible:', self.application.view.is_view_visible('Detail/DeviceChain')) if self.application.view.is_view_visible('Detail/Clip'): self._view_control.show_view('Detail/DeviceChain') else: self._view_control.show_view('Detail/Clip') def _setup_device_control(self): self._device_selection_follows_track_selection = FOLLOW self._device = DeviceComponent(name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._device.layer = Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3],) #self._device.mod_layer = AddLayerMode(self._device, Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3],)) self._device.main_layer = AddLayerMode(self._device, Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3], on_off_button = self._encoder_button[4], bank_prev_button = self._encoder_button[6], bank_next_button = self._encoder_button[7],)) #lock_button = self._encoder_button[5], self._device.set_enabled(False) self._device_navigator = DeviceNavigator(self._device_provider, self._mixer, self) self._device_navigator.name = 'Device_Navigator' self._device_navigator.select_dial_layer = AddLayerMode(self._device_navigator, Layer(priority = 6, device_select_dial = self._encoder[0],)) self._device_navigator.main_layer = AddLayerMode(self._device_navigator, Layer(priority = 4, prev_chain_button = self._encoder_button[8], next_chain_button = self._encoder_button[9], exit_button = self._encoder_button[10], enter_button = self._encoder_button[11],)) self._device_navigator.set_enabled(False) def _setup_device_selector(self): self._device_selector = DeviceSelectorComponent(self) self._device_selector.name = 'Device_Selector' #self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6 , matrix = self._matrix.submatrix[:, :])) self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6, matrix = ButtonMatrixElement(rows = [self._grid[:4],self._grid[4:8],self._grid[8:12],self._grid[12:14]]))) self._device_selector.assign_layer = AddLayerMode(self._device_selector, Layer(priority = 7, assign_button = self._grid[14])) self._device_selector.set_enabled(False) def _setup_viewcontrol(self): self._view_control = ViewControlComponent(name='View_Control') #self._view_control.main_layer = AddLayerMode(self._view_control, Layer(priority = 5, # scene_select_dial = self._encoder[2], # track_select_dial = self._encoder[3],)) #self._view_control.main_layer = AddLayerMode(self._view_control, Layer(prev_track_button=self._button[24], # next_track_button= self._button[25], # next_scene_button=self._button[27], # prev_scene_button = self._button[26])) self._view_control.set_enabled(True) def _setup_modes(self): common = CompoundMode(self._mixer, self._session_ring) main_buttons=CompoundMode(self._mixer.main_buttons_layer, self._transport, self._recorder, self._recorder.main_layer, self._device,) shifted_main_buttons=CompoundMode(self._mixer.solo_buttons_layer, self._recorder, self._recorder.shift_layer, self._session.scene_launch_layer, self._device,) main_faders=CompoundMode(self._mixer.main_faders_layer, self._mixer.master_fader_layer) main_dials=CompoundMode(self._view_control, self._view_control.main_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on) shifted_dials=CompoundMode(self._session_navigation, self._session_navigation.nav_dial_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on) self._modalt_mode = ModesComponent(name = 'ModAltMode') self._modalt_mode.add_mode('disabled', None) self._modalt_mode.add_mode('enabled', [tuple([self._enable_mod_alt, self._disable_mod_alt])], behaviour = CancellableBehaviourWithRelease(), cycle_mode_button_color = 'Mod.AltOn') self._modalt_mode.selected_mode = 'disabled' self._modalt_mode.set_enabled(False) self._modalt_mode.layer = Layer(priority = 4, enabled_button = self._encoder_button[1]) self._modswitcher = ModesComponent(name = 'ModSwitcher') self._modswitcher.add_mode('mod', [self.modhandler, self._modalt_mode, main_faders, self._mixer.main_knobs_layer, self._device, main_dials, DelayMode(self.modhandler.update, delay = .5, parent_task_group = self._task_group)]) self._modswitcher.add_mode('instrument', [self._instrument.shift_button_layer, main_buttons, main_faders, self._mixer.main_knobs_layer, self._device, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer]) #self._instrument.shift_button_layer, self._optional_translations]) self._modswitcher.selected_mode = 'instrument' self._modswitcher.set_enabled(False) self._instrument._main_modes = ModesComponent(name = 'InstrumentModes') self._instrument._main_modes.add_mode('disabled', [main_buttons, main_dials, self._device.main_layer, self._session, self._session, self._session.clip_launch_layer]) self._instrument._main_modes.add_mode('drumpad', [self._instrument._drumpad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_split', [self._instrument._drumpad.split_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer', [self._instrument._drumpad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_shifted', [self._instrument._drumpad.sequencer_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_split_shifted', [self._instrument._drumpad.split_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_shifted', [self._instrument._drumpad.sequencer_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad', [self._instrument._keypad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_split', [self._instrument._keypad.split_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_sequencer', [self._instrument._keypad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_shifted', [self._instrument._keypad.sequencer_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad_split_shifted', [self._instrument._keypad.split_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_shifted', [self._instrument._keypad.sequencer_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_session', [self._instrument._drumpad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_split_session', [self._instrument._drumpad.split_session_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_session', [self._instrument._drumpad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_shifted_session', [self._instrument._drumpad.sequencer_session_shift_layer, self._instrument.drumpad_shift_layer, main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_split_shifted_session', [self._instrument._drumpad.split_session_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_shifted_session', [self._instrument._drumpad.sequencer_session_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_session', [self._instrument._keypad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_split_session', [self._instrument._keypad.split_session_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_session', [self._instrument._keypad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_shifted_session', [self._instrument._keypad.sequencer_session_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_split_shifted_session', [self._instrument._keypad.split_session_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_shifted_session', [self._instrument._keypad.sequencer_session_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('audioloop', [self._instrument.audioloop_layer, main_buttons, self._device.main_layer, main_dials, self._session, DelayMode(self._session.clip_launch_layer, delay = .1)]) self._instrument._main_modes.add_mode('audioloop_shifted', [self._instrument.audioloop_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) #self._instrument._main_modes.add_mode('audioloop_shifted_session', [self._instrument.audioloop_layer, self._session, shifted_main_buttons, main_dials, shifted_dials]) self._instrument.register_component(self._instrument._main_modes) self._instrument._main_modes.selected_mode = 'disabled' self._instrument.set_enabled(True) self._main_modes = ModesComponent(name = 'MainModes') self._main_modes.add_mode('disabled', [self._background]) self._main_modes.add_mode('MixMode', [common, self._instrument, self._instrument.shift_button_layer, self._mixer, main_faders, self._mixer.main_knobs_layer, self._device, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer]) self._main_modes.add_mode('ModSwitcher', [common, main_faders, main_dials, self._mixer.main_knobs_layer, self._view_control, self._view_control.main_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on, self._modswitcher, DelayMode(self._update_modswitcher, delay = .1)], behaviour = ColoredCancellableBehaviourWithRelease(color = 'ModeButtons.ModSwitcher', off_color = 'ModeButtons.ModSwitcherDisabled')) self._main_modes.add_mode('Translations', [common, main_faders, main_dials, self._mixer.main_knobs_layer, self._translations, DelayMode(self._translations.selector_layer, delay = .1)], behaviour = DefaultedBehaviour(default_mode = 'MixMode', color = 'ModeButtons.Translations', off_color = 'ModeButtons.TranslationsDisabled')) self._main_modes.add_mode('DeviceSelector', [common, self._device_selector, DelayMode(self._device_selector.select_layer, delay = .1), DelayMode(self.modhandler.lock_layer, delay = .1), DelayMode(self._device_selector.assign_layer, delay = .5), main_buttons, main_dials, main_faders, self._mixer.main_knobs_layer, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer], behaviour = ColoredCancellableBehaviourWithRelease(color = 'ModeButtons.DeviceSelector', off_color = 'ModeButtons.DeviceSelectorDisabled')) self._main_modes.layer = Layer(priority = 4, ModSwitcher_button = self._encoder_button[2], DeviceSelector_button = self._encoder_button[0], Translations_button = self._encoder_button[3]) #, self._main_modes.selected_mode = 'disabled' self._main_modes.set_enabled(True) self._test.subject = self._instrument._main_modes def _setup_modes(self): pass def _setup_m4l_interface(self): self._m4l_interface = M4LInterfaceComponent(controls=self.controls, component_guard=self.component_guard, priority = 10) self._m4l_interface.name = "M4LInterface" self.get_control_names = self._m4l_interface.get_control_names self.get_control = self._m4l_interface.get_control self.grab_control = self._m4l_interface.grab_control self.release_control = self._m4l_interface.release_control def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith('Cntrlr Input') def _get_num_tracks(self): return self.num_tracks # a
class Cntrlr(LividControlSurface): __module__ = __name__ __doc__ = " Monomodular controller script for Livid CNTRLR " _sysex_id = 8 _model_name = 'Cntrlr' _host_name = 'Cntrlr' monomodular = None device_provider_class = ModDeviceProvider def __init__(self, *a, **k): super(Cntrlr, self).__init__(*a, **k) self._skin = Skin(CntrlrColors) self._device_selection_follows_track_selection = FOLLOW with self.component_guard(): self._setup_controls() self._define_sysex() self._setup_background() #self._setup_autoarm() self._setup_viewcontrol() self._setup_session_control() self._setup_mixer_control() self._setup_transport_control() #self._setup_device_control() #self._setup_device_selector() #self._setup_session_recording_component() #self._setup_modes() self._setup_m4l_interface() def _initialize_script(self): super(Cntrlr, self)._initialize_script() self._connected = True #self._main_modes.selected_mode = 'MixMode' self._session_ring._update_highlight() self._session_ring.track_offset = 0 if liveobj_valid(self.song.visible_tracks[0]): self.song.view.selected_track = self.song.visible_tracks[0] def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._fader = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_FADERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(8)] self._dial_left = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_LEFT[index], name = 'Dial_Left_' + str(index), num = CNTRLR_KNOBS_LEFT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._dial_right = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_RIGHT[index], name = 'Dial_Right_' + str(index), num = CNTRLR_KNOBS_RIGHT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder = [CodecEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_DIALS[index], name = 'Encoder_' + str(index), num = CNTRLR_DIALS[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder_button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_DIAL_BUTTONS[index], name = 'Encoder_Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._grid = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_GRID[index], name = 'Grid_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(16)] self._button = [MonoButtonElement(is_momentary = is_momentary,msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(32)] self._knobs = self._dial_left + self._dial_right self._fader_matrix = ButtonMatrixElement(name = 'Fader_Matrix', rows = [self._fader]) self._matrix = ButtonMatrixElement(name = 'Matrix', rows = [self._grid[index*4:(index*4)+4] for index in range(4)]) self._knob_left_matrix = ButtonMatrixElement(name = 'Knob_Left_Matrix', rows = [self._dial_left[index*4:(index*4)+4] for index in range(3)]) self._knob_right_matrix = ButtonMatrixElement(name = 'Knob_Right_Matrix', rows = [self._dial_right[index*4:(index*4)+4] for index in range(3)]) self._dial_matrix = ButtonMatrixElement(name = 'Dial_Matrix', rows = [self._encoder[index*4:(index*4)+4] for index in range(3)]) self._dial_button_matrix = ButtonMatrixElement(name = 'Dial_Button_Matrix', rows = [self._encoder_button[index*4:(index*4)+4] for index in range(1,3)]) self._key_matrix = ButtonMatrixElement(name = 'Key_Matrix', rows = [self._button[0:16], self._button[16:32]]) self._translated_controls = self._fader + self._knobs + self._encoder[4:] + self._grid + self._button def _setup_background(self): self._background = BackgroundComponent(name = 'Background') self._background.layer = Layer(priority = 3, matrix = self._matrix.submatrix[:,:], faders = self._fader_matrix.submatrix[:,:], left_knobs = self._knob_left_matrix.submatrix[:,:], right_knobs = self._knob_right_matrix.submatrix[:,:], dials = self._dial_matrix, dial_buttons = self._dial_button_matrix.submatrix[:,:], keys = self._key_matrix.submatrix[:,:]) self._background.set_enabled(True) def _define_sysex(self): #self.encoder_navigation_on = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_encoder_encosion_mode', message = [13, 0, 0, 0]) pass def _setup_transport_control(self): self._transport = CntrlrTransportComponent(name = 'Transport') self._transport._play_toggle.view_transform = lambda value: 'Transport.PlayOn' if value else 'Transport.PlayOff' self._transport._record_toggle.view_transform = lambda value: 'Transport.RecordOn' if value else 'Transport.RecordOff' self._transport._nudge_up_toggle.view_transform = lambda value: 'Transport.NudgeOn' if value else 'Transport.NudgeOff' self._transport._nudge_down_toggle.view_transform = lambda value: 'Transport.NudgeOn' if value else 'Transport.NudgeOff' self._transport._loop_toggle.view_transform = lambda value: 'Transport.LoopOn' if value else 'Transport.LoopOff' self._transport.layer = Layer(priority = 4, play_button = self._button[28], stop_button = self._button[29], record_button = self._button[30], tap_tempo_button = self._button[31], nudge_up_button = self._button[3], nudge_down_button = self._button[19], loop_button = self._button[23]) self._transport.set_enabled(True) def _setup_autoarm(self): self._auto_arm = CntrlrAutoArmComponent(name='Auto_Arm') #self._auto_arm._update_notification = lambda a: None self._auto_arm.can_auto_arm_track = self._can_auto_arm_track def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = FixedLengthSessionRecordingComponent(clip_creator = self._clip_creator, view_controller = ViewControlComponent(), name = 'SessionRecorder') # is_enabled = False) self._recorder.main_layer = AddLayerMode(self._recorder, Layer(priority = 4, record_button = self._button[29])) #self._recorder.shift_layer = AddLayerMode(self._recorder, Layer(priority = 4, automation_button = self._button[29])) self._recorder.set_enabled(False) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._session_ring.set_enabled(True) self._session_navigation = SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.disabled_color = 'Session.PageNavigationButtonOff' self._session_navigation.layer = Layer(priority = 4, down_button = self._button[14], up_button = self._button[15], left_button = self._button[12], right_button = self._button[13]) self._session_navigation.set_enabled(True) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(priority = 4, clip_launch_buttons = self._matrix.submatrix[:,:]) self._session.set_enabled(True) def _setup_mixer_control(self): self._mixer_session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._mixer = MonoMixerComponent(name = 'Mixer', tracks_provider = self._mixer_session_ring, track_assigner = simple_track_assigner, invert_mute_feedback = True, auto_name = True, enable_skinning = True) self._mixer.layer = Layer(priority = 4, solo_buttons = self._key_matrix.submatrix[8:11, 0], stop_clip_buttons = self._key_matrix.submatrix[:3, 0], track_select_buttons = self._key_matrix.submatrix[4:8, 0],) for strip in self._mixer._channel_strips: strip._on_select_button_double_clicked = self._toggle_view self._mixer.set_enabled(True) def _toggle_view(self, *a): debug('toggle_view') debug('Clip is visible:', self.application().view.is_view_visible('Detail/Clip')) debug('Device is visible:', self.application().view.is_view_visible('Detail/DeviceChain')) if self.application().view.is_view_visible('Detail/Clip'): self._view_control.show_view('Detail/DeviceChain') else: self._view_control.show_view('Detail/Clip') def _setup_device_control(self): self._device_selection_follows_track_selection = FOLLOW self._device = DeviceComponent(name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._device.layer = Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3],) #self._device.mod_layer = AddLayerMode(self._device, Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3],)) self._device.main_layer = AddLayerMode(self._device, Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:3], on_off_button = self._encoder_button[4], bank_prev_button = self._encoder_button[6], bank_next_button = self._encoder_button[7],)) #lock_button = self._encoder_button[5], self._device.set_enabled(False) self._device_navigator = DeviceNavigator(self._device_provider, self._mixer, self) self._device_navigator.name = 'Device_Navigator' self._device_navigator.select_dial_layer = AddLayerMode(self._device_navigator, Layer(priority = 6, device_select_dial = self._encoder[0],)) self._device_navigator.main_layer = AddLayerMode(self._device_navigator, Layer(priority = 4, prev_chain_button = self._encoder_button[8], next_chain_button = self._encoder_button[9], exit_button = self._encoder_button[10], enter_button = self._encoder_button[11],)) self._device_navigator.set_enabled(False) def _setup_device_selector(self): self._device_selector = DeviceSelectorComponent(self) self._device_selector.name = 'Device_Selector' #self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6 , matrix = self._matrix.submatrix[:, :])) self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6, matrix = ButtonMatrixElement(rows = [self._grid[:4],self._grid[4:8],self._grid[8:12],self._grid[12:14]]))) self._device_selector.assign_layer = AddLayerMode(self._device_selector, Layer(priority = 7, assign_button = self._grid[14])) self._device_selector.set_enabled(False) def _setup_viewcontrol(self): self._view_control = ViewControlComponent(name='View_Control') #self._view_control.main_layer = AddLayerMode(self._view_control, Layer(priority = 5, # scene_select_dial = self._encoder[2], # track_select_dial = self._encoder[3],)) #self._view_control.main_layer = AddLayerMode(self._view_control, Layer(prev_track_button=self._button[24], # next_track_button= self._button[25], # next_scene_button=self._button[27], # prev_scene_button = self._button[26])) self._view_control.set_enabled(True) def _setup_modes(self): common = CompoundMode(self._mixer, self._session_ring) main_buttons=CompoundMode(self._mixer.main_buttons_layer, self._transport, self._recorder, self._recorder.main_layer, self._device,) shifted_main_buttons=CompoundMode(self._mixer.solo_buttons_layer, self._recorder, self._recorder.shift_layer, self._session.scene_launch_layer, self._device,) main_faders=CompoundMode(self._mixer.main_faders_layer, self._mixer.master_fader_layer) main_dials=CompoundMode(self._view_control, self._view_control.main_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on) shifted_dials=CompoundMode(self._session_navigation, self._session_navigation.nav_dial_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on) self._modalt_mode = ModesComponent(name = 'ModAltMode') self._modalt_mode.add_mode('disabled', None) self._modalt_mode.add_mode('enabled', [tuple([self._enable_mod_alt, self._disable_mod_alt])], behaviour = CancellableBehaviourWithRelease(), cycle_mode_button_color = 'Mod.AltOn') self._modalt_mode.selected_mode = 'disabled' self._modalt_mode.set_enabled(False) self._modalt_mode.layer = Layer(priority = 4, enabled_button = self._encoder_button[1]) self._modswitcher = ModesComponent(name = 'ModSwitcher') self._modswitcher.add_mode('mod', [self.modhandler, self._modalt_mode, main_faders, self._mixer.main_knobs_layer, self._device, main_dials, DelayMode(self.modhandler.update, delay = .5, parent_task_group = self._task_group)]) self._modswitcher.add_mode('instrument', [self._instrument.shift_button_layer, main_buttons, main_faders, self._mixer.main_knobs_layer, self._device, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer]) #self._instrument.shift_button_layer, self._optional_translations]) self._modswitcher.selected_mode = 'instrument' self._modswitcher.set_enabled(False) self._instrument._main_modes = ModesComponent(name = 'InstrumentModes') self._instrument._main_modes.add_mode('disabled', [main_buttons, main_dials, self._device.main_layer, self._session, self._session, self._session.clip_launch_layer]) self._instrument._main_modes.add_mode('drumpad', [self._instrument._drumpad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_split', [self._instrument._drumpad.split_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer', [self._instrument._drumpad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('drumpad_shifted', [self._instrument._drumpad.sequencer_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_split_shifted', [self._instrument._drumpad.split_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_shifted', [self._instrument._drumpad.sequencer_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad', [self._instrument._keypad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_split', [self._instrument._keypad.split_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_sequencer', [self._instrument._keypad.sequencer_layer, main_buttons, self._device.main_layer, main_dials]) self._instrument._main_modes.add_mode('keypad_shifted', [self._instrument._keypad.sequencer_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad_split_shifted', [self._instrument._keypad.split_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_shifted', [self._instrument._keypad.sequencer_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_session', [self._instrument._drumpad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_split_session', [self._instrument._drumpad.split_session_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_session', [self._instrument._drumpad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('drumpad_shifted_session', [self._instrument._drumpad.sequencer_session_shift_layer, self._instrument.drumpad_shift_layer, main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_split_shifted_session', [self._instrument._drumpad.split_session_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('drumpad_sequencer_shifted_session', [self._instrument._drumpad.sequencer_session_shift_layer, self._instrument.drumpad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_session', [self._instrument._keypad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_split_session', [self._instrument._keypad.split_session_layer, self._instrument._selected_session, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_session', [self._instrument._keypad.sequencer_session_layer, main_buttons, self._device.main_layer, self._session, DelayMode(self._session.clip_launch_layer, delay = .1), main_dials]) self._instrument._main_modes.add_mode('keypad_shifted_session', [self._instrument._keypad.sequencer_session_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_split_shifted_session', [self._instrument._keypad.split_session_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('keypad_sequencer_shifted_session', [self._instrument._keypad.sequencer_session_shift_layer, self._instrument.keypad_shift_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) self._instrument._main_modes.add_mode('audioloop', [self._instrument.audioloop_layer, main_buttons, self._device.main_layer, main_dials, self._session, DelayMode(self._session.clip_launch_layer, delay = .1)]) self._instrument._main_modes.add_mode('audioloop_shifted', [self._instrument.audioloop_layer, shifted_main_buttons, self._device.main_layer, self._session_zoom, shifted_dials]) #self._instrument._main_modes.add_mode('audioloop_shifted_session', [self._instrument.audioloop_layer, self._session, shifted_main_buttons, main_dials, shifted_dials]) self._instrument.register_component(self._instrument._main_modes) self._instrument._main_modes.selected_mode = 'disabled' self._instrument.set_enabled(True) self._main_modes = ModesComponent(name = 'MainModes') self._main_modes.add_mode('disabled', [self._background]) self._main_modes.add_mode('MixMode', [common, self._instrument, self._instrument.shift_button_layer, self._mixer, main_faders, self._mixer.main_knobs_layer, self._device, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer]) self._main_modes.add_mode('ModSwitcher', [common, main_faders, main_dials, self._mixer.main_knobs_layer, self._view_control, self._view_control.main_layer, self._device_navigator, self._device_navigator.select_dial_layer, self.encoder_navigation_on, self._modswitcher, DelayMode(self._update_modswitcher, delay = .1)], behaviour = ColoredCancellableBehaviourWithRelease(color = 'ModeButtons.ModSwitcher', off_color = 'ModeButtons.ModSwitcherDisabled')) self._main_modes.add_mode('Translations', [common, main_faders, main_dials, self._mixer.main_knobs_layer, self._translations, DelayMode(self._translations.selector_layer, delay = .1)], behaviour = DefaultedBehaviour(default_mode = 'MixMode', color = 'ModeButtons.Translations', off_color = 'ModeButtons.TranslationsDisabled')) self._main_modes.add_mode('DeviceSelector', [common, self._device_selector, DelayMode(self._device_selector.select_layer, delay = .1), DelayMode(self.modhandler.lock_layer, delay = .1), DelayMode(self._device_selector.assign_layer, delay = .5), main_buttons, main_dials, main_faders, self._mixer.main_knobs_layer, self._device.main_layer, self._device_navigator, self._device_navigator.main_layer, self._device_navigator.select_dial_layer], behaviour = ColoredCancellableBehaviourWithRelease(color = 'ModeButtons.DeviceSelector', off_color = 'ModeButtons.DeviceSelectorDisabled')) self._main_modes.layer = Layer(priority = 4, ModSwitcher_button = self._encoder_button[2], DeviceSelector_button = self._encoder_button[0], Translations_button = self._encoder_button[3]) #, self._main_modes.selected_mode = 'disabled' self._main_modes.set_enabled(True) self._test.subject = self._instrument._main_modes def _setup_modes(self): pass def _setup_m4l_interface(self): self._m4l_interface = M4LInterfaceComponent(controls=self.controls, component_guard=self.component_guard, priority = 10) self._m4l_interface.name = "M4LInterface" self.get_control_names = self._m4l_interface.get_control_names self.get_control = self._m4l_interface.get_control self.grab_control = self._m4l_interface.grab_control self.release_control = self._m4l_interface.release_control def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith('Cntrlr Input') def _get_num_tracks(self): return self.num_tracks # a
def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks=4, num_scenes=4) self._session_ring.set_enabled(False) self._session_navigation = CntrlrSessionNavigationComponent( name='SessionNavigation', session_ring=self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation.bank_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.nav_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.select_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5)) self._session_navigation.nav_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.set_enabled(False) self._session = SessionComponent(session_ring=self._session_ring, auto_name=True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.clip_launch_layer = LayerMode( self._session, Layer(priority=5, stop_all_clips_button=self._button[27])) self._session.stop_all_clips_layer = AddLayerMode( self._session, Layer(priority=6, stop_all_clips_button=self._button[27])) self._session.scene_launch_layer = AddLayerMode( self._session._selected_scene, Layer(priority=5, stop_all_clips_button=self._button[27])) self._session.set_enabled(False) self._session_zoom = SessionOverviewComponent( name='SessionZoom', session_ring=self._session_ring, enable_skinning=True) self._session_zoom.layer = Layer(priority=5, ) self._session_zoom.set_enabled(False) self._session_ring2 = SessionRingComponent(num_tracks=4, num_scenes=1, set_session_highlight=nop) self._session_ring2.set_enabled(False) self._session2 = SpecialSessionComponent( session_ring=self._session_ring2, auto_name=True) self._session2._selected_scene.layer = Layer( priority=5, launch_button=self._button[30]) self._session2.layer = Layer( priority=5, stop_all_clips_button=self._button[27], fire_next_scene_button=self._button[31] ) #, fire_scene_button = self._button[28]) self._scene_scroller = ScrollComponent( scrollable=SelectedSceneScroller(song=self.song)) self._scene_scroller.layer = Layer(priority=5, scroll_up_button=self._button[29], scroll_down_button=self._button[28]) self._scene_scroller.set_enabled(False)
class Cntrlr(Base_Cntrlr): def __init__(self, *a, **k): super(Cntrlr, self).__init__(*a, **k) self._skin = Skin(CntrlrColors) for button in self._grid: button._skin = self._skin for button in self._button: button._skin = self._skin for button in self._encoder_button: button._skin = self._skin self._main_modes.selected_mode = 'FrederikMode' self._on_detail_clip_changed.subject = self.song.view self._on_selected_scene_changed.subject = self.song.view #self.set_feedback_channels(range(0, 15)) #self.schedule_message(10, self.initialize_frederik_mode) @listens(u'selected_scene') def _on_selected_scene_changed(self): self._scene_scroller.update() def initialize_frederik_mode(self): self._main_modes.selected_mode = "FrederikMode" def _open_log(self): self.log_message("<<<<<<<<<<<<<<<<<<<<= " + str(self._host_name) + " for Frederik Poisquet " + str(self._version_check) + " log opened =>>>>>>>>>>>>>>>>>>>") self.show_message(str(self._host_name) + ' Control Surface Loaded') def _initialize_script(self): super(Cntrlr, self)._initialize_script() self._connected = True #self._main_modes.selected_mode = 'FrederikMode' #self._main_modes.set_enabled(True) #self._instrument.set_enabled(True) self._main_modes.selected_mode = 'disabled' self._main_modes.selected_mode = 'FrederikMode' #self._session_ring._update_highlight() def _define_sysex(self): self.encoder_navigation_on = SendLividSysexMode( livid_settings=self._livid_settings, call='set_encoder_encosion_mode', message=[0, 0, 0, 0]) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks=4, num_scenes=4) self._session_ring.set_enabled(False) self._session_navigation = CntrlrSessionNavigationComponent( name='SessionNavigation', session_ring=self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation.bank_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.nav_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.select_dial_layer = AddLayerMode( self._session_navigation, Layer(priority=5)) self._session_navigation.nav_layer = AddLayerMode( self._session_navigation, Layer(priority=5, )) self._session_navigation.set_enabled(False) self._session = SessionComponent(session_ring=self._session_ring, auto_name=True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.clip_launch_layer = LayerMode( self._session, Layer(priority=5, stop_all_clips_button=self._button[27])) self._session.stop_all_clips_layer = AddLayerMode( self._session, Layer(priority=6, stop_all_clips_button=self._button[27])) self._session.scene_launch_layer = AddLayerMode( self._session._selected_scene, Layer(priority=5, stop_all_clips_button=self._button[27])) self._session.set_enabled(False) self._session_zoom = SessionOverviewComponent( name='SessionZoom', session_ring=self._session_ring, enable_skinning=True) self._session_zoom.layer = Layer(priority=5, ) self._session_zoom.set_enabled(False) self._session_ring2 = SessionRingComponent(num_tracks=4, num_scenes=1, set_session_highlight=nop) self._session_ring2.set_enabled(False) self._session2 = SpecialSessionComponent( session_ring=self._session_ring2, auto_name=True) self._session2._selected_scene.layer = Layer( priority=5, launch_button=self._button[30]) self._session2.layer = Layer( priority=5, stop_all_clips_button=self._button[27], fire_next_scene_button=self._button[31] ) #, fire_scene_button = self._button[28]) self._scene_scroller = ScrollComponent( scrollable=SelectedSceneScroller(song=self.song)) self._scene_scroller.layer = Layer(priority=5, scroll_up_button=self._button[29], scroll_down_button=self._button[28]) self._scene_scroller.set_enabled(False) def _setup_mixer_control(self): super(Cntrlr, self)._setup_mixer_control() self._mixer.main_faders_layer = AddLayerMode(self._mixer, Layer(priority=5, )) self._mixer.main_buttons_layer = AddLayerMode(self._mixer, Layer(priority=5, )) self._mixer.solo_buttons_layer = AddLayerMode(self._mixer, Layer(priority=5, )) self._mixer.shifted_buttons_layer = AddLayerMode( self._mixer, Layer(priority=5, )) self._mixer.main_knobs_layer = AddLayerMode(self._mixer, Layer(priority=5, )) self._mixer.master_fader_layer = AddLayerMode( self._mixer.master_strip(), Layer(priority=5, )) self._mixer.instrument_buttons_layer = AddLayerMode( self._mixer, Layer(priority=5, )) self._mixer.stop_layer = AddLayerMode(self._mixer, Layer(priority=5, )) self._mixer.set_enabled(False) def _setup_transport_control(self): super(Cntrlr, self)._setup_transport_control() self._transport.layer = Layer(priority=5, ) def _setup_session_recording_component(self): super(Cntrlr, self)._setup_session_recording_component() self._recorder.main_layer = AddLayerMode(self._recorder, Layer(priority=5, )) self._recorder.shift_layer = AddLayerMode(self._recorder, Layer(priority=5, )) self._recorder.set_enabled(False) def _setup_device_control(self): super(Cntrlr, self)._setup_device_control() self._device.dial_layer = AddLayerMode(self._device, Layer(priority=5, )) self._device.button_layer = AddLayerMode(self._device, Layer(priority=5, )) self._device_navigator.select_dial_layer = AddLayerMode( self._device_navigator, Layer(priority=5, )) self._device_navigator.main_layer = AddLayerMode( self._device_navigator, Layer(priority=5, )) def _setup_device_selector(self): super(Cntrlr, self)._setup_device_selector() self._device_selector.select_layer = AddLayerMode( self._device_selector, Layer(priority=6, )) self._device_selector.assign_layer = AddLayerMode( self._device_selector, Layer(priority=7, )) def _setup_viewcontrol(self): super(Cntrlr, self)._setup_viewcontrol() self._view_control.main_layer = AddLayerMode(self._view_control, Layer(priority=6, )) def _update_modswitcher(self): debug('update modswitcher', self.modhandler.active_mod()) self._modswitcher.selected_mode = 'instrument' def _setup_translations(self): super(Cntrlr, self)._setup_translations() self._setup_translations2() def _setup_translations2(self): self._translated_controls2 = self._knobs + self._button[ 16:28] + self._fader + self._encoder + self._encoder_button self._translations2 = TranslationComponent(self._translated_controls2, user_channel_offset=15, channel=15) self._translations2.name = 'TranslationComponent' self._translations2.layer = Layer(priority=10, ) self._translations2.set_enabled(True) def _setup_instrument(self): super(Cntrlr, self)._setup_instrument() self._instrument._main_modes._mode_map['audioloop'] = _ModeEntry( mode=tomode(self._audioloop_pass), cycle_mode_button_color=None, behaviour=self._instrument._main_modes.default_behaviour, groups=set()) self._instrument.shift_button_layer = AddLayerMode( self._instrument, Layer(priority=5, )) self._instrument._drumpad._step_sequencer._loop_selector._follow_task.restart( ) #self._instrument._drumpad._step_sequencer._playhead_component._feedback_channels = range(16) def _setup_instrument(self): self._grid_resolution = self.register_disconnectable(GridResolution()) #self._c_instance.playhead.enabled = True self._playhead_element = PlayheadElement(self._c_instance.playhead) self._drum_group_finder = PercussionInstrumentFinder( device_parent=self.song.view.selected_track) self._instrument = CntrlrMonoInstrumentComponent( name='InstrumentComponent', is_enabled=True, script=self, skin=self._skin, grid_resolution=self._grid_resolution, drum_group_finder=self._drum_group_finder, parent_task_group=self._task_group, settings=DEFAULT_INSTRUMENT_SETTINGS, device_provider=self._device_provider) self._instrument.shift_button_layer = AddLayerMode( self._instrument, Layer(priority=5, )) self._instrument.audioloop_layer = AddLayerMode( self._instrument, Layer( priority=5, loop_selector_matrix=self._key_matrix.submatrix[:, 0], )) self._instrument.keypad_shift_layer = AddLayerMode( self._instrument, Layer(priority=5, scale_up_button=self._button[13], scale_down_button=self._button[12], offset_up_button=self._button[11], offset_down_button=self._button[10], vertical_offset_up_button=self._button[9], vertical_offset_down_button=self._button[8], split_button=self._button[14], sequencer_button=self._button[15])) self._instrument.drumpad_shift_layer = AddLayerMode( self._instrument, Layer(priority=5, scale_up_button=self._button[13], scale_down_button=self._button[12], drum_offset_up_button=self._button[11], drum_offset_down_button=self._button[10], drumpad_mute_button=self._button[9], drumpad_solo_button=self._button[8], split_button=self._button[14], sequencer_button=self._button[15])) self._instrument._keypad.sequencer_layer = LayerMode( self._instrument._keypad, Layer( priority=5, playhead=self._playhead_element, keypad_matrix=self._matrix.submatrix[:, :], sequencer_matrix=self._key_matrix.submatrix[:, 0], )) self._instrument._keypad.split_layer = LayerMode( self._instrument._keypad, Layer(priority=5, keypad_matrix=self._matrix.submatrix[:, :], split_matrix=self._key_matrix.submatrix[:14, 0])) self._instrument._keypad.sequencer_shift_layer = LayerMode( self._instrument._keypad, Layer( priority=5, keypad_select_matrix=self._matrix.submatrix[:, :], loop_selector_matrix=self._key_matrix.submatrix[:8, 0], quantization_buttons=self._key_matrix.submatrix[:8, 1], )) #follow_button = self._button[23])) self._instrument._keypad.sequencer_session_layer = LayerMode( self._instrument._keypad, Layer(priority=5, playhead=self._playhead_element, sequencer_matrix=self._key_matrix.submatrix[:, :1])) self._instrument._keypad.split_session_layer = LayerMode( self._instrument._keypad, Layer(priority=5, split_matrix=self._key_matrix.submatrix[:16, :1])) self._instrument._keypad.sequencer_session_shift_layer = LayerMode( self._instrument._keypad, Layer( priority=5, loop_selector_matrix=self._key_matrix.submatrix[:8, :1], quantization_buttons=self._key_matrix.submatrix[:7, 1:], )) #follow_button = self._button[23])) self._instrument._drumpad.sequencer_layer = LayerMode( self._instrument._drumpad, Layer( priority=5, playhead=self._playhead_element, drumpad_matrix=self._matrix.submatrix[:, :], sequencer_matrix=self._key_matrix.submatrix[:, 0], )) self._instrument._drumpad.split_layer = LayerMode( self._instrument._drumpad, Layer(priority=5, drumpad_matrix=self._matrix.submatrix[:, :], split_matrix=self._key_matrix.submatrix[:16, :1])) self._instrument._drumpad.sequencer_shift_layer = LayerMode( self._instrument._drumpad, Layer( priority=5, drumpad_select_matrix=self._matrix.submatrix[:, :], loop_selector_matrix=self._key_matrix.submatrix[:8, :1], quantization_buttons=self._key_matrix.submatrix[:7, 1:], )) #follow_button = self._button[23])) self._instrument._drumpad.sequencer_session_layer = LayerMode( self._instrument._drumpad, Layer(priority=5, sequencer_matrix=self._key_matrix.submatrix[:, :1])) self._instrument._drumpad.split_session_layer = LayerMode( self._instrument._drumpad, Layer(priority=5, split_matrix=self._key_matrix.submatrix[:16, :1])) self._instrument._drumpad.sequencer_session_shift_layer = LayerMode( self._instrument._drumpad, Layer( priority=5, loop_selector_matrix=self._key_matrix.submatrix[:8, :1], quantization_buttons=self._key_matrix.submatrix[:8, 1:], )) #follow_button = self._button[23])) #self._instrument.set_session_mode_button(self._button[30]) def _setup_modes(self): common = CompoundMode(self._mixer, self._session_ring) main_buttons = CompoundMode(self._mixer.main_buttons_layer, self._transport, self._recorder, self._recorder.main_layer, self._device, self._device.button_layer) shifted_main_buttons = CompoundMode( self._mixer.solo_buttons_layer, self._recorder, self._recorder.shift_layer, self._session, self._session.scene_launch_layer, self._device, self._device.button_layer) main_faders = CompoundMode(self._mixer.main_faders_layer, self._mixer.master_fader_layer) main_dials = CompoundMode(self._view_control, self._view_control.main_layer, self._device, self._device.dial_layer, self._device_navigator.select_dial_layer, self.encoder_navigation_on) shifted_dials = CompoundMode(self._session_navigation, self._session_navigation.nav_dial_layer, self._device, self._device.dial_layer, self._device_navigator.select_dial_layer, self.encoder_navigation_on) self._modalt_mode = ModesComponent(name='ModAltMode') self._modalt_mode.add_mode('disabled', None) self._modalt_mode.add_mode( 'enabled', [tuple([self._enable_mod_alt, self._disable_mod_alt])], behaviour=CancellableBehaviourWithRelease(), cycle_mode_button_color='Mod.AltOn') self._modalt_mode.selected_mode = 'disabled' self._modalt_mode.set_enabled(False) self._modalt_mode.layer = Layer(priority=5, enabled_button=self._encoder_button[1]) self._modswitcher = ModesComponent(name='ModSwitcher') self._modswitcher.add_mode('mod', [ self.modhandler, self._modalt_mode, main_faders, self._mixer.main_knobs_layer, self._device, self._device.dial_layer, self._device_navigator.main_layer, main_dials, DelayMode(self.modhandler.update, delay=.5, parent_task_group=self._task_group) ]) self._modswitcher.add_mode('instrument', [ self._instrument, self._instrument.shift_button_layer, main_buttons, main_faders, self._mixer.main_knobs_layer, self._device, self._device.dial_layer, self._device.button_layer, self._device_navigator.main_layer, ]) #self._instrument.shift_button_layer, self._optional_translations]) self._modswitcher.selected_mode = 'instrument' self._modswitcher.set_enabled(False) self._instrument._main_modes = ModesComponent(parent=self._instrument, name='InstrumentModes') self._instrument._main_modes.add_mode('disabled', []) self._instrument._main_modes.add_mode('drumpad', [ self._instrument._drumpad.sequencer_layer, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('drumpad_split', [ self._instrument._drumpad.split_layer, self._instrument._selected_session, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('drumpad_sequencer', [ self._instrument._drumpad.sequencer_layer, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('drumpad_shifted', []) self._instrument._main_modes.add_mode('drumpad_split_shifted', []) self._instrument._main_modes.add_mode('drumpad_sequencer_shifted', []) self._instrument._main_modes.add_mode('keypad', [ self._instrument._keypad.sequencer_layer, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('keypad_split', [ self._instrument._keypad.split_layer, self._instrument._selected_session, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('keypad_sequencer', [ self._instrument._keypad.sequencer_layer, main_buttons, main_dials ]) self._instrument._main_modes.add_mode('keypad_shifted', []) self._instrument._main_modes.add_mode('keypad_split_shifted', []) self._instrument._main_modes.add_mode('keypad_sequencer_shifted', []) self._instrument._main_modes.add_mode('drumpad_session', []) self._instrument._main_modes.add_mode('drumpad_split_session', []) self._instrument._main_modes.add_mode('drumpad_sequencer_session', []) self._instrument._main_modes.add_mode('drumpad_shifted_session', []) self._instrument._main_modes.add_mode('drumpad_split_shifted_session', []) self._instrument._main_modes.add_mode( 'drumpad_sequencer_shifted_session', []) self._instrument._main_modes.add_mode('keypad_session', []) self._instrument._main_modes.add_mode('keypad_split_session', []) self._instrument._main_modes.add_mode('keypad_sequencer_session', []) self._instrument._main_modes.add_mode('keypad_shifted_session', []) self._instrument._main_modes.add_mode('keypad_split_shifted_session', []) self._instrument._main_modes.add_mode( 'keypad_sequencer_shifted_session', []) self._instrument._main_modes.add_mode('audioloop', [ self._instrument.audioloop_layer, ]) self._instrument._main_modes.add_mode('audioloop_shifted', [ self._instrument.audioloop_layer, ]) self._instrument._main_modes.selected_mode = 'disabled' self._instrument.set_enabled(True) self._main_modes = ModesComponent(name='MainModes') self._main_modes.add_mode('disabled', [self._background]) self._main_modes.add_mode('MixMode', [ common, self._instrument, self._instrument.shift_button_layer, self._mixer, main_faders, self._mixer.main_knobs_layer, self._device, self._device_navigator, self._device_navigator.main_layer, ]) self._main_modes.add_mode( 'ModSwitcher', [ common, main_faders, main_dials, self._mixer.main_knobs_layer, self._session_navigation.select_dial_layer, self._view_control, self._view_control.main_layer, self._device_navigator.select_dial_layer, self.encoder_navigation_on, self._modswitcher, DelayMode(self._update_modswitcher, delay=.1) ], behaviour=ColoredCancellableBehaviourWithRelease( color='ModeButtons.ModSwitcher', off_color='ModeButtons.ModSwitcherDisabled')) self._main_modes.add_mode( 'Translations', [ common, main_faders, main_dials, self._mixer.main_knobs_layer, DelayMode(self._translations, delay=.1), DelayMode(self._translations.selector_layer, delay=.3) ], behaviour=DefaultedBehaviour( default_mode='MixMode', color='ModeButtons.Translations', off_color='ModeButtons.TranslationsDisabled')) self._main_modes.add_mode( 'DeviceSelector', [ common, self._device_selector, DelayMode(self._device_selector.select_layer, delay=.1), DelayMode(self.modhandler.lock_layer, delay=.1), DelayMode(self._device_selector.assign_layer, delay=.5), main_buttons, main_dials, main_faders, self._mixer.main_knobs_layer, self._device, self._device_navigator ], behaviour=ColoredCancellableBehaviourWithRelease( color='ModeButtons.DeviceSelector', off_color='ModeButtons.DeviceSelectorDisabled')) self._main_modes.add_mode('FrederikMode', [ self._instrument, self._scene_scroller, self._session2, self._translations2 ]) self._main_modes.layer = Layer(priority=5) self._main_modes.selected_mode = 'FrederikMode' self._main_modes.set_enabled(True) #self._test.subject = self._instrument._main_modes @listens(u'detail_clip') def _on_detail_clip_changed(self): self._instrument._drumpad._step_sequencer._loop_selector._follow_task.restart( ) #playhead = self._instrument._drumpad._step_sequencer._playhead_component #debug('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV') #debug('playhead playhead:', playhead._playhead) #debug('playhead clip:', playhead._clip.name if playhead._clip and hasattr(playhead._clip, 'name') else None) #debug('playhead notes:', playhead._notes) #debug('playhead feedback_channels:', playhead._feedback_channels) #debug('enabled:', playhead._playhead.enabled if playhead._playhead and hasattr(playhead._playhead, 'enabled') else 'False') #debug('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^') #self.schedule_message(2, self.update_playhead) @listens('selected_mode') def _test(self, *a): comps = [ self._main_modes, self._modswitcher, self._instrument, self._instrument._main_modes, self._instrument._matrix_modes, self._instrument._selected_session, self._session, self._device, self._mixer, self._session_navigation, self._session_zoom, self._recorder, self._transport ] debug('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV') """ debug('main mode:', self._main_modes.selected_mode) debug('instrument mode:', self._instrument._main_modes.selected_mode) debug('modswitcher mode:', self._modswitcher.selected_mode) debug('instrument matrix mode:', self._instrument._matrix_modes.selected_mode) for comp in comps: debug(comp.name, 'is enabled:', comp.is_enabled()) """ playhead = self._instrument._drumpad._step_sequencer._note_editor._playhead_component debug('playhead playhead:', playhead._playhead) debug('playhead clip:', playhead._clip) debug('playhead notes:', playhead._notes) debug('playhead playhead:', playhead._playhead) debug('playhead feedback_channels:', playhead._feedback_channels) debug('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
class GuitarWing(LividControlSurface): _sysex_id = 20 _model_name = 'GuitarWing' def __init__(self, *a, **k): super(GuitarWing, self).__init__(*a, **k) self._skin = Skin(GuitarWingColors) with self.component_guard(): self._setup_controls() self._setup_m4l_interface() self._setup_session_control() self._setup_mixer_control() self._setup_device_control() self._setup_transport_control() self._setup_view_control() def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(10)] self._fader = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = SLIDERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._fader_button = [MonoEncoderElement(msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = SLIDERS[index], name = 'Fader_Button_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._ccs = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CCS[index], name = 'CCs_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(4)] self._pad = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = PADS[index], name = 'Pad_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(5)] self._padCC = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = PADS[index], name = 'PadCC_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(5)] self._accel = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = ACCELS[index], name = 'Accel_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(3)] self._parameter_control_matrix = ButtonMatrixElement(rows = [ [ self._fader[0], self._fader[1], self._fader[2], self._accel[2], self._ccs[0], self._ccs[1], self._ccs[2], self._ccs[3] ]]) self._scene_launch_matrix = ButtonMatrixElement(rows = [self._pad[:4]]) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 1, num_scenes = 4, tracks_to_use = lambda : self.song.visible_tracks + self.song.return_tracks) self._session_ring.set_enabled(False) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(scene_launch_buttons = self._scene_launch_matrix) self._session_navigation =SessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation.layer = Layer(left_button = self._button[1], right_button = self._button[0]) self._session_navigation.set_enabled(True) def _setup_mixer_control(self): self._mixer = MonoMixerComponent(name = 'Mixer', tracks_provider = self._session_ring, track_assigner = simple_track_assigner, invert_mute_feedback = True, auto_name = True, enable_skinning = True) self.song.view.selected_track = self._mixer.channel_strip(0)._track def _setup_transport_control(self): self._transport = TransportComponent() self._transport.layer = Layer(play_button = self._button[6], loop_button = self._button[7], seek_backward_button = self._button[8], record_button = self._button[9]) self._transport.set_enabled(True) def _setup_device_control(self): self._device = DeviceComponent(name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._device.layer = Layer(parameter_controls = self._parameter_control_matrix) self._device.set_enabled(True) def _setup_m4l_interface(self): self._m4l_interface = M4LInterfaceComponent(controls=self.controls, component_guard=self.component_guard) self.get_control_names = self._m4l_interface.get_control_names self.get_control = self._m4l_interface.get_control self.grab_control = self._m4l_interface.grab_control self.release_control = self._m4l_interface.release_control def _setup_view_control(self): self._view_control = ViewControlComponent() self._view_control.layer = Layer(prev_track_button = self._button[1], next_track_button = self._button[0]) # a
class Cntrlr(LividControlSurface): __module__ = __name__ __doc__ = " Monomodular controller script for Livid CNTRLR " _sysex_id = 8 _model_name = 'Cntrlr' _host_name = 'Cntrlr' _version_check = 'b996' monomodular = None device_provider_class = ModDeviceProvider def __init__(self, *a, **k): super(Cntrlr, self).__init__(*a, **k) self._skin = Skin(CntrlrColors) self._device_selection_follows_track_selection = FOLLOW with self.component_guard(): self._setup_monobridge() self._setup_controls() self._define_sysex() self._setup_background() self._setup_translations() #self._setup_autoarm() self._setup_session_control() self._setup_send_reset_controls() self._setup_mixer_control() self._setup_transport_control() self._setup_device_control() self._setup_mod_device_control() self._setup_device_selector() #self._setup_session_recording_component() #self._setup_viewcontrol() #self._setup_instrument() self._setup_mod() self._setup_modswitcher() self._setup_translations() self._setup_modes() self._setup_m4l_interface() self._on_device_changed.subject = self.song #self.set_feedback_channels(range(14, 15)) def _initialize_script(self): super(Cntrlr, self)._initialize_script() self._connected = True self._main_modes.selected_mode = 'MixMode' self._main_modes.set_enabled(True) #self._instrument.set_enabled(True) #self._main_modes.selected_mode = 'disabled' #self._main_modes.selected_mode = 'MixMode' self._session_ring._update_highlight() self._session_ring.track_offset = 0 if liveobj_valid(self.song.visible_tracks[0]): self.song.view.selected_track = self.song.visible_tracks[0] def _initialize_hardware(self): super(Cntrlr, self)._initialize_hardware() for index in range(4): self._encoder[index].send_value(0) def port_settings_changed(self): self._main_modes.selected_mode = 'disabled' super(Cntrlr, self).port_settings_changed() def _setup_monobridge(self): self._monobridge = MonoBridgeElement(self) self._monobridge.name = 'MonoBridge' def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._fader = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_FADERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(8)] self._dial_left = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_LEFT[index], name = 'Dial_Left_' + str(index), num = CNTRLR_KNOBS_LEFT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._dial_right = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_KNOBS_RIGHT[index], name = 'Dial_Right_' + str(index), num = CNTRLR_KNOBS_RIGHT[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder = [CodecEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = CNTRLR_DIALS[index], name = 'Encoder_' + str(index), num = CNTRLR_DIALS[index], script = self, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._encoder_button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_DIAL_BUTTONS[index], name = 'Encoder_Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(12)] self._grid = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_GRID[index], name = 'Grid_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(16)] self._button = [MonoButtonElement(is_momentary = is_momentary,msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = CNTRLR_BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, color_map = COLOR_MAP, optimized_send_midi = optimized, resource_type = resource, monobridge = self._monobridge) for index in range(32)] self._knobs = self._dial_left + self._dial_right self._fader_matrix = ButtonMatrixElement(name = 'Fader_Matrix', rows = [self._fader]) self._matrix = ButtonMatrixElement(name = 'Matrix', rows = [self._grid[index*4:(index*4)+4] for index in range(4)]) self._knob_left_matrix = ButtonMatrixElement(name = 'Knob_Left_Matrix', rows = [self._dial_left[index*4:(index*4)+4] for index in range(3)]) self._knob_right_matrix = ButtonMatrixElement(name = 'Knob_Right_Matrix', rows = [self._dial_right[index*4:(index*4)+4] for index in range(3)]) self._dial_matrix = ButtonMatrixElement(name = 'Dial_Matrix', rows = [self._encoder[index*4:(index*4)+4] for index in range(3)]) self._dial_button_matrix = ButtonMatrixElement(name = 'Dial_Button_Matrix', rows = [self._encoder_button[index*4:(index*4)+4] for index in range(1,3)]) self._key_matrix = ButtonMatrixElement(name = 'Key_Matrix', rows = [self._button[0:16], self._button[16:32]]) self._translated_controls = self._grid + self._button def _setup_background(self): self._background = BackgroundComponent(name = 'Background') self._background.layer = Layer(priority = 3, matrix = self._matrix.submatrix[:,:], faders = self._fader_matrix.submatrix[:,:], left_knobs = self._knob_left_matrix.submatrix[:,:], right_knobs = self._knob_right_matrix.submatrix[:,:], dials = self._dial_matrix, dial_buttons = self._dial_button_matrix.submatrix[:,:], keys = self._key_matrix.submatrix[:,:]) self._background.set_enabled(True) def _define_sysex(self): self.encoder_navigation_on = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_encoder_encosion_mode', message = [0, 0, 0, 0]) def _setup_transport_control(self): self._transport = CntrlrTransportComponent(name = 'Transport') self._transport._play_toggle.view_transform = lambda value: 'Transport.PlayOn' if value else 'Transport.PlayOff' self._transport._record_toggle.view_transform = lambda value: 'Transport.RecordOn' if value else 'Transport.RecordOff' self._transport.layer = Layer(priority = 4, play_button = self._button[28], stop_button = self._button[29], record_button = self._button[30]) self._transport.set_enabled(False) def _setup_autoarm(self): self._auto_arm = CntrlrAutoArmComponent(name='Auto_Arm') #self._auto_arm._update_notification = lambda a: None self._auto_arm.can_auto_arm_track = self._can_auto_arm_track def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = FixedLengthSessionRecordingComponent(clip_creator = self._clip_creator, view_controller = ViewControlComponent(), name = 'SessionRecorder') # is_enabled = False) self._recorder.main_layer = AddLayerMode(self._recorder, Layer(priority = 4, record_button = self._button[29])) self._recorder.shift_layer = AddLayerMode(self._recorder, Layer(priority = 4, automation_button = self._button[29])) self._recorder.set_enabled(False) def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 4, num_scenes = 4) self._session_ring.set_enabled(False) self._session_navigation = CntrlrSessionNavigationComponent(name = 'SessionNavigation', session_ring = self._session_ring) self._session_navigation._vertical_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_up_button.color = 'Session.NavigationButtonOn' self._session_navigation._horizontal_banking.scroll_down_button.color = 'Session.NavigationButtonOn' self._session_navigation._vertical_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._vertical_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_up_button.color = 'Session.PageNavigationButtonOn' self._session_navigation._horizontal_paginator.scroll_down_button.color = 'Session.PageNavigationButtonOn' self._session_navigation.layer = Layer(priority = 4, down_button = self._button[14], up_button = self._button[15], left_button = self._button[12], right_button = self._button[13]) self._session_navigation.set_enabled(False) self._session = SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(priority = 4, clip_launch_buttons = self._matrix.submatrix[:,:]) self._session.set_enabled(False) self._session_zoom = SessionOverviewComponent(name = 'SessionZoom', session_ring = self._session_ring, enable_skinning = True) self._session_zoom.layer = Layer(priority = 4, button_matrix = self._matrix.submatrix[:,:]) self._session_zoom.set_enabled(False) def _setup_send_reset_controls(self): self._send_reset = ResetSendsComponent(script = self) self._send_reset.layer = Layer(priority = 4, buttons = self._key_matrix.submatrix[8:12, :1]) self._send_reset.set_enabled(False) def _setup_mixer_control(self): self._mixer = MonoMixerComponent(name = 'Mixer', num_returns = 2,tracks_provider = self._session_ring, track_assigner = SimpleTrackAssigner(), invert_mute_feedback = True, auto_name = True, enable_skinning = True) self._mixer.fader_layer = AddLayerMode(self._mixer, Layer(priority = 4, volume_controls = self._fader_matrix.submatrix[:4, :], return_controls = self._fader_matrix.submatrix[4:6, :], prehear_volume_control = self._fader[6], send_controls = self._knob_left_matrix, eq_gain_controls = self._knob_right_matrix)) self._mixer.button_layer = AddLayerMode(self._mixer, Layer(priority = 4, mute_buttons = self._key_matrix.submatrix[:4, 1:], stop_clip_buttons = self._key_matrix.submatrix[8:12, 1:], solo_buttons = self._key_matrix.submatrix[:4, :1], arm_buttons = self._key_matrix.submatrix[4:8, :1], track_select_buttons = self._key_matrix.submatrix[4:8, 1:],)) self._mixer.master_strip().layer = Layer(priority = 4, volume_control = self._fader[7],) self._mixer.set_enabled(False) def _setup_device_control(self): self._device_selection_follows_track_selection = FOLLOW self._device = CntrlrDeviceComponent(script = self, name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._device.layer = Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, 1:], on_off_button = self._encoder_button[4], bank_prev_button = self._encoder_button[8], bank_next_button = self._encoder_button[9],) #lock_button = self._encoder_button[7]) self._device.set_enabled(False) self._device_navigator = DeviceNavigator(self._device_provider, self._mixer, self) self._device_navigator.name = 'Device_Navigator' self._device_navigator.layer = Layer(priority = 4, prev_button = self._encoder_button[10], next_button = self._encoder_button[11],) self._device_navigator.set_enabled(False) def _setup_mod_device_control(self): self._mod_device = SpecialCntrlrDeviceComponent(script = self, name = 'Device_Component', device_provider = self._device_provider, device_bank_registry = DeviceBankRegistry()) self._mod_device.layer = Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[:, :],) self._mod_device.set_enabled(False) def _setup_device_selector(self): self._device_selector = CntrlrDeviceSelector(self) self._device_selector.name = 'Device_Selector' #self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6 , matrix = self._matrix.submatrix[:, :])) #self._device_selector.select_layer = AddLayerMode(self._device_selector, Layer(priority = 6, matrix = ButtonMatrixElement(rows = [self._grid[:4],self._grid[4:8],self._grid[8:12],self._grid[12:14]]))) #self._device_selector.assign_layer = AddLayerMode(self._device_selector, Layer(priority = 7, assign_button = self._grid[14])) self._device_selector.set_enabled(False) def _setup_translations(self): self._translations = TranslationComponent(self._translated_controls, user_channel_offset = 4, channel = 4) # is_enabled = False) self._translations.name = 'TranslationComponent' self._translations.layer = Layer(priority = 10,) self._translations._color = 127 self._translations.selector_layer = AddLayerMode(self._translations, Layer(priority = 10, channel_selector_buttons = self._dial_button_matrix)) self._translations.set_enabled(False) #self._optional_translations = CompoundMode(TranslationComponent(controls = self._fader, user_channel_offset = 4, channel = 4, name = 'FaderTranslation', is_enabled = False, layer = Layer(priority = 10)) if FADER_BANKING else None #TranslationComponent(controls = self._knobs, user_channel_offset = 4, channel = 4, name = 'DialTranslation', is_enabled = False, layer = Layer(priority = 10)) if DIAL_BANKING else None) def _setup_mod(self): self.monomodular = get_monomodular(self) self.monomodular.name = 'monomodular_switcher' self.modhandler = CntrlrModHandler(self, device_provider = self._device_provider) # is_enabled = False) self.modhandler.name = 'ModHandler' self.modhandler.lock_layer = AddLayerMode(self.modhandler, Layer(priority=8, lock_button=self._grid[15])) self.modhandler.layer = Layer(priority = 8, cntrlr_encoder_button_grid = self._dial_button_matrix.submatrix[:,:], cntrlr_grid = self._matrix.submatrix[:,:], cntrlr_keys = self._key_matrix.submatrix[:,:],) #parameter_controls = self._dial_matrix.submatrix[:,:]) self.modhandler.set_enabled(False) def _setup_modswitcher(self): self._modswitcher = ModesComponent(name = 'ModSwitcher') # is_enabled = False) self._modswitcher.set_enabled(False) def _setup_viewcontrol(self): self._view_control = CntrlrViewControlComponent(name='View_Control') self._view_control.main_layer = AddLayerMode(self._view_control, Layer(scene_select_dial = self._encoder[2], track_select_dial = self._encoder[3],)) #self._view_control.main_layer = AddLayerMode(self._view_control, Layer(prev_track_button=self._button[24], # next_track_button= self._button[25], # next_scene_button=self._button[27], # prev_scene_button = self._button[26])) self._view_control.set_enabled(False) def _setup_modes(self): self._modswitcher = ModesComponent(name = 'ModSwitcher') self._modswitcher.add_mode('mod', [self._mixer, self._mixer.fader_layer, self.modhandler, self._mod_device, self._device_selector,]) self._modswitcher.add_mode('translations', [self._translations, self._device, self._mixer, self._mixer.fader_layer, self._device_navigator, self._device_selector]) self._modswitcher.selected_mode = 'translations' self._modswitcher.set_enabled(False) self._session_modes = ModesComponent(name = 'SessionModes') self._session_modes.add_mode('Launch', [self._session]) self._session_modes.add_mode('Zoom', [self._session_zoom]) self._session_modes.layer = Layer(priority = 4, cycle_mode_button = self._button[31]) self._session_modes.set_enabled(False) self._main_modes = ModesComponent(name = 'MainModes') self._main_modes.add_mode('disabled', [self._background, self.encoder_navigation_on]) self._main_modes.add_mode('MixMode', [self._mixer, self._mixer.fader_layer, self._mixer.button_layer, self._session_modes, self._session_navigation, self._session_ring, self._device, self._device_navigator, self._send_reset, self._transport]) self._main_modes.add_mode('ModMode1', [self._modswitcher, self._choose_mod, DelayMode(self._update_modswitcher, delay = .1, parent_task_group = self._task_group), DelayMode(self.modhandler.update, delay = .2, parent_task_group = self._task_group)], behaviour = DefaultedBehaviour(default_mode = 'MixMode')) self._main_modes.add_mode('ModMode2', [self._modswitcher, self._choose_mod, DelayMode(self._update_modswitcher, delay = .1, parent_task_group = self._task_group), DelayMode(self.modhandler.update, delay = .2, parent_task_group = self._task_group)], behaviour = DefaultedBehaviour(default_mode = 'MixMode')) self._main_modes.add_mode('ModMode3', [self._modswitcher, self._choose_mod, DelayMode(self._update_modswitcher, delay = .1, parent_task_group = self._task_group), DelayMode(self.modhandler.update, delay = .2, parent_task_group = self._task_group)], behaviour = DefaultedBehaviour(default_mode = 'MixMode')) self._main_modes.add_mode('ModMode4', [self._modswitcher, self._choose_mod, DelayMode(self._update_modswitcher, delay = .1, parent_task_group = self._task_group), DelayMode(self.modhandler.update, delay = .2, parent_task_group = self._task_group)], behaviour = DefaultedBehaviour(default_mode = 'MixMode')) self._main_modes.layer = Layer(priority = 4, ModMode1_button = self._encoder_button[0], ModMode2_button = self._encoder_button[1], ModMode3_button = self._encoder_button[2], ModMode4_button = self._encoder_button[3]) #, self._main_modes.selected_mode = 'disabled' self._main_modes.set_enabled(True) def _choose_mod(self): modes = ('ModMode1', 'ModMode2', 'ModMode3', 'ModMode4') mode = self._main_modes.selected_mode debug('choose_mod:', self._main_modes.selected_mode) if mode in modes: index = modes.index(mode) self._translations._channel = index + self._translations._user_channel_offset self._translations.update() self._device_selector.select_device(index) def _setup_m4l_interface(self): self._m4l_interface = M4LInterfaceComponent(controls=self.controls, component_guard=self.component_guard, priority = 10) self._m4l_interface.name = "M4LInterface" self.get_control_names = self._m4l_interface.get_control_names self.get_control = self._m4l_interface.get_control self.grab_control = self._m4l_interface.grab_control self.release_control = self._m4l_interface.release_control def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith('Cntrlr Input') @listens('appointed_device') def _on_device_changed(self): debug('appointed device changed, script') #self._main_modes.selected_mode is 'ModSwitcher' and self._update_modswitcher() def _on_selected_track_changed(self): super(Cntrlr, self)._on_selected_track_changed() #self._drum_group_finder.device_parent = self.song.veiw.selected_track #if not len(self.song.view.selected_track.devices): # self._main_modes.selected_mode is 'ModSwitcher' and self._update_modswitcher() def _update_modswitcher(self): debug('update modswitcher', self.modhandler.active_mod()) if self.modhandler.active_mod() and self._device_selector.has_mod_entry(['ModMode1', 'ModMode2', 'ModMode3', 'ModMode4'].index(self._main_modes.selected_mode)): self._modswitcher.selected_mode = 'mod' else: self._modswitcher.selected_mode = 'translations' def update_display(self): super(Cntrlr, self).update_display() self.modhandler.send_ring_leds() def restart_monomodular(self): #debug('restart monomodular') self.modhandler.disconnect() with self.component_guard(): self._setup_mod()