def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name='Session_Recording', is_enabled=False, layer=Layer( automation_button=self._automation_button, re_enable_automation_button=self._re_enable_automation_button)) self._session_recording.set_enabled(True)
class KeyLabMkII(KeyLabEssential): mixer_component_type = MixerComponent session_component_type = SessionComponent view_control_component_type = ViewControlComponent hardware_settings_component_type = HardwareSettingsComponent channel_strip_component_type = ChannelStripComponent def __init__(self, *a, **k): super(KeyLabMkII, self).__init__(*a, **k) with self.component_guard(): self._create_session_recording() def _create_controls(self): super(KeyLabMkII, self)._create_controls() def make_button_row(index_offset, name): return ButtonMatrixElement(rows=[ [ create_button(index + index_offset, name=('{}_{}').format(name, index)) for index in xrange(8) ]], name=('{}s').format(name)) self._select_buttons = make_button_row(24, 'Select_Button') self._solo_buttons = make_button_row(8, 'Solo_Button') self._mute_buttons = make_button_row(16, 'Mute_Button') self._record_arm_buttons = make_button_row(0, 'Record_Arm_Buttons') self._automation_button = create_button(56, name='Automation_Button') self._re_enable_automation_button = create_button(57, name='Re_Enable_Automation_Button') self._view_button = create_button(74, name='View_Button') self._pads = ButtonMatrixElement(rows=[ [ create_button(identifier, channel=9, name=('Pad_{}_{}').format(col_index, row_index)) for col_index, identifier in enumerate(row) ] for row_index, row in enumerate(PAD_IDS) ]) self._pad_leds = ButtonMatrixElement(rows=[ [ create_pad_led(identifier, ('Pad_LED_{}_{}').format(col_index, row_index)) for col_index, identifier in enumerate(row) ] for row_index, row in enumerate(PAD_LED_IDS) ], name='Pad_LED_Matrix') self._display = PhysicalDisplayElement(DISPLAY_LINE_WIDTH, name='Display') self._display.set_message_parts(sysex.LCD_SET_STRING_MESSAGE_HEADER + (sysex.LCD_LINE_1_ITEM_ID,), ( sysex.NULL, sysex.LCD_LINE_2_ITEM_ID) + (ord(' '),) * DISPLAY_LINE_WIDTH + (sysex.NULL, sysex.END_BYTE)) self._mixer_mode_cycle_button = create_button(51, name='Mixer_Mode_Cycle_Button') self._vegas_mode_switch = SysexElement(send_message_generator=lambda b: sysex.VEGAS_MODE_MESSAGE_HEADER + ( b, sysex.END_BYTE), name='Vegas_Mode_Switch') def _create_mixer(self): super(KeyLabMkII, self)._create_mixer() self._mixer.layer += Layer(track_select_buttons=self._select_buttons, solo_buttons=self._solo_buttons, mute_buttons=self._mute_buttons, arm_buttons=self._record_arm_buttons, selected_track_name_display=self._display) self._mixer_modes = ModesComponent(name='Mixer_Modes') self._mixer_modes.add_mode('volume_mode', AddLayerMode(self._mixer, Layer(volume_controls=self._faders))) self._mixer_modes.add_mode('sends_a_mode', AddLayerMode(self._mixer, Layer(send_controls=self._faders))) self._mixer_modes.layer = Layer(cycle_mode_button=self._mixer_mode_cycle_button) self._mixer_modes.selected_mode = 'volume_mode' def _create_session_recording(self): self._session_recording = SessionRecordingComponent(name='Session_Recording', is_enabled=False, layer=Layer(automation_button=self._automation_button, re_enable_automation_button=self._re_enable_automation_button)) self._session_recording.set_enabled(True) def _create_view_control(self): super(KeyLabMkII, self)._create_view_control() self._view_control.layer += Layer(document_view_toggle_button=self._view_button) def _create_hardware_settings(self): super(KeyLabMkII, self)._create_hardware_settings() self._hardware_settings.layer += Layer(vegas_mode_switch=self._vegas_mode_switch)
def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = SessionRecordingComponent(ViewControlComponent()) self._recorder.set_enabled(True) self._recorder.layer = Layer( priority=4, automation_button=self._grid[1][2], record_button=self._grid[2][1], )
def _create_record_modes(self): self._session_record = SessionRecordingComponent(name='Session_Record', is_enabled=False, layer=Layer(record_button='record_button')) self._record_modes = ModesComponent(name='Record_Modes') self._record_modes.add_mode('session', EnablingMode(self._session_record)) self._record_modes.add_mode('arrange', AddLayerMode((self._transport), layer=Layer(record_button='record_button'))) self._Oxygen_Pro__on_main_view_changed()
def _create_record_modes(self): self._session_record = SessionRecordingComponent( name=u'Session_Record', is_enabled=False, layer=Layer(record_button=u'record_button')) self._record_modes = ModesComponent(name=u'Record_Modes') self._record_modes.add_mode(u'session', self._session_record) self._record_modes.add_mode( u'arrange', AddLayerMode(self._transport, layer=Layer(record_button=u'record_button'))) self.__on_main_view_changed()
def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = SessionRecordingComponent(ViewControlComponent()) self._recorder.set_enabled(True) self._recorder.layer = Layer(priority = 4, automation_button = self._grid[1][2], record_button = self._grid[2][1],)
class DS1(LividControlSurface): _sysex_id = 16 _model_name = 'DS1' def __init__(self, c_instance): super(DS1, self).__init__(c_instance) self._skin = Skin(DS1Colors) with self.component_guard(): self._define_sysex() self._setup_controls() self._setup_background() self._setup_m4l_interface() self._setup_session_control() self._setup_mixer_control() self._setup_transport_control() self._setup_device_control() self._setup_session_recording_component() self._setup_main_modes() def _initialize_script(self): super(DS1, self)._initialize_script() self._main_modes.set_enabled(True) self._main_modes.selected_mode = 'Main' def _initialize_hardware(self): super(DS1, self)._initialize_hardware() self.local_control_off.enter_mode() self.encoder_absolute_mode.enter_mode() self.encoder_speed_sysex.enter_mode() def _define_sysex(self): self.encoder_speed_sysex = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_encoder_mapping', message = ENCODER_SPEED) self.encoder_absolute_mode = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_encoder_encosion_mode', message = [2]) self.local_control_off = SendLividSysexMode(livid_settings = self._livid_settings, call = 'set_local_control', message = [0]) def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._fader = [MonoEncoderElement(mapping_feedback_delay = -1, msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = DS1_FADERS[index], name = 'Fader_' + str(index), num = index, script = self, optimized_send_midi = optimized, resource_type = resource) for index in range(8)] self._dial = [[MonoEncoderElement(mapping_feedback_delay = -1, msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = DS1_DIALS[x][y], name = 'Dial_' + str(x) + '_' + str(y), num = x + (y*5), script = self, optimized_send_midi = optimized, resource_type = resource) for x in range(8)] for y in range(5)] self._side_dial = [MonoEncoderElement(mapping_feedback_delay = -1, msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = DS1_SIDE_DIALS[x], name = 'Side_Dial_' + str(x), num = x, script = self, optimized_send_midi = optimized, resource_type = resource) for x in range(4)] self._encoder = [MonoEncoderElement(mapping_feedback_delay = -1, msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = DS1_ENCODERS[x], name = 'Encoder_' + str(x), num = x, script = self, optimized_send_midi = optimized, resource_type = resource) for x in range(4)] self._encoder_button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = DS1_ENCODER_BUTTONS[index], name = 'EncoderButton_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource) for index in range(4)] self._master_fader = MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = DS1_MASTER, name = 'MasterFader', num = 0, script = self, optimized_send_midi = optimized, resource_type = resource) self._button = [MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = DS1_BUTTONS[index], name = 'Button_' + str(index), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource) for index in range(16)] self._grid = [[MonoButtonElement(is_momentary = is_momentary, msg_type = MIDI_NOTE_TYPE, channel = CHANNEL, identifier = DS1_GRID[x][y], name = 'Button_' + str(x) + '_' + str(y), script = self, skin = self._skin, optimized_send_midi = optimized, resource_type = resource) for x in range(3)] for y in range(3)] self._dummy = [MonoEncoderElement(msg_type = MIDI_CC_TYPE, channel = CHANNEL, identifier = 120+x, name = 'Dummy_Dial_' + str(x), num = x, script = self, optimized_send_midi = optimized, resource_type = resource) for x in range(5)] self._fader_matrix = ButtonMatrixElement(name = 'FaderMatrix', rows = [self._fader]) self._top_buttons = ButtonMatrixElement(name = 'TopButtonMatrix', rows = [self._button[:8]]) self._bottom_buttons = ButtonMatrixElement(name = 'BottomButtonMatrix', rows = [self._button[8:]]) self._dial_matrix = ButtonMatrixElement(name = 'DialMatrix', rows = self._dial) self._side_dial_matrix = ButtonMatrixElement(name = 'SideDialMatrix', rows = [self._side_dial]) self._encoder_matrix = ButtonMatrixElement(name = 'EncoderMatrix', rows = [self._encoder]) self._encoder_button_matrix = ButtonMatrixElement(name = 'EncoderButtonMatrix', rows = [self._encoder_button]) self._grid_matrix = ButtonMatrixElement(name = 'GridMatrix', rows = self._grid) self._selected_parameter_controls = ButtonMatrixElement(name = 'SelectedParameterControls', rows = [self._dummy + self._encoder[:1] + self._encoder[2:]]) def _setup_background(self): self._background = BackgroundComponent(name = 'Background') self._background.layer = Layer(priority = 0, fader_matrix = self._fader_matrix, top_buttons = self._top_buttons, bottom_buttons = self._bottom_buttons, dial_matrix = self._dial_matrix, side_dial_matrix = self._side_dial_matrix, encoder_button_matrix = self._encoder_button_matrix, grid_matrix = self._grid_matrix) self._background.set_enabled(True) def _setup_autoarm(self): self._auto_arm = AutoArmComponent(name='Auto_Arm') self._auto_arm.can_auto_arm_track = self._can_auto_arm_track def _tracks_to_use(self): return self.song.visible_tracks + self.song.return_tracks def _setup_session_control(self): self._session_ring = SessionRingComponent(num_tracks = 8, num_scenes = 1, tracks_to_use = self._tracks_to_use) self._session_ring.set_enabled(True) self._session_navigation = DS1SessionNavigationComponent(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.layer = Layer(priority = 4, track_select_dial = ComboElement(control = self._encoder[1], modifier = [self._encoder_button[1]] ), up_button = self._grid[0][1], down_button = self._grid[0][2]) self._session_navigation.set_enabled(False) self._session = DS1SessionComponent(session_ring = self._session_ring, auto_name = True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer(priority = 4, scene_launch_buttons = self._grid_matrix.submatrix[1:2, 1:2]) self._session.clips_layer = AddLayerMode(self._session, Layer(priority = 4, clip_launch_buttons = self._top_buttons, stop_track_clip_buttons = self._bottom_buttons)) self._session.set_enabled(False) def _setup_mixer_control(self): self._mixer = MonoMixerComponent(name = 'Mixer', num_returns = 2, tracks_provider = self._session_ring, track_assigner = simple_track_assigner, invert_mute_feedback = True, auto_name = True, enable_skinning = True) self._mixer.master_strip().set_volume_control(self._master_fader) self._mixer.set_prehear_volume_control(self._side_dial[3]) self._mixer.layer = Layer(volume_controls = self._fader_matrix, track_select_dial = self._encoder[1]) self._strip = [self._mixer.channel_strip(index) for index in range(8)] for index in range(8): self._strip[index].layer = Layer(priority = 4, parameter_controls = self._dial_matrix.submatrix[index:index+1, :]) self._mixer.selected_strip().layer = Layer(priority = 4, parameter_controls = self._selected_parameter_controls) self._mixer.master_strip().layer = Layer(priority = 4, parameter_controls = self._side_dial_matrix.submatrix[:3, :]) self._mixer.main_layer = AddLayerMode(self._mixer, Layer(priority = 4, solo_buttons = self._bottom_buttons, mute_buttons = self._top_buttons)) self._mixer.select_layer = AddLayerMode(self._mixer, Layer(priority = 4, arm_buttons = self._bottom_buttons, track_select_buttons = self._top_buttons)) self.song.view.selected_track = self._mixer.channel_strip(0)._track self._mixer.set_enabled(False) def _setup_transport_control(self): self._transport = DS1TransportComponent() self._transport.name = 'Transport' self._transport._record_toggle.view_transform = lambda value: 'Transport.RecordOn' if value else 'Transport.RecordOff' self._transport.layer = Layer(priority = 4, stop_button = self._grid[1][0], play_button = self._grid[0][0], record_button = self._grid[2][0]) 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_navigator = DeviceNavigator(self._device_provider, self._mixer, self) self._device_navigator.name = 'Device_Navigator' def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = SessionRecordingComponent(ViewControlComponent()) self._recorder.set_enabled(True) self._recorder.layer = Layer(priority = 4, automation_button = self._grid[1][2], record_button = self._grid[2][1],) 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 _setup_translations(self): controls = [] for control in self.controls: controls.append(control) self._translations = TranslationComponent(controls, 10) self._translations.name = 'TranslationComponent' self._translations.set_enabled(False) def _setup_main_modes(self): self._main_modes = ModesComponent(name = 'MainModes') self._main_modes.add_mode('Main', [self._mixer, self._mixer.main_layer, self._session, self._session_navigation], cycle_mode_button_color = 'ModeButtons.Main') self._main_modes.add_mode('Select', [self._mixer, self._mixer.select_layer, self._session, self._session_navigation], cycle_mode_button_color = 'ModeButtons.Select') self._main_modes.add_mode('Clips', [self._mixer, self._session, self._session.clips_layer, self._session_navigation], cycle_mode_button_color = 'ModeButtons.Clips') self._main_modes.layer = Layer(priority = 4, cycle_mode_button = self._grid[2][2]) self._main_modes.selected_mode = 'Main' self._main_modes.set_enabled(False) def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith('DS1 Input') #self._main_modes.selected_mode in ['Sends', 'Device'] and # a
class SLMkIII(IdentifiableControlSurface): _sysex_message_cache = MidiMessageCache() def __init__(self, *a, **k): super(SLMkIII, self).__init__( product_id_bytes=(sysex.NOVATION_MANUFACTURER_ID + sysex.DEVICE_FAMILY_CODE + sysex.DEVICE_FAMILY_MEMBER_CODE), *a, **k) self._main_modes = NullModes() self._element_injector = inject( element_container=const(None)).everywhere() self._message_injector = inject(message=const(None)).everywhere() with self.component_guard(): with inject(skin=const(skin), message_cache=const( self._sysex_message_cache)).everywhere(): self._elements = Elements() self._element_injector = inject( element_container=const(self._elements)).everywhere() with self.component_guard(): self._create_message() self._message_injector = inject( message=const(self._message)).everywhere() self._switch_display_layout(sysex.KNOB_SCREEN_LAYOUT_BYTE) self._device_bank_registry = DeviceBankRegistry() with self.component_guard(): self._create_session() self._create_mixer() self._create_transport() self._create_session_recording() self._create_auto_arm() self._create_track_navigation() self._create_drums() self._create_device() self._create_device_navigation() self._create_actions() self._create_clip_actions() self._create_background() self._create_modes() self._drum_group_finder = self.register_disconnectable( PercussionInstrumentFinder( device_parent=self.song.view.selected_track)) self.__on_drum_group_found.subject = self._drum_group_finder self.__on_drum_group_found() self.__on_selected_track_changed.subject = self.song.view self.__on_selected_track_changed() self.__on_session_record_changed.subject = self.song self.__on_record_mode_changed.subject = self.song self.set_feedback_channels([DRUM_FEEDBACK_CHANNEL]) self._set_feedback_velocity() def on_identified(self, midi_bytes): self._switch_display_layout(sysex.KNOB_SCREEN_LAYOUT_BYTE, force=True) self._main_modes.selected_mode = u'device_control' self._auto_arm.set_enabled(True) self._session_ring.set_enabled(True) self.set_feedback_channels([DRUM_FEEDBACK_CHANNEL]) super(SLMkIII, self).on_identified(midi_bytes) def disconnect(self): self._auto_arm.set_enabled(False) super(SLMkIII, self).disconnect() def port_settings_changed(self): self._auto_arm.set_enabled(False) self._session_ring.set_enabled(False) super(SLMkIII, self).port_settings_changed() @contextmanager def _component_guard(self): with super(SLMkIII, self)._component_guard(): with self._element_injector: with self._message_injector: yield self._format_and_send_sysex() def _format_and_send_sysex(self): messages_to_send = sysex.make_sysex_from_segments( self._sysex_message_cache.messages) for msg in messages_to_send: self._send_midi(msg) self._sysex_message_cache.clear() def _install_mapping(self, midi_map_handle, control, parameter, feedback_delay, feedback_map): success = False if control.message_type() == MIDI_CC_TYPE: feedback_rule = Live.MidiMap.CCFeedbackRule() feedback_rule.cc_no = control.message_identifier() feedback_rule.cc_value_map = feedback_map feedback_rule.channel = getattr(control, u'feedback_channel', control.message_channel()) feedback_rule.delay_in_ms = feedback_delay success = Live.MidiMap.map_midi_cc_with_feedback_map( midi_map_handle, parameter, control.message_channel(), control.message_identifier(), control.message_map_mode(), feedback_rule, not control.needs_takeover(), control.mapping_sensitivity) if success: Live.MidiMap.send_feedback_for_parameter( midi_map_handle, parameter) return success def _create_message(self): self._message = MessageComponent( name=u'Message', is_enabled=False, layer=Layer(display=u'message_display')) self._message.set_enabled(True) def _switch_display_layout(self, layout_byte, force=False): display_layout_switch = self._elements.display_layout_switch if force: display_layout_switch.clear_send_cache() display_layout_switch.send_value(layout_byte) self._clear_display_send_cache() def _clear_display_send_cache(self): for display in self._elements.text_display_lines: display.clear_send_cache() def _create_session(self): self._session_ring = SessionRingComponent( is_enabled=False, num_tracks=SESSION_WIDTH, num_scenes=SESSION_HEIGHT, tracks_to_use=lambda: tuple(self.song.visible_tracks) + tuple( self.song.return_tracks) + (self.song.master_track, ), name=u'Session_Ring') self._session = SessionComponent( is_enabled=False, session_ring=self._session_ring, name=u'Session', layer=Layer( clip_launch_buttons=u'pads', scene_launch_buttons=u'scene_launch_buttons', stop_track_clip_buttons=u'shifted_pad_row_1', stop_all_clips_button=u'shifted_scene_launch_button_1')) self._session.set_rgb_mode(CLIP_COLOR_TABLE, RGB_COLOR_TABLE) self._session.set_enabled(True) self._session_navigation = SessionNavigationComponent( session_ring=self._session_ring, name=u'Session_Navigation') def _create_mixer(self): self._mixer = MixerComponent( name=u'Mixer', is_enabled=False, auto_name=True, tracks_provider=self._session_ring, track_assigner=RightAlignTracksTrackAssigner( song=self.song, include_master_track=True), invert_mute_feedback=True, layer=Layer(volume_controls=u'sliders', volume_leds=u'slider_leds')) self._mixer.set_enabled(True) self._mixer_button_modes = DisplayingNavigatableModesComponent( name=u'Mixer_Button_Modes') self._mixer_button_modes.add_mode( u'mute_solo', AddLayerMode( self._mixer, Layer(mute_buttons=u'mixer_soft_button_row_0', solo_buttons=u'mixer_soft_button_row_1'))) self._mixer_button_modes.add_mode( u'monitor_arm', AddLayerMode( self._mixer, Layer(monitoring_state_buttons=u'mixer_soft_button_row_0', arm_buttons=u'mixer_soft_button_row_1'))) self._mixer_button_modes.layer = Layer( prev_mode_button=u'mixer_up_button', next_mode_button=u'mixer_down_button', display_1=u'mixer_display_1', display_2=u'mixer_display_2', color_field_1=u'mixer_color_field_1', color_field_2=u'mixer_color_field_2') self._mixer_button_modes.selected_mode = u'mute_solo' def _create_transport(self): self._transport = TransportComponent( name=u'Transport', is_enabled=False, layer=Layer(play_button=u'play_button', stop_button=u'stop_button', seek_backward_button=u'rw_button', seek_forward_button=u'ff_button', loop_button=u'loop_button', record_button=u'record_button', continue_playing_button=u'play_button_with_shift')) self._transport.set_enabled(True) def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name=u'Session_Recording', is_enabled=False, layer=Layer(record_button=u'record_button_with_shift')) self._session_recording.set_enabled(True) def _create_auto_arm(self): self._auto_arm = AutoArmComponent(is_enabled=False, name=u'Auto_Arm') def _create_track_navigation(self): self._view_control = NotifyingViewControlComponent( name=u'view_control', is_enabled=False, track_provider=self._session_ring, layer=Layer( prev_track_button=u'track_left_button', next_track_button=u'track_right_button', prev_track_page_button=u'track_left_button_with_shift', next_track_page_button=u'track_right_button_with_shift', prev_scene_button=u'up_button_with_shift', next_scene_button=u'down_button_with_shift')) self._view_control.set_enabled(True) self._session_ring_selection_linking = self.register_disconnectable( SessionRingSelectionLinking( session_ring=self._session_ring, selection_changed_notifier=self._view_control)) def _create_drums(self): self._drum_group = DrumGroupComponent( name=u'Drum_Group', translation_channel=DRUM_FEEDBACK_CHANNEL) def _create_device(self): self._banking_info = BankingInfo(BANK_DEFINITIONS) self._device = DeviceComponent( device_decorator_factory=DeviceDecoratorFactory(), device_bank_registry=self._device_bank_registry, banking_info=self._banking_info, name=u'Device') self._device_parameters = DeviceParameterComponent( parameter_provider=self._device, name=u'Device_Parameters') def _create_device_navigation(self): self._device_navigation = DisplayingDeviceNavigationComponent( banking_info=self._banking_info, device_bank_registry=self._device_bank_registry, device_component=self._device, num_visible_items=NUM_VISIBLE_ITEMS, name=u'Device_Navigation') def _create_actions(self): self._actions = ActionsComponent( name=u'Actions', is_enabled=False, layer=Layer( actions_color_fields=u'color_field_line_2_with_shift', undo_button=u'select_buttons_with_shift_raw[0]', redo_button=u'select_buttons_with_shift_raw[1]', metronome_button=u'select_buttons_with_shift_raw[2]', capture_midi_button=u'select_buttons_with_shift_raw[7]')) self._actions.set_enabled(True) def _create_clip_actions(self): self._clip_actions = ClipActionsComponent( name=u'Clip_Actions', is_enabled=False, layer=Layer(delete_button=u'clear_button', duplicate_button=u'duplicate_button', double_loop_button=u'duplicate_button_with_shift')) self._clip_actions.set_enabled(True) def _create_background(self): self._background = BackgroundComponent( name=u'Background', is_enabled=False, add_nop_listeners=True, layer=Layer( select_button_7_with_shift=u'select_buttons_with_shift_raw[3]', select_button_4_with_shift=u'select_buttons_with_shift_raw[4]', select_button_5_with_shift=u'select_buttons_with_shift_raw[5]', select_button_6_with_shift=u'select_buttons_with_shift_raw[6]') ) self._background.set_enabled(True) def _create_modes(self): self._encoder_modes = DisplayingSkinableModesComponent( name=u'Encoder_Modes') self._encoder_modes.add_mode(u'devices', [ partial(self._switch_display_layout, sysex.BOX_SCREEN_LAYOUT_BYTE), AddLayerMode( self._encoder_modes, Layer(mode_display=self._elements.text_display_line_5, mode_color_fields=self._elements.color_field_line_2, mode_selection_fields=self._elements. selection_field_line_2)), LayerMode( self._device_navigation, Layer(select_buttons=u'pads_flattened', device_color_fields=u'color_field_lines_0_1_flattened', device_name_display_1=u'text_display_line_0', device_name_display_2=u'text_display_line_2', device_bank_name_display_1=u'text_display_line_1', device_bank_name_display_2=u'text_display_line_3', device_selection_fields= u'selection_field_lines_0_1_flattened', selected_device_name_display=u'center_display_1')), SetAttributeMode(self._device_navigation, u'scroll_left_layer', Layer(button=u'up_button')), SetAttributeMode(self._device_navigation, u'scroll_right_layer', Layer(button=u'down_button')), LayerMode( self._device, Layer(prev_bank_button=u'display_up_button', next_bank_button=u'display_down_button')), AddLayerMode( self._mixer, Layer(selected_track_color_field=u'center_color_field', selected_track_name_display=u'center_display_1')), AddLayerMode( self._background, Layer(center_display_2=u'center_display_2', scene_launch_buttons=u'scene_launch_buttons', encoders=u'encoders')), AddLayerMode( self._actions, Layer(actions_display=u'text_display_line_5_with_shift', actions_selection_fields= u'selection_field_line_2_with_shift')) ]) self._encoder_modes.add_mode(u'pan', [ partial(self._switch_display_layout, sysex.KNOB_SCREEN_LAYOUT_BYTE), AddLayerMode( self._encoder_modes, Layer(mode_display=self._elements.text_display_line_3, mode_color_fields=self._elements.color_field_line_2, mode_selection_fields=self._elements. selection_field_line_1, selected_mode_color_field=u'center_color_field')), AddLayerMode( self._mixer, Layer(pan_controls=u'encoders', track_names_display=u'text_display_line_0', pan_value_display=u'text_display_line_1', pan_encoder_color_fields=u'encoder_color_fields', track_color_fields=u'color_field_line_0', mixer_display=u'center_display_1', pan_display=u'center_display_2')), AddLayerMode( self._background, Layer(display_up_button=u'display_up_button', display_down_button=u'display_down_button')), AddLayerMode( self._actions, Layer(actions_display=u'text_display_line_3_with_shift', actions_selection_fields= u'selection_field_line_1_with_shift')) ]) self._encoder_modes.add_mode(u'sends', [ partial(self._switch_display_layout, sysex.KNOB_SCREEN_LAYOUT_BYTE), AddLayerMode( self._encoder_modes, Layer(mode_display=self._elements.text_display_line_3, mode_color_fields=self._elements.color_field_line_2, mode_selection_fields=self._elements. selection_field_line_1, selected_mode_color_field=u'center_color_field')), AddLayerMode( self._mixer, Layer(send_controls=u'encoders', send_up_button=u'display_up_button', send_down_button=u'display_down_button', track_names_display=u'text_display_line_0', track_color_fields=u'color_field_line_0', mixer_display=u'center_display_1', send_index_display=u'center_display_2', send_value_display=u'text_display_line_1', send_encoder_color_fields=u'encoder_color_fields')), AddLayerMode( self._actions, Layer(actions_display=u'text_display_line_3_with_shift', actions_selection_fields= u'selection_field_line_1_with_shift')) ]) self._pad_modes = ModesComponent(name=u'Pad_Modes') self._pad_modes.add_mode( u'drum', LayerMode( self._drum_group, Layer(matrix=u'pads_quadratic', scroll_up_button=u'up_button', scroll_down_button=u'down_button'))) self._pad_modes.add_mode( u'disabled', AddLayerMode( self._background, Layer(matrix=u'pads_quadratic', scroll_up_button=u'up_button', scroll_down_button=u'down_button'))) self._main_modes = ModesComponent(name=u'Encoder_Modes') set_main_mode = partial(setattr, self._main_modes, u'selected_mode') self._main_modes.add_mode(u'device_control', [ partial(self._switch_display_layout, sysex.KNOB_SCREEN_LAYOUT_BYTE), AddLayerMode( self._mixer, Layer(track_select_buttons=u'select_buttons', track_names_display=u'text_display_line_3', track_color_fields=u'color_field_line_2', track_selection_fields=u'selection_field_line_1', selected_track_color_field=u'center_color_field')), LayerMode( self._device_parameters, Layer(parameter_controls=u'encoders', name_display_line=u'text_display_line_0', value_display_line=u'text_display_line_1', parameter_color_fields=u'color_field_line_0', encoder_color_fields=u'encoder_color_fields')), LayerMode( self._session_navigation, Layer(up_button=u'up_button', down_button=u'down_button')), LayerMode( self._device, Layer(prev_bank_button=u'display_up_button', next_bank_button=u'display_down_button')), LayerMode( self._device_navigation, Layer(selected_device_name_display=u'center_display_1', selected_device_bank_name_display=u'center_display_2')), AddLayerMode( self._actions, Layer(actions_display=u'text_display_line_3_with_shift', actions_selection_fields= u'selection_field_line_1_with_shift')) ]) self._main_modes.add_mode( u'options', [ self._encoder_modes, LayerMode( self._encoder_modes, Layer(devices_button=u'select_buttons_raw[0]', pan_button=u'select_buttons_raw[1]', sends_button=u'select_buttons_raw[2]')), SetAttributeMode(self._encoder_modes, u'selected_mode', u'devices'), AddLayerMode( self._background, Layer(select_button_3=u'select_buttons_raw[3]', select_button_4=u'select_buttons_raw[4]', select_button_5=u'select_buttons_raw[5]', select_button_6=u'select_buttons_raw[6]', select_button_7=u'select_buttons_raw[7]')) ], behaviour=ReenterBehaviour( on_reenter=partial(set_main_mode, u'device_control'))) self._main_modes.add_mode(u'grid', [ partial(self._switch_display_layout, sysex.KNOB_SCREEN_LAYOUT_BYTE), self._pad_modes, AddLayerMode( self._mixer, Layer(track_select_buttons=u'select_buttons', track_names_display=u'text_display_line_3', track_color_fields=u'color_field_line_2', track_selection_fields=u'selection_field_line_1', selected_track_color_field=u'center_color_field')), self._select_grid_mode, LayerMode( self._device_parameters, Layer(parameter_controls=u'encoders', name_display_line=u'text_display_line_0', value_display_line=u'text_display_line_1', parameter_color_fields=u'color_field_line_0', encoder_color_fields=u'encoder_color_fields')), LayerMode( self._device, Layer(prev_bank_button=u'display_up_button', next_bank_button=u'display_down_button')), LayerMode( self._device_navigation, Layer(selected_device_name_display=u'center_display_1', selected_device_bank_name_display=u'center_display_2')), AddLayerMode(self._background, Layer(scene_launch_buttons=u'scene_launch_buttons')), AddLayerMode( self._actions, Layer(actions_display=u'text_display_line_3_with_shift', actions_selection_fields= u'selection_field_line_1_with_shift')) ], behaviour=ReenterBehaviour( on_reenter=partial( set_main_mode, u'device_control'))) self._main_modes.layer = Layer(options_button=u'options_button', grid_button=u'grid_button') self._main_modes.selected_mode = u'device_control' @listens(u'instrument') def __on_drum_group_found(self): self._drum_group.set_drum_group_device( self._drum_group_finder.drum_group) self._select_grid_mode() @listens(u'selected_track') def __on_selected_track_changed(self): track = self.song.view.selected_track self.__on_selected_track_implicit_arm_changed.subject = track self._drum_group_finder.device_parent = track self._select_grid_mode() @listens(u'session_record') def __on_session_record_changed(self): self._set_feedback_velocity() @listens(u'implicit_arm') def __on_selected_track_implicit_arm_changed(self): self._set_feedback_velocity() @listens(u'record_mode') def __on_record_mode_changed(self): self._set_feedback_velocity() def _select_grid_mode(self): if self._main_modes.selected_mode == u'grid': drum_device = self._drum_group_finder.drum_group self._pad_modes.selected_mode = u'drum' if drum_device else u'disabled' if drum_device: self.set_controlled_track(self.song.view.selected_track) self._set_feedback_velocity() else: self.release_controlled_track() def _set_feedback_velocity(self): if is_song_recording( self.song) and self.song.view.selected_track.implicit_arm: feedback_velocity = Rgb.RED.midi_value else: feedback_velocity = Rgb.GREEN.midi_value self._c_instance.set_feedback_velocity(int(feedback_velocity))
def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name=u'Session_Recording', is_enabled=False, layer=Layer(record_button=u'record_button_with_shift')) self._session_recording.set_enabled(True)
class FA(ControlSurface): def __init__(self, *a, **k): super(FA, self).__init__(*a, **k) with self.component_guard(): with inject(skin=const(make_default_skin())).everywhere(): self._create_controls() self._create_transport() self._create_session_recording() self._create_mixer() self._create_navigation() self._create_modes() self._create_drums() def _create_controls(self): self._jump_to_start_button = make_button(21, u'Jump_To_Start_Button') self._rwd_button = make_button(22, u'RWD_Button') self._ff_button = make_button(23, u'FF_Button') self._stop_button = make_button(25, u'Stop_Button') self._play_button = make_button(26, u'Play_Button') self._record_button = make_button(28, u'Record_Button') self._encoders = ButtonMatrixElement(rows=[[ make_encoder(index + 70, u'Encoder_%d' % (index, )) for index in range(6) ]], name=u'Encoders') self._volume_mode_button = make_button(16, u'Volume_Mode_Button') self._pan_mode_button = make_button(17, u'Pan_Mode_Button') self._send_a_mode_button = make_button(18, u'Send_A_Mode_Button') self._send_b_mode_button = make_button(19, u'Send_B_Mode_Button') self._s1_button = make_button(14, u'S1_Button') self._s2_button = make_button(15, u'S2_Button') self._pads = ButtonMatrixElement(rows=[[ make_button(col_index + offset, u'Pad_%d_%d' % (col_index, row_index), msg_type=MIDI_NOTE_TYPE) for col_index in range(4) ] for row_index, offset in enumerate(range(72, 59, -4))], name=u'Pads') def _create_transport(self): self._transport = TransportComponent( name=u'Transport', is_enabled=False, layer=Layer(play_button=self._play_button, stop_button=self._stop_button, seek_backward_button=self._rwd_button, seek_forward_button=self._ff_button, jump_to_start_button=self._jump_to_start_button)) self._transport.set_enabled(True) def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name=u'Session_Recording', is_enabled=False, layer=Layer(record_button=self._record_button)) self._session_recording.set_enabled(True) def _create_mixer(self): self._session_ring = SessionRingComponent( num_tracks=self._encoders.width(), num_scenes=0, is_enabled=False, name=u'Session_Ring') self._mixer = MixerComponent(tracks_provider=self._session_ring, name=u'Mixer') def _create_navigation(self): self._navigation = SessionNavigationComponent( session_ring=self._session_ring, name=u'Navigation', is_enabled=False, layer=Layer(page_left_button=self._s1_button, page_right_button=self._s2_button)) self._navigation.set_enabled(True) def _create_modes(self): self._modes = ModesComponent(name=u'Encoder_Modes') self._modes.add_mode( u'volume_mode', LayerMode(self._mixer, Layer(volume_controls=self._encoders))) self._modes.add_mode( u'pan_mode', LayerMode(self._mixer, Layer(pan_controls=self._encoders))) self._modes.add_mode(u'send_a_mode', [ LayerMode(self._mixer, Layer(send_controls=self._encoders)), partial(self._set_send_index, 0) ]) self._modes.add_mode(u'send_b_mode', [ LayerMode(self._mixer, Layer(send_controls=self._encoders)), partial(self._set_send_index, 1) ]) self._modes.layer = Layer(volume_mode_button=self._volume_mode_button, pan_mode_button=self._pan_mode_button, send_a_mode_button=self._send_a_mode_button, send_b_mode_button=self._send_b_mode_button) self._modes.selected_mode = u'volume_mode' def _set_send_index(self, index): self._mixer.send_index = index if index < self._mixer.num_sends else None def _create_drums(self): self._drums = DrumGroupComponent(name=u'Drum_Group', is_enabled=False, translation_channel=0, layer=Layer(matrix=self._pads)) self._drums.set_enabled(True)
class DS1(LividControlSurface): _sysex_id = 16 _model_name = 'DS1' def __init__(self, c_instance): super(DS1, self).__init__(c_instance) self._skin = Skin(DS1Colors) with self.component_guard(): self._define_sysex() self._setup_controls() self._setup_background() self._setup_m4l_interface() self._setup_session_control() self._setup_mixer_control() self._setup_transport_control() self._setup_device_control() self._setup_session_recording_component() self._setup_main_modes() def _initialize_script(self): super(DS1, self)._initialize_script() self._main_modes.set_enabled(True) self._main_modes.selected_mode = 'Main' def _initialize_hardware(self): super(DS1, self)._initialize_hardware() self.local_control_off.enter_mode() self.encoder_absolute_mode.enter_mode() self.encoder_speed_sysex.enter_mode() def _define_sysex(self): self.encoder_speed_sysex = SendLividSysexMode( livid_settings=self._livid_settings, call='set_encoder_mapping', message=ENCODER_SPEED) self.encoder_absolute_mode = SendLividSysexMode( livid_settings=self._livid_settings, call='set_encoder_encosion_mode', message=[2]) self.local_control_off = SendLividSysexMode( livid_settings=self._livid_settings, call='set_local_control', message=[0]) def _setup_controls(self): is_momentary = True optimized = True resource = PrioritizedResource self._fader = [ MonoEncoderElement(mapping_feedback_delay=-1, msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=DS1_FADERS[index], name='Fader_' + str(index), num=index, script=self, optimized_send_midi=optimized, resource_type=resource) for index in range(8) ] self._dial = [[ MonoEncoderElement(mapping_feedback_delay=-1, msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=DS1_DIALS[x][y], name='Dial_' + str(x) + '_' + str(y), num=x + (y * 5), script=self, optimized_send_midi=optimized, resource_type=resource) for x in range(8) ] for y in range(5)] self._side_dial = [ MonoEncoderElement(mapping_feedback_delay=-1, msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=DS1_SIDE_DIALS[x], name='Side_Dial_' + str(x), num=x, script=self, optimized_send_midi=optimized, resource_type=resource) for x in range(4) ] self._encoder = [ MonoEncoderElement(mapping_feedback_delay=-1, msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=DS1_ENCODERS[x], name='Encoder_' + str(x), num=x, script=self, optimized_send_midi=optimized, resource_type=resource) for x in range(4) ] self._encoder_button = [ MonoButtonElement(is_momentary=is_momentary, msg_type=MIDI_NOTE_TYPE, channel=CHANNEL, identifier=DS1_ENCODER_BUTTONS[index], name='EncoderButton_' + str(index), script=self, skin=self._skin, optimized_send_midi=optimized, resource_type=resource) for index in range(4) ] self._master_fader = MonoEncoderElement(msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=DS1_MASTER, name='MasterFader', num=0, script=self, optimized_send_midi=optimized, resource_type=resource) self._button = [ MonoButtonElement(is_momentary=is_momentary, msg_type=MIDI_NOTE_TYPE, channel=CHANNEL, identifier=DS1_BUTTONS[index], name='Button_' + str(index), script=self, skin=self._skin, optimized_send_midi=optimized, resource_type=resource) for index in range(16) ] self._grid = [[ MonoButtonElement(is_momentary=is_momentary, msg_type=MIDI_NOTE_TYPE, channel=CHANNEL, identifier=DS1_GRID[x][y], name='Button_' + str(x) + '_' + str(y), script=self, skin=self._skin, optimized_send_midi=optimized, resource_type=resource) for x in range(3) ] for y in range(3)] self._dummy = [ MonoEncoderElement(msg_type=MIDI_CC_TYPE, channel=CHANNEL, identifier=120 + x, name='Dummy_Dial_' + str(x), num=x, script=self, optimized_send_midi=optimized, resource_type=resource) for x in range(5) ] self._fader_matrix = ButtonMatrixElement(name='FaderMatrix', rows=[self._fader]) self._top_buttons = ButtonMatrixElement(name='TopButtonMatrix', rows=[self._button[:8]]) self._bottom_buttons = ButtonMatrixElement(name='BottomButtonMatrix', rows=[self._button[8:]]) self._dial_matrix = ButtonMatrixElement(name='DialMatrix', rows=self._dial) self._side_dial_matrix = ButtonMatrixElement(name='SideDialMatrix', rows=[self._side_dial]) self._encoder_matrix = ButtonMatrixElement(name='EncoderMatrix', rows=[self._encoder]) self._encoder_button_matrix = ButtonMatrixElement( name='EncoderButtonMatrix', rows=[self._encoder_button]) self._grid_matrix = ButtonMatrixElement(name='GridMatrix', rows=self._grid) self._selected_parameter_controls = ButtonMatrixElement( name='SelectedParameterControls', rows=[self._dummy + self._encoder[:1] + self._encoder[2:]]) def _setup_background(self): self._background = BackgroundComponent(name='Background') self._background.layer = Layer( priority=0, fader_matrix=self._fader_matrix, top_buttons=self._top_buttons, bottom_buttons=self._bottom_buttons, dial_matrix=self._dial_matrix, side_dial_matrix=self._side_dial_matrix, encoder_button_matrix=self._encoder_button_matrix, grid_matrix=self._grid_matrix) self._background.set_enabled(True) def _setup_autoarm(self): self._auto_arm = AutoArmComponent(name='Auto_Arm') self._auto_arm.can_auto_arm_track = self._can_auto_arm_track def _tracks_to_use(self): return self.song.visible_tracks + self.song.return_tracks def _setup_session_control(self): self._session_ring = SessionRingComponent( num_tracks=8, num_scenes=1, tracks_to_use=self._tracks_to_use) self._session_ring.set_enabled(True) self._session_navigation = DS1SessionNavigationComponent( 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.layer = Layer( priority=4, track_select_dial=ComboElement(control=self._encoder[1], modifier=[self._encoder_button[1]]), up_button=self._grid[0][1], down_button=self._grid[0][2]) self._session_navigation.set_enabled(False) self._session = DS1SessionComponent(session_ring=self._session_ring, auto_name=True) hasattr(self._session, '_enable_skinning') and self._session._enable_skinning() self._session.layer = Layer( priority=4, scene_launch_buttons=self._grid_matrix.submatrix[1:2, 1:2]) self._session.clips_layer = AddLayerMode( self._session, Layer(priority=4, clip_launch_buttons=self._top_buttons, stop_track_clip_buttons=self._bottom_buttons)) self._session.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, channel_strip_component_type=MonoChannelStripComponent) self._mixer.master_strip().set_volume_control(self._master_fader) self._mixer.set_prehear_volume_control(self._side_dial[3]) self._mixer.layer = Layer(volume_controls=self._fader_matrix, track_select_dial=self._encoder[1]) self._strip = [self._mixer.channel_strip(index) for index in range(8)] if KNOBS_ARE_SENDS: for index in range(8): self._strip[index].layer = Layer( priority=4, send_controls=self._dial_matrix.submatrix[index:index + 1, :4], pan_control=self._dial[4][index]) else: for index in range(8): self._strip[index].layer = Layer( priority=4, parameter_controls=self._dial_matrix.submatrix[ index:index + 1, :]) self._mixer.selected_strip().layer = Layer( priority=4, parameter_controls=self._selected_parameter_controls) self._mixer.master_strip().layer = Layer( priority=4, parameter_controls=self._side_dial_matrix.submatrix[:3, :]) self._mixer.main_layer = AddLayerMode( self._mixer, Layer(priority=4, solo_buttons=self._bottom_buttons, mute_buttons=self._top_buttons)) self._mixer.select_layer = AddLayerMode( self._mixer, Layer(priority=4, arm_buttons=self._bottom_buttons, track_select_buttons=self._top_buttons)) self.song.view.selected_track = self._mixer.channel_strip(0)._track self._mixer.set_enabled(False) def _setup_transport_control(self): self._transport = DS1TransportComponent() self._transport.name = 'Transport' self._transport._record_toggle.view_transform = lambda value: 'Transport.RecordOn' if value else 'Transport.RecordOff' self._transport.layer = Layer(priority=4, stop_button=self._grid[1][0], play_button=self._grid[0][0], record_button=self._grid[2][0]) 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_navigator = DeviceNavigator(self._device_provider, self._mixer, self) self._device_navigator.name = 'Device_Navigator' def _setup_session_recording_component(self): self._clip_creator = ClipCreator() self._clip_creator.name = 'ClipCreator' self._recorder = SessionRecordingComponent(ViewControlComponent()) self._recorder.set_enabled(True) self._recorder.layer = Layer( priority=4, automation_button=self._grid[1][2], record_button=self._grid[2][1], ) 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 _setup_translations(self): controls = [] for control in self.controls: controls.append(control) self._translations = TranslationComponent(controls, 10) self._translations.name = 'TranslationComponent' self._translations.set_enabled(False) def _setup_main_modes(self): self._main_modes = ModesComponent(name='MainModes') self._main_modes.add_mode('Main', [ self._mixer, self._mixer.main_layer, self._session, self._session_navigation ], cycle_mode_button_color='ModeButtons.Main') self._main_modes.add_mode('Select', [ self._mixer, self._mixer.select_layer, self._session, self._session_navigation ], cycle_mode_button_color='ModeButtons.Select') self._main_modes.add_mode('Clips', [ self._mixer, self._session, self._session.clips_layer, self._session_navigation ], cycle_mode_button_color='ModeButtons.Clips') self._main_modes.layer = Layer(priority=4, cycle_mode_button=self._grid[2][2]) self._main_modes.selected_mode = 'Main' self._main_modes.set_enabled(False) def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith( 'DS1 Input')
class ComradeMidi(ControlSurface): _sysex_message_cache = MidiMessageCache() def __init__(self, c_instance): ControlSurface.__init__(self, c_instance) self._main_modes = NullModes() self._element_injector = inject( element_container=const(None)).everywhere() self._message_injector = inject(message=const(None)).everywhere() with self.component_guard(): with inject(skin=const(skin), message_cache=const( self._sysex_message_cache)).everywhere(): self._elements = Elements() self._element_injector = inject( element_container=const(self._elements)).everywhere() with self.component_guard(): self._create_message() self._message_injector = inject( message=const(self._message)).everywhere() self._switch_display_layout(sysex.KNOB_SCREEN_LAYOUT_BYTE) self._device_bank_registry = DeviceBankRegistry() with self.component_guard(): self._create_session() self._create_mixer() self._create_session_recording() self._create_auto_arm() self._create_track_navigation() self._create_device() self._create_device_navigation() self._create_background() self._create_modes() return def on_identified(self, midi_bytes): self._switch_display_layout(sysex.KNOB_SCREEN_LAYOUT_BYTE, force=True) self._main_modes.selected_mode = 'device_control' self._auto_arm.set_enabled(True) self._session_ring.set_enabled(True) self.set_feedback_channels([DRUM_FEEDBACK_CHANNEL]) self.refresh_state() def disconnect(self): self._auto_arm.set_enabled(False) super(ComradeMidi, self).disconnect() def port_settings_changed(self): self._auto_arm.set_enabled(False) self._session_ring.set_enabled(False) super(ComradeMidi, self).port_settings_changed() @contextmanager def _component_guard(self): with super(ComradeMidi, self)._component_guard(): with self._element_injector: with self._message_injector: yield self._format_and_send_sysex() def _format_and_send_sysex(self): messages_to_send = sysex.make_sysex_from_segments( self._sysex_message_cache.messages) for msg in messages_to_send: self._send_midi(msg) self._sysex_message_cache.clear() def _install_mapping(self, midi_map_handle, control, parameter, feedback_delay, feedback_map): success = False if control.message_type() == MIDI_CC_TYPE: feedback_rule = Live.MidiMap.CCFeedbackRule() feedback_rule.cc_no = control.message_identifier() feedback_rule.cc_value_map = feedback_map feedback_rule.channel = getattr(control, 'feedback_channel', control.message_channel()) feedback_rule.delay_in_ms = feedback_delay success = Live.MidiMap.map_midi_cc_with_feedback_map( midi_map_handle, parameter, control.message_channel(), control.message_identifier(), control.message_map_mode(), feedback_rule, not control.needs_takeover(), control.mapping_sensitivity) if success: Live.MidiMap.send_feedback_for_parameter( midi_map_handle, parameter) return success def _create_message(self): self._message = MessageComponent( name='Message', is_enabled=False, layer=Layer(display='message_display')) self._message.set_enabled(True) def _switch_display_layout(self, layout_byte, force=False): display_layout_switch = self._elements.display_layout_switch if force: display_layout_switch.clear_send_cache() display_layout_switch.send_value(layout_byte) self._clear_display_send_cache() def _clear_display_send_cache(self): for display in self._elements.text_display_lines: display.clear_send_cache() def _create_session(self): self._session_ring = SessionRingComponent( is_enabled=False, num_tracks=SESSION_WIDTH, num_scenes=SESSION_HEIGHT, tracks_to_use=lambda: tuple(self.song.visible_tracks) + tuple( self.song.return_tracks) + (self.song.master_track, ), name='Session_Ring') self._session = SessionComponent( is_enabled=False, session_ring=self._session_ring, name='Session', layer=Layer(clip_launch_buttons='pads', scene_launch_buttons='scene_launch_buttons', stop_track_clip_buttons='shifted_pad_row_1', stop_all_clips_button='shifted_scene_launch_button_1')) self._session.set_rgb_mode(CLIP_COLOR_TABLE, RGB_COLOR_TABLE) self._session.set_enabled(True) self._session_navigation = SessionNavigationComponent( session_ring=self._session_ring, name='Session_Navigation') def _create_mixer(self): self._mixer = MixerComponent( name='Mixer', is_enabled=False, auto_name=True, tracks_provider=self._session_ring, track_assigner=RightAlignTracksTrackAssigner( song=self.song, include_master_track=True), invert_mute_feedback=True, layer=Layer(volume_controls='sliders', volume_leds='slider_leds')) self._mixer.set_enabled(True) self._mixer_button_modes = DisplayingNavigatableModesComponent( name='Mixer_Button_Modes') self._mixer_button_modes.add_mode( 'mute_solo', AddLayerMode( self._mixer, Layer(mute_buttons='mixer_soft_button_row_0', solo_buttons='mixer_soft_button_row_1'))) self._mixer_button_modes.add_mode( 'monitor_arm', AddLayerMode( self._mixer, Layer(monitoring_state_buttons='mixer_soft_button_row_0', arm_buttons='mixer_soft_button_row_1'))) self._mixer_button_modes.layer = Layer( prev_mode_button='mixer_up_button', next_mode_button='mixer_down_button', display_1='mixer_display_1', display_2='mixer_display_2', color_field_1='mixer_color_field_1', color_field_2='mixer_color_field_2') self._mixer_button_modes.selected_mode = 'mute_solo' def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name='Session_Recording', is_enabled=False, layer=Layer(record_button='record_button_with_shift')) self._session_recording.set_enabled(True) def _create_auto_arm(self): self._auto_arm = AutoArmComponent(is_enabled=False, name='Auto_Arm') def _create_track_navigation(self): self._view_control = NotifyingViewControlComponent( name='view_control', is_enabled=False, track_provider=self._session_ring, layer=Layer(prev_track_button='track_left_button', next_track_button='track_right_button', prev_track_page_button='track_left_button_with_shift', next_track_page_button='track_right_button_with_shift', prev_scene_button='up_button_with_shift', next_scene_button='down_button_with_shift')) self._view_control.set_enabled(True) self._session_ring_selection_linking = self.register_disconnectable( SessionRingSelectionLinking( session_ring=self._session_ring, selection_changed_notifier=self._view_control)) def _create_device(self): self._banking_info = BankingInfo(BANK_DEFINITIONS) self._device = DeviceComponent( device_decorator_factory=DeviceDecoratorFactory(), device_bank_registry=self._device_bank_registry, banking_info=self._banking_info, name='Device') self._device_parameters = DeviceParameterComponent( parameter_provider=self._device, name='Device_Parameters') def _create_device_navigation(self): self._device_navigation = DisplayingDeviceNavigationComponent( banking_info=self._banking_info, device_bank_registry=self._device_bank_registry, device_component=self._device, num_visible_items=NUM_VISIBLE_ITEMS, name='Device_Navigation') def _create_background(self): self._background = BackgroundComponent( name='Background', is_enabled=False, layer=Layer( select_button_7_with_shift='select_buttons_with_shift_raw[3]', select_button_4_with_shift='select_buttons_with_shift_raw[4]', select_button_5_with_shift='select_buttons_with_shift_raw[5]', select_button_6_with_shift='select_buttons_with_shift_raw[6]')) self._background.set_enabled(True) def _create_modes(self): self._encoder_modes = DisplayingSkinableModesComponent( name='Encoder_Modes') self._encoder_modes.add_mode('devices', [ partial(self._switch_display_layout, sysex.BOX_SCREEN_LAYOUT_BYTE), AddLayerMode( self._encoder_modes, Layer(mode_display=self._elements.text_display_line_5, mode_color_fields=self._elements.color_field_line_2, mode_selection_fields=self._elements. selection_field_line_2)), LayerMode( self._device_navigation, Layer(select_buttons='pads_flattened', device_color_fields='color_field_lines_0_1_flattened', device_name_display_1='text_display_line_0', device_name_display_2='text_display_line_2', device_bank_name_display_1='text_display_line_1', device_bank_name_display_2='text_display_line_3', device_selection_fields= 'selection_field_lines_0_1_flattened', selected_device_name_display='center_display_1')), SetAttributeMode(self._device_navigation, 'scroll_left_layer', Layer(button='up_button')), SetAttributeMode(self._device_navigation, 'scroll_right_layer', Layer(button='down_button')), LayerMode( self._device, Layer(prev_bank_button='display_up_button', next_bank_button='display_down_button')), AddLayerMode( self._mixer, Layer(selected_track_color_field='center_color_field', selected_track_name_display='center_display_1')), AddLayerMode( self._background, Layer(center_display_2='center_display_2', scene_launch_buttons='scene_launch_buttons', encoders='encoders')) ]) self._main_modes = ModesComponent(name='Encoder_Modes') self._main_modes.add_mode('device_control', [ partial(self._switch_display_layout, sysex.KNOB_SCREEN_LAYOUT_BYTE), AddLayerMode( self._mixer, Layer(track_select_buttons='select_buttons', track_names_display='text_display_line_3', track_color_fields='color_field_line_2', track_selection_fields='selection_field_line_1', selected_track_color_field='center_color_field')), LayerMode( self._device_parameters, Layer(parameter_controls='encoders', name_display_line='text_display_line_0', value_display_line='text_display_line_1', parameter_color_fields='color_field_line_0', encoder_color_fields='encoder_color_fields')), LayerMode(self._session_navigation, Layer(up_button='up_button', down_button='down_button')), LayerMode( self._device, Layer(prev_bank_button='display_up_button', next_bank_button='display_down_button')), LayerMode( self._device_navigation, Layer(selected_device_name_display='center_display_1', selected_device_bank_name_display='center_display_2')) ]) self._main_modes.selected_mode = 'device_control'
class KeyLabMkII(KeyLabEssential): mixer_component_type = MixerComponent session_component_type = SessionComponent view_control_component_type = ViewControlComponent hardware_settings_component_type = HardwareSettingsComponent channel_strip_component_type = ChannelStripComponent def __init__(self, *a, **k): (super(KeyLabMkII, self).__init__)(*a, **k) with self.component_guard(): self._create_device_parameters() self._create_encoder_modes() self._create_session_recording() def _create_controls(self): super(KeyLabMkII, self)._create_controls() def make_button_row(index_offset, name): return ButtonMatrixElement(rows=[[ create_button((index + index_offset), name=('{}_{}'.format(name, index))) for index in range(8) ]], name=('{}s'.format(name))) self._select_buttons = make_button_row(24, 'Select_Button') self._solo_buttons = make_button_row(8, 'Solo_Button') self._mute_buttons = make_button_row(16, 'Mute_Button') self._record_arm_buttons = make_button_row(0, 'Record_Arm_Buttons') self._automation_button = create_button(56, name='Automation_Button') self._re_enable_automation_button = create_button( 57, name='Re_Enable_Automation_Button') self._view_button = create_button(74, name='View_Button') self._pads = ButtonMatrixElement(rows=[[ InputOnlyButton(True, MIDI_NOTE_TYPE, 9, identifier, name=('Pad_{}_{}'.format(col_index, row_index))) for col_index, identifier in enumerate(row) ] for row_index, row in enumerate(PAD_IDS)]) self._pad_leds = ButtonMatrixElement(rows=[[ create_pad_led(identifier, 'Pad_LED_{}_{}'.format(col_index, row_index)) for col_index, identifier in enumerate(row) ] for row_index, row in enumerate(PAD_LED_IDS)], name='Pad_LED_Matrix') self._display = PhysicalDisplayElement(DISPLAY_LINE_WIDTH, name='Display') self._display.set_message_parts( sysex.LCD_SET_STRING_MESSAGE_HEADER + (sysex.LCD_LINE_1_ITEM_ID, ), (sysex.NULL, sysex.LCD_LINE_2_ITEM_ID) + (ord(' '), ) * DISPLAY_LINE_WIDTH + (sysex.NULL, sysex.END_BYTE)) self._encoder_mode_cycle_button = InputOnlyButton( True, MIDI_NOTE_TYPE, 0, 51, name='Mixer_Mode_Cycle_Button') self._vegas_mode_switch = SysexElement( send_message_generator=(lambda b: sysex.VEGAS_MODE_MESSAGE_HEADER + (b, sysex.END_BYTE)), name='Vegas_Mode_Switch') self._encoder_mode_led = create_pad_led(42, name='Encoder_Mode_Led') def _create_mixer(self): super(KeyLabMkII, self)._create_mixer() self._mixer.layer += Layer(track_select_buttons=(self._select_buttons), solo_buttons=(self._solo_buttons), mute_buttons=(self._mute_buttons), arm_buttons=(self._record_arm_buttons), selected_track_name_display=(self._display), volume_controls=(self._faders)) def _create_encoder_modes(self): self._encoder_modes = ModesComponent(name='Mixer_Modes') self._encoder_modes.add_mode( 'pan_mode', (AddLayerMode(self._mixer, Layer(pan_controls=(self._encoders))), partial(self._encoder_mode_led.send_value, ENCODER_MODE_TO_COLOR['pan_mode']))) self._encoder_modes.add_mode( 'sends_a_mode', (AddLayerMode( self._mixer, Layer(send_a_controls=(self._encoders))), partial(self._encoder_mode_led.send_value, ENCODER_MODE_TO_COLOR['sends_a_mode']))) self._encoder_modes.add_mode( 'sends_b_mode', (AddLayerMode( self._mixer, Layer(send_b_controls=(self._encoders))), partial(self._encoder_mode_led.send_value, ENCODER_MODE_TO_COLOR['sends_b_mode']))) self._encoder_modes.layer = Layer( cycle_mode_button=(self._encoder_mode_cycle_button)) self._encoder_modes.add_mode( 'device_mode', (self._device_parameters, partial(self._encoder_mode_led.send_value, ENCODER_MODE_TO_COLOR['device_mode']))) self._encoder_modes.selected_mode = 'pan_mode' def _create_device_parameters(self): self._device_parameters = SimpleDeviceParameterComponent( name='Device_Parameters', is_enabled=False, device_bank_registry=(self._device_bank_registry), layer=Layer(parameter_controls=(self._encoders))) def _create_session_recording(self): self._session_recording = SessionRecordingComponent( name='Session_Recording', is_enabled=False, layer=Layer(automation_button=(self._automation_button), re_enable_automation_button=( self._re_enable_automation_button))) self._session_recording.set_enabled(True) def _create_view_control(self): super(KeyLabMkII, self)._create_view_control() self._view_control.layer += Layer( document_view_toggle_button=(self._view_button)) def _create_hardware_settings(self): super(KeyLabMkII, self)._create_hardware_settings() self._hardware_settings.layer += Layer( vegas_mode_switch=(self._vegas_mode_switch)) @listens('daw_preset') def _on_memory_preset_changed_on_hardware(self, is_daw_preset_on): super(KeyLabMkII, self)._on_memory_preset_changed_on_hardware(is_daw_preset_on) if is_daw_preset_on: self._encoder_mode_led.send_value( ENCODER_MODE_TO_COLOR[self._encoder_modes.selected_mode])