Пример #1
0
 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)
Пример #2
0
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)
Пример #3
0
Файл: DS1.py Проект: aumhaa/m4m8
 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()
Пример #5
0
 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()
Пример #6
0
	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],)
Пример #7
0
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)
Пример #10
0
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)
Пример #11
0
Файл: DS1.py Проект: aumhaa/m4m8
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')
Пример #12
0
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])