コード例 #1
0
ファイル: elements.py プロジェクト: cce/buttons10
    def __init__(self, *a, **k):
        super(Elements, self).__init__(continuous_mapping_sensitivity=CONTINUOUS_MAPPING_SENSITIVITY, fine_grained_continuous_mapping_sensitivity=FINE_GRAINED_CONTINUOUS_MAPPING_SENSITIVITY, *a, **k)
        self.display_line1 = self._create_display_line(sysex.CLEAR_LINE1, sysex.WRITE_LINE1, 0)
        self.display_line2 = self._create_display_line(sysex.CLEAR_LINE2, sysex.WRITE_LINE2, 1)
        self.display_line3 = self._create_display_line(sysex.CLEAR_LINE3, sysex.WRITE_LINE3, 2)
        self.display_line4 = self._create_display_line(sysex.CLEAR_LINE4, sysex.WRITE_LINE4, 3)
        self.display_lines = [self.display_line1,
         self.display_line2,
         self.display_line3,
         self.display_line4]
        with_shift = partial(ComboElement, modifier=self.shift_button)
        self.shifted_matrix = ButtonMatrixElement(name=u'Shifted_Button_Matrix', rows=recursive_map(with_shift, self.matrix_rows_raw))
        touch_strip_mode_element = SysexElement(send_message_generator=sysex.make_touch_strip_mode_message)
        touch_strip_light_element = SysexElement(send_message_generator=sysex.make_touch_strip_light_message)
        self.touch_strip_tap = create_note_button(12, u'Touch_Strip_Tap')
        self.touch_strip_control = TouchStripElement(name=u'Touch_Strip_Control', touch_button=self.touch_strip_tap, mode_element=touch_strip_mode_element, light_element=touch_strip_light_element)
        self.touch_strip_control.set_feedback_delay(-1)
        self.touch_strip_control.set_needs_takeover(False)
        base_message_generator = make_send_message_generator(sysex.SET_AFTERTOUCH_MODE)

        def make_aftertouch_mode_message(mode_id):
            assert mode_id in (u'polyphonic', u'mono')
            mode_message = sysex.POLY_AFTERTOUCH if mode_id == u'polyphonic' else sysex.MONO_AFTERTOUCH
            return base_message_generator(mode_message)

        self.aftertouch_control = SysexElement(sysex_identifier=sysex.SET_AFTERTOUCH_MODE, send_message_generator=make_aftertouch_mode_message, default_value=u'polyphonic')
コード例 #2
0
 def __init__(self, skin=None, *a, **k):
     (super(Elements, self).__init__)(*a, **k)
     self._create_drum_pads()
     self._create_scale_pads()
     self._create_scale_feedback_switch()
     self.note_mode_button = create_button(96, 'Note_Mode_Button')
     self.custom_mode_button = create_button(97, 'Custom_Mode_Button')
     self.record_button = create_button(98, 'Record_Button')
     self.button_faders = ButtonMatrixElement(rows=[
      [create_slider(index + self.button_fader_cc_offset, 'Button_Fader_{}'.format(index)) for index in range(SESSION_WIDTH)]],
       name='Button_Faders')
     self.button_fader_color_elements_raw = [create_button((index + self.button_fader_cc_offset), ('Button_Fader_Color_Element_{}'.format(index)), channel=BUTTON_FADER_COLOR_CHANNEL) for index in range(SESSION_WIDTH)]
     self.button_fader_color_elements = ButtonMatrixElement(rows=[
      self.button_fader_color_elements_raw],
       name='Button_Fader_Color_Elements')
     self.note_layout_switch = SysexElement(name='Note_Layout_Switch',
       send_message_generator=(lambda v: sysex.STD_MSG_HEADER + (
      ids.LP_X_ID, sysex.NOTE_LAYOUT_COMMAND_BYTE, v, sysex.SYSEX_END_BYTE)),
       default_value=(sysex.SCALE_LAYOUT_BYTE))
     session_button_color_identifier = sysex.STD_MSG_HEADER + (ids.LP_X_ID, 20)
     self.session_button_color_element = ColorSysexElement(name='Session_Button_Color_Element',
       sysex_identifier=session_button_color_identifier,
       send_message_generator=(lambda v: session_button_color_identifier + v + (sysex.SYSEX_END_BYTE,)),
       skin=skin)
     self.button_fader_setup_element = SysexElement(name='Button_Fader_Setup_Element',
       send_message_generator=(partial(self._fader_setup_message_generator, 0)))
コード例 #3
0
 def _create_touch_strip(self):
     touch_strip_mode_element = SysexElement(send_message_generator=sysex.make_touch_strip_mode_message)
     touch_strip_light_element = SysexElement(send_message_generator=sysex.make_touch_strip_light_message)
     self.touch_strip_tap = create_note_button(12, 'Touch_Strip_Tap')
     self.touch_strip_control = TouchStripElement(name='Touch_Strip_Control', touch_button=self.touch_strip_tap, mode_element=touch_strip_mode_element, light_element=touch_strip_light_element)
     self.touch_strip_control.state_count = 31
     self.touch_strip_control.set_feedback_delay(-1)
     self.touch_strip_control.set_needs_takeover(False)
コード例 #4
0
 def _create_controls(self):
     self._pads_raw = [
         ButtonElement(True,
                       MIDI_NOTE_TYPE,
                       0,
                       identifier,
                       name=u'Pad_{}'.format(identifier),
                       skin=skin) for identifier in range(100)
     ]
     self._session_matrix = ButtonMatrixElement(
         rows=[[self._pads_raw[offset + col] for col in range(NUM_TRACKS)]
               for offset in range(80, 49, -10)],
         name=u'Session_Matrix')
     self._scene_launch_button_matrix = ButtonMatrixElement(
         rows=[[
             self._pads_raw[identifier]
             for identifier in range(89, 58, -10)
         ]],
         name=u'Scene_Launch_Button_Matrix')
     self._stop_all_clips_button = ButtonElement(
         True,
         MIDI_NOTE_TYPE,
         0,
         127,
         skin=skin,
         name=u'Stop_All_Clips_Button')
     self._nav_down_button = self._pads_raw[90]
     self._nav_up_button = self._pads_raw[91]
     self._nav_left_button = self._pads_raw[92]
     self._nav_right_button = self._pads_raw[93]
     self._mode_cycle_button = ButtonElement(True,
                                             MIDI_CC_TYPE,
                                             0,
                                             127,
                                             skin=skin,
                                             name=u'Mode_Button')
     self._drum_pads = ButtonMatrixElement(
         rows=[[self._pads_raw[offset + col] for col in range(4)]
               for offset in range(48, 35, -4)],
         name=u'Drum_Pads')
     self._tempo_encoder = EncoderElement(
         MIDI_PB_TYPE,
         0,
         0,
         Live.MidiMap.MapMode.absolute,
         send_should_depend_on_forwarding=False,
         name=u'Tempo_Encoder')
     self._tempo_encoder.reset = nop
     self._sysex_element = SysexElement(sysex_identifier=SYSEX_HEADER,
                                        name=u'Sysex_Element')
     self._sysex_element.add_value_listener(nop)
     self._surface_update_message_element = ButtonElement(
         True, MIDI_CC_TYPE, 0, 64, name=u'Surface_Update_Message_Element')
     self.__on_surface_update_message_received.subject = self._surface_update_message_element
コード例 #5
0
 def __init__(self,
              arrow_button_identifiers=(91, 92, 93, 94),
              session_mode_button_identifier=95,
              *a,
              **k):
     (super(LaunchpadElements, self).__init__)(*a, **k)
     self.up_button = create_button(arrow_button_identifiers[0],
                                    'Up_Button')
     self.down_button = create_button(arrow_button_identifiers[1],
                                      'Down_Button')
     self.left_button = create_button(arrow_button_identifiers[2],
                                      'Left_Button')
     self.right_button = create_button(arrow_button_identifiers[3],
                                       'Right_Button')
     self.session_mode_button = create_button(
         session_mode_button_identifier, 'Session_Mode_Button')
     self.scene_launch_buttons_raw = [
         create_button(identifier,
                       'Scene_Launch_Button_{}'.format(row_index))
         for row_index, identifier in enumerate(range(89, 18, -10))
     ]
     self.scene_launch_buttons = ButtonMatrixElement(
         rows=[self.scene_launch_buttons_raw], name='Scene_Launch_Buttons')
     self.clip_launch_matrix = ButtonMatrixElement(
         rows=[[
             create_button(
                 (offset + col_index),
                 ('{}_Clip_Launch_Button_{}'.format(col_index, row_index)),
                 msg_type=MIDI_NOTE_TYPE)
             for col_index in range(SESSION_WIDTH)
         ] for row_index, offset in enumerate(range(81, 10, -10))],
         name='Clip_Launch_Matrix')
     self.firmware_mode_switch = SysexElement(
         name='Firmware_Mode_Switch',
         send_message_generator=(
             lambda v: sysex.STD_MSG_HEADER +
             (self.model_id, sysex.FIRMWARE_MODE_COMMAND_BYTE, v, sysex.
              SYSEX_END_BYTE)),
         default_value=(sysex.STANDALONE_MODE_BYTE),
         optimized=True)
     layout_switch_identifier = sysex.STD_MSG_HEADER + (
         self.model_id, sysex.LAYOUT_COMMAND_BYTE)
     self.layout_switch = SysexElement(
         name='Layout_Switch',
         sysex_identifier=layout_switch_identifier,
         send_message_generator=(lambda v: layout_switch_identifier +
                                 (v if type(v) is tuple else
                                  (v, )) + (sysex.SYSEX_END_BYTE, )),
         default_value=(self.default_layout),
         enquire_message=(layout_switch_identifier +
                          (sysex.SYSEX_END_BYTE, )))
コード例 #6
0
    def __init__(self, model=None, *a, **k):
        assert model is not None
        self._model = model
        super(Elements, self).__init__(
            continuous_mapping_sensitivity=CONTINUOUS_MAPPING_SENSITIVITY,
            fine_grained_continuous_mapping_sensitivity=
            FINE_GRAINED_CONTINUOUS_MAPPING_SENSITIVITY,
            *a,
            **k)
        for button in self.select_buttons_raw:
            button.is_rgb = True

        self.mix_button = self.single_track_mix_mode_button
        self.page_left_button = self.in_button
        self.page_left_button.name = 'Page_Left_Button'
        self.page_right_button = self.out_button
        self.page_right_button.name = 'Page_Right_Button'
        self.global_mute_button.is_rgb = True
        self.global_solo_button.is_rgb = True
        self.global_track_stop_button.is_rgb = True
        self.play_button.is_rgb = True
        self.record_button.is_rgb = True
        self.automation_button.is_rgb = True
        for button in self.side_buttons_raw:
            button.is_rgb = True

        self.convert_button = create_button(35, 'Convert')
        self.setup_button = create_button(30, 'Setup_Button')
        self.layout_button = create_button(31, 'Layout')
        self._create_touch_strip()
        self.aftertouch_control = SysexElement(
            send_message_generator=sysex.make_aftertouch_mode_message,
            default_value='polyphonic')
        return
コード例 #7
0
    def __init__(self, model=None, *a, **k):
        raise model is not None or AssertionError
        self._model = model
        super(Elements, self).__init__(*a, **k)
        for button in self.select_buttons_raw:
            button.is_rgb = True

        self.mix_button = self.single_track_mix_mode_button
        self.page_left_button = self.in_button
        self.page_left_button.name = 'Page_Left_Button'
        self.page_right_button = self.out_button
        self.page_right_button.name = 'Page_Right_Button'
        self.global_mute_button.is_rgb = True
        self.global_solo_button.is_rgb = True
        self.global_track_stop_button.is_rgb = True
        self.play_button.is_rgb = True
        self.record_button.is_rgb = True
        self.automation_button.is_rgb = True
        for button in self.side_buttons_raw:
            button.is_rgb = True

        self.convert_button = create_button(35, 'Convert')
        self.setup_button = create_button(30, 'Setup_Button')
        self.layout_button = create_button(31, 'Layout')
        self._create_touch_strip()
        self.aftertouch_control = SysexElement(
            send_message_generator=sysex.make_aftertouch_mode_message,
            default_value='polyphonic')
        return
コード例 #8
0
 def _create_scale_feedback_switch(self):
     self.scale_feedback_switch = SysexElement(
         name='Scale_Feedback_Switch',
         send_message_generator=(
             lambda v: sysex.STD_MSG_HEADER +
             (self.model_id, sysex.SCALE_FEEDBACK_COMMAND_BYTE, v, sysex.
              SYSEX_END_BYTE)))
コード例 #9
0
 def __init__(self, *a, **k):
     super(Akai_Force_MPC, self).__init__(*a, **k)
     self._product_id = None
     self._element_injector = inject(
         element_container=const(None)).everywhere()
     self._is_initialized = False
     self._initialize_task = self._tasks.add(task.run(self._initialize))
     self._initialize_task.kill()
     self._components_enabled = False
     with self.component_guard():
         self._ping_element = SysexElement(
             send_message_generator=const(SYSEX_MSG_HEADER +
                                          (BROADCAST_ID, PING_MSG_TYPE,
                                           SYSEX_END_BYTE)),
             name=b'Ping_Element')
         self._pong_element = MultiElement(
             name=b'Pong_Multi_Element',
             *[
                 IdentifyingSysexElement(
                     sysex_identifier=SYSEX_MSG_HEADER +
                     (identifier, PONG_MSG_TYPE),
                     name=(b'Pong_Element_{}').format(index))
                 for index, identifier in enumerate(SUPPORTED_PRODUCT_IDS)
             ])
         self._ping_pong = PingPongComponent(
             on_pong_callback=self._identify,
             on_ping_timeout=partial(self._enable_components, False),
             name=b'Ping_Pong')
         self._ping_pong.layer = Layer(ping=self._ping_element,
                                       pong=self._pong_element)
     return
コード例 #10
0
    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')
コード例 #11
0
 def _create_controls(self):
     self._play_button = MultiElement(create_button(16, u'Play_Button'), create_button(17, u'Play_Button_With_Shift'))
     self._record_button = create_button(18, u'Record_Button')
     self._count_in_button = create_button(19, u'Count_In_Button')
     self._stop_button = create_button(20, u'Stop_Button')
     self._clear_button = create_button(21, u'Clear_Button')
     self._loop_button = create_button(22, u'Loop_Button')
     self._metronome_button = create_button(23, u'Metronome_Button')
     self._tap_tempo_button = create_button(24, u'Tap_Tempo_Button')
     self._undo_button = create_button(32, u'Undo_Button')
     self._redo_button = create_button(33, u'Redo_Button')
     self._quantize_button = create_button(34, u'Quantize_Button')
     self._automation_button = create_button(35, u'Automation_Button')
     self._clip_launch_button = create_button(96, u'Clip_Launch_Button')
     self._track_stop_button = create_button(97, u'Track_Stop_Button')
     self._jump_encoder = create_encoder(52, u'Jump_Encoder')
     self._loop_encoder = create_encoder(53, u'Loop_Encoder')
     self._volume_encoders = ButtonMatrixElement(rows=[[ create_encoder(index + 80, u'Volume_Encoder_{}'.format(index), is_s_mk2=self.is_s_mk2) for index in xrange(NUM_TRACKS) ]], name=u'Volume_Encoders')
     self._pan_encoders = ButtonMatrixElement(rows=[[ create_encoder(index + 88, u'Pan_Encoder_{}'.format(index), is_s_mk2=self.is_s_mk2) for index in xrange(NUM_TRACKS) ]], name=u'Pan_Encoders')
     self._track_name_displays = ButtonMatrixElement(rows=[[ create_display_line(sysex.TRACK_NAME_DISPLAY_HEADER, index, u'Track_Name_Display_{}'.format(index), width=33 if self.is_s_mk2 else 11) for index in xrange(NUM_TRACKS) ]], name=u'Track_Name_Displays')
     self._track_volume_displays = ButtonMatrixElement(rows=[[ create_display_line(sysex.TRACK_VOLUME_DISPLAY_HEADER, index, u'Track_Volume_Display_{}'.format(index), width=12) for index in xrange(NUM_TRACKS) ]], name=u'Track_Volume_Displays')
     self._track_panning_displays = ButtonMatrixElement(rows=[[ create_display_line(sysex.TRACK_PANNING_DISPLAY_HEADER, index, u'Track_Panning_Display_{}'.format(index), width=12) for index in xrange(NUM_TRACKS) ]], name=u'Track_Panning_Displays')
     self._track_type_displays = ButtonMatrixElement(rows=[[ create_sysex_element(sysex.TRACK_TYPE_DISPLAY_HEADER, index, u'Track_Type_Display_{}'.format(index)) for index in xrange(NUM_TRACKS) ]], name=u'Track_Type_Displays')
     self._track_mute_displays = ButtonMatrixElement(rows=[[ create_sysex_element(sysex.TRACK_MUTE_DISPLAY_HEADER, index, u'Track_Mute_Display_{}'.format(index)) for index in xrange(NUM_TRACKS) ]], name=u'Track_Mute_Displays')
     self._track_solo_displays = ButtonMatrixElement(rows=[[ create_sysex_element(sysex.TRACK_SOLO_DISPLAY_HEADER, index, u'Track_Solo_Display_{}'.format(index)) for index in xrange(NUM_TRACKS) ]], name=u'Track_Solo_Displays')
     self._track_muted_via_solo_displays = ButtonMatrixElement(rows=[[ create_sysex_element(sysex.TRACK_MUTED_VIA_SOLO_DISPLAY_HEADER, index, u'Track_Muted_via_Solo_Display_{}'.format(index)) for index in xrange(NUM_TRACKS) ]], name=u'Track_Muted_via_Solo_Displays')
     self._track_selection_displays = ButtonMatrixElement(rows=[[ create_sysex_element(sysex.TRACK_SELECT_DISPLAY_HEADER, index, u'Track_Selection_Display_{}'.format(index)) for index in xrange(NUM_TRACKS) ]], name=u'Track_Selection_Displays')
     self._focus_follow_control = SysexElement(lambda value: sysex.TRACK_CHANGED_DISPLAY_HEADER + value + (midi.SYSEX_END,), name=u'Focus_Follow_Control')
     self._handshake_control = create_button(1, u'Handshake_Control')
     self._handshake_control.reset = nop
     self._on_handshake_response.subject = self._handshake_control
コード例 #12
0
def create_sysex_element(message_prefix,
                         enquire_message=None,
                         default_value=None):
    return SysexElement(
        sysex_identifier=message_prefix,
        send_message_generator=make_send_message_generator(message_prefix),
        enquire_message=enquire_message,
        default_value=default_value)
コード例 #13
0
    def __init__(self, *a, **k):
        super(Elements, self).__init__(*a, **k)
        self.display_encoder = create_encoder(29, u'Display_Encoder')
        self.shift_button = create_button(31, u'Shift_Button', resource_type=PrioritizedResource)
        self.plus_button = create_button(0, u'Plus_Button', msg_type=MIDI_NOTE_TYPE, skin=rgb_skin)
        self.minus_button = create_button(1, u'Minus_Button', msg_type=MIDI_NOTE_TYPE, skin=rgb_skin)
        self.song_mode_button = create_button(32, u'Song_Mode_Button')
        self.instrument_mode_button = create_button(33, u'Instrument_Mode_Button')
        self.editor_mode_button = create_button(34, u'Editor_Mode_Button')
        self.user_mode_button = create_button(35, u'User_Mode_Button')
        self.display_left_button = create_button(42, u'Display_Left_Button')
        self.display_right_button = create_button(43, u'Display_Right_Button')
        self.up_button = create_button(87, u'Up_Button')
        self.down_button = create_button(89, u'Down_Button')
        self.left_button = create_button(90, u'Left_Button')
        self.right_button = create_button(102, u'Right_Button')
        self.click_button = create_button(105, u'Click_Button')
        self.record_button = create_button(107, u'Record_Button')
        self.play_button = create_button(109, u'Play_Button', skin=rgb_skin)
        self.stop_button = create_button(111, u'Stop_Button')
        for i, name in enumerate(BANK_BUTTON_NAMES):
            setattr(self, name, create_button(i, name.title(), skin=rgb_skin))

        def with_shift(button):
            return ComboElement(control=button, modifier=self.shift_button, name=u'{}_With_Shift'.format(button.name))

        self.play_button_with_shift = with_shift(self.play_button)
        self.stop_button_with_shift = with_shift(self.stop_button)
        self.record_button_with_shift = with_shift(self.record_button)
        self.up_button_with_shift = with_shift(self.up_button)
        self.down_button_with_shift = with_shift(self.down_button)
        self.display_buttons_raw = [ create_button(index + 36, u'Display_Button_{}'.format(index)) for index in range(6) ]
        self.display_buttons = ButtonMatrixElement(rows=[self.display_buttons_raw], name=u'Display_Buttons')
        self.lower_pads = ButtonMatrixElement(rows=[[ create_button(36 + index, u'Lower_Pad_{}'.format(index), msg_type=MIDI_NOTE_TYPE, skin=rgb_skin) for index in range(SESSION_WIDTH) ]], name=u'Lower_Pads')
        self.upper_pads = ButtonMatrixElement(rows=[[ create_button(52 + index, u'Upper_Pad_{}'.format(index), msg_type=MIDI_NOTE_TYPE, skin=rgb_skin) for index in range(SESSION_WIDTH) ]], name=u'Upper_Pads')
        self.encoders_raw = [ create_encoder(index + 14, u'Encoder_{}'.format(index)) for index in range(8) ]
        self.encoders = ButtonMatrixElement(rows=[self.encoders_raw], name=u'Encoders')
        self.button_label_display_matrix = ButtonMatrixElement(rows=[[ create_display_element(strip_id, u'Button_Label_Display_{}'.format(index), **DISPLAY_RGB_VALUES) for index, strip_id in enumerate((0, 1, 2, 11, 12, 13)) ]], name=u'Button_Label_Displays')
        self.track_name_display = create_display_element(6, u'Track_Name_Display', **DISPLAY_RGB_VALUES)
        self.device_name_display = create_display_element(7, u'Device_Name_Display', **DISPLAY_RGB_VALUES)
        self.lower_firmware_toggle_switch = SysexElement(name=u'Lower_Firmware_Toggle_Switch', send_message_generator=lambda v: midi.LOWER_FIRMWARE_TOGGLE_HEADER + (v, midi.SYSEX_END_BYTE))
        self.upper_firmware_toggle_switch = SysexElement(name=u'Upper_Firmware_Toggle_Switch', send_message_generator=lambda v: midi.UPPER_FIRMWARE_TOGGLE_HEADER + (v, midi.SYSEX_END_BYTE))
        self.touch_strip_tap = create_button(64, u'Touch_Strip_Tap')
        self.touch_strip_leds = [ create_button(led_id, u'Touch_Strip_LED_{}'.format(index)) for index, led_id in enumerate(TOUCH_STRIP_LED_CC_RANGE) ]
        self.touch_strip = TouchStripElement(name=u'Touch_Strip', msg_type=MIDI_PB_TYPE, channel=15, touch_element=self.touch_strip_tap, leds=self.touch_strip_leds)
        self.touch_strip.set_needs_takeover(False)
コード例 #14
0
 def __init__(self, *a, **k):
     (super(Elements, self).__init__)(*a, **k)
     self.foot_switches = ButtonMatrixElement(rows=[
      [create_button(i, 'Foot_Switch_{}'.format(i)) for i in range(NUM_LOOPER_SWITCHES)]],
       name='Foot_Switches')
     self.time_display = TimeDisplayElement(SYSEX_HEADER + NUMERIC_DISPLAY_COMMAND, (SYSEX_END,))
     self.live_integration_mode_switch = SysexElement(name='Live_Integration_Mode_Switch',
       send_message_generator=(lambda v: LIVE_INTEGRATION_MODE_ID + (v, SYSEX_END)))
コード例 #15
0
 def _create_controls(self):
     self._hardware_live_mode_switch = SysexElement(send_message_generator=lambda b: sysex.LIVE_MODE_MESSAGE_HEADER + (
      b, sysex.END_BYTE), default_value=sysex.OFF_VALUE, name=b'Hardware_Live_Mode_Switch')
     self._memory_preset_switch = SysexElement(send_message_generator=lambda b: sysex.MEMORY_PRESET_SWITCH_MESSAGE_HEADER + (
      b, sysex.END_BYTE), sysex_identifier=sysex.MEMORY_PRESET_SWITCH_MESSAGE_HEADER, name=b'Memory_Preset_Switch')
     self._memory_preset_select_mode_switch = SysexElement(sysex_identifier=sysex.MEMORY_PRESET_SELECT_MODE_MESSAGE_HEADER, name=b'Memory_Preset_Select_Mode')
     self._play_button = create_button(94, b'Play_Button')
     self._stop_button = create_button(93, b'Stop_Button')
     self._punch_in_button = create_button(87, b'Punch_In_Button')
     self._punch_out_button = create_button(88, b'Punch_Out_Button')
     self._metronome_button = create_button(89, b'Metronome_Button')
     self._loop_button = create_button(86, b'Loop_Button')
     self._rwd_button = create_button(91, b'Rewind_Button')
     self._ff_button = create_button(92, b'Fast_Forward_Button')
     self._record_button = create_button(95, b'Record_Button')
     self._undo_button = create_button(81, b'Undo_Button')
     self._bank_left_button = create_button(46, b'Bank_Left_Button')
     self._bank_right_button = create_button(47, b'Bank_Right_Button')
     self._left_button = create_button(48, b'Left_Button')
     self._right_button = create_button(49, b'Right_Button')
     self._left_arrow_button = create_button(98, b'Left_Arrow_Button')
     self._right_arrow_button = create_button(99, b'Right_Arrow_Button')
     self._marker_button = create_button(84, b'Marker_Button')
     self._pads = ButtonMatrixElement(rows=[
      [ create_button(col + 36, b'Pad_%d' % (col,), channel=10) for col in xrange(8)
      ]], name=b'Pad_Matrix')
     self._pad_leds = ButtonMatrixElement(rows=[
      [ create_pad_led(column + 112, b'Pad_LED_%d' % (column,)) for column in xrange(8)
      ]], name=b'Pad_LED_Matrix')
     self._faders = ButtonMatrixElement(rows=[
      [ SliderElement(msg_type=MIDI_PB_TYPE, channel=index, identifier=None, name=b'Fader_%d' % (index,)) for index in xrange(8)
      ]], name=b'Faders')
     self._master_fader = SliderElement(MIDI_PB_TYPE, 8, identifier=None, name=b'Master_Fader')
     self._encoders = ButtonMatrixElement(rows=[
      [ create_ringed_encoder(index + 16, index + 48, b'Encoder_%d' % (index,)) for index in xrange(8)
      ]])
     self._jogwheel = EncoderElement(MIDI_CC_TYPE, 0, 60, Live.MidiMap.MapMode.relative_smooth_signed_bit, name=b'Jogwheel')
     return
コード例 #16
0
    def _send_color_palette(self):
        if self._should_send_palette():
            with self.component_guard():
                palette_entry = SysexElement(sysex.make_rgb_palette_entry_message)
                finalize_palette = SysexElement(sysex.make_reapply_palette_message)
                for index, hex_color, white_balance in COLOR_TABLE:
                    palette_entry.send_value(index, hex_color, white_balance)

                finalize_palette.send_value()
コード例 #17
0
class Blocks(ControlSurface):
    def __init__(self, *a, **k):
        super(Blocks, self).__init__(*a, **k)
        with self.component_guard():
            self._create_controls()
            self._create_session()
            self._create_navigation()
            self._create_drums()
            self._create_drum_finder()
            self._create_modes()
        self.set_feedback_channels(FEEDBACK_CHANNELS)
        self.__on_target_track_changed.subject = self._target_track_provider
        self.__on_armed_tracks_changed.subject = self._target_track_provider
        self.__on_percussion_instrument_found.subject = self._percussion_instrument_finder
        self.__on_percussion_instrument_found()
        self.__on_tempo_changed_in_live.subject = self.song
        self.__on_tempo_changed_in_live()
        self.__on_session_record_changed.subject = self.song
        self._set_feedback_velocity()

    def _create_controls(self):
        self._pads_raw = [
            ButtonElement(True,
                          MIDI_NOTE_TYPE,
                          0,
                          identifier,
                          name=u'Pad_{}'.format(identifier),
                          skin=skin) for identifier in range(100)
        ]
        self._session_matrix = ButtonMatrixElement(
            rows=[[self._pads_raw[offset + col] for col in range(NUM_TRACKS)]
                  for offset in range(80, 49, -10)],
            name=u'Session_Matrix')
        self._scene_launch_button_matrix = ButtonMatrixElement(
            rows=[[
                self._pads_raw[identifier]
                for identifier in range(89, 58, -10)
            ]],
            name=u'Scene_Launch_Button_Matrix')
        self._stop_all_clips_button = ButtonElement(
            True,
            MIDI_NOTE_TYPE,
            0,
            127,
            skin=skin,
            name=u'Stop_All_Clips_Button')
        self._nav_down_button = self._pads_raw[90]
        self._nav_up_button = self._pads_raw[91]
        self._nav_left_button = self._pads_raw[92]
        self._nav_right_button = self._pads_raw[93]
        self._mode_cycle_button = ButtonElement(True,
                                                MIDI_CC_TYPE,
                                                0,
                                                127,
                                                skin=skin,
                                                name=u'Mode_Button')
        self._drum_pads = ButtonMatrixElement(
            rows=[[self._pads_raw[offset + col] for col in range(4)]
                  for offset in range(48, 35, -4)],
            name=u'Drum_Pads')
        self._tempo_encoder = EncoderElement(
            MIDI_PB_TYPE,
            0,
            0,
            Live.MidiMap.MapMode.absolute,
            send_should_depend_on_forwarding=False,
            name=u'Tempo_Encoder')
        self._tempo_encoder.reset = nop
        self._sysex_element = SysexElement(sysex_identifier=SYSEX_HEADER,
                                           name=u'Sysex_Element')
        self._sysex_element.add_value_listener(nop)
        self._surface_update_message_element = ButtonElement(
            True, MIDI_CC_TYPE, 0, 64, name=u'Surface_Update_Message_Element')
        self.__on_surface_update_message_received.subject = self._surface_update_message_element

    def _create_session(self):
        self._session_ring = SessionRingComponent(num_tracks=NUM_TRACKS,
                                                  num_scenes=NUM_SCENES,
                                                  is_enabled=False,
                                                  name=u'Session_Ring')
        self._session = SessionComponent(session_ring=self._session_ring,
                                         name=u'Session')
        self._session.set_rgb_mode(LIVE_COLORS_TO_MIDI_VALUES, RGB_COLOR_TABLE)

    def _create_navigation(self):
        self._session_navigation = SessionNavigationComponent(
            session_ring=self._session_ring, name=u'Session_Navigation')

    def _create_drums(self):
        self._drum_group = DrumGroupComponent(
            name=u'Drum_Group', translation_channel=DRUM_FEEDBACK_CHANNEL)

    def _create_drum_finder(self):
        self._target_track_provider = TargetTrackProvider()
        self._percussion_instrument_finder = self.register_disconnectable(
            PercussionInstrumentFinder(
                device_parent=self._target_track_provider.target_track))

    def _create_modes(self):
        self._note_modes = ModesComponent(name=u'Note_Modes', is_enabled=False)
        self._melodic_pad_translator = ElementTranslator(
            self._pads_raw, MELODIC_FEEDBACK_CHANNEL, NON_FEEDBACK_CHANNEL)
        self._note_modes.add_mode(u'drum', [
            partial(self._send_mode_message, u'drum'),
            LayerMode(self._drum_group, Layer(matrix=self._drum_pads))
        ])
        self._note_modes.add_mode(u'melodic', [
            partial(self._send_mode_message, u'melodic'),
            self._melodic_pad_translator
        ])
        self._note_modes.add_mode(
            u'disabled', [partial(self._send_mode_message, u'disabled')])
        self._modes = ModesComponent(name=u'Modes')
        self._modes.add_mode(u'session', [
            partial(self._send_mode_message, u'session'),
            partial(self._clear_send_cache, self._pads_raw),
            LayerMode(
                self._session,
                Layer(clip_launch_buttons=self._session_matrix,
                      scene_launch_buttons=self._scene_launch_button_matrix,
                      stop_all_clips_button=self._stop_all_clips_button)),
            LayerMode(
                self._session_navigation,
                Layer(down_button=self._nav_down_button,
                      up_button=self._nav_up_button,
                      left_button=self._nav_left_button,
                      right_button=self._nav_right_button))
        ])
        self._modes.add_mode(u'note',
                             [self._note_modes, self._select_note_mode])
        self._modes.cycle_mode_button.set_control_element(
            self._mode_cycle_button)
        self._modes.selected_mode = u'session'

    @listens(u'target_track')
    def __on_target_track_changed(self):
        self._percussion_instrument_finder.device_parent = self._target_track_provider.target_track
        self._select_note_mode()

    @listens(u'instrument')
    def __on_percussion_instrument_found(self):
        self._drum_group.set_drum_group_device(
            self._percussion_instrument_finder.drum_group)
        self._select_note_mode()

    @listens(u'armed_tracks')
    def __on_armed_tracks_changed(self):
        self._set_feedback_velocity()

    @listens(u'tempo')
    def __on_tempo_changed_in_live(self):
        normalized_tempo = old_div(
            clamp(self.song.tempo, TEMPO_MIN, TEMPO_MAX) - TEMPO_MIN,
            TEMPO_MAX - TEMPO_MIN)
        value_to_send = clamp(int(normalized_tempo * PB_VALUE_RANGE_MAX), 0,
                              PB_VALUE_RANGE_MAX)
        self._tempo_encoder.send_value(value_to_send)

    @listens(u'session_record')
    def __on_session_record_changed(self):
        self._set_feedback_velocity()

    @listens(u'value')
    def __on_surface_update_message_received(self, value):
        if value:
            self._clear_send_cache(self.controls)
            self.update()
            self.__on_tempo_changed_in_live()

    def _set_feedback_velocity(self):
        target_track = self._target_track_provider.target_track
        if self.song.session_record and liveobj_valid(
                target_track) and target_track.arm:
            feedback_velocity = Rgb.RED.midi_value
        else:
            feedback_velocity = Rgb.GREEN.midi_value
        self._c_instance.set_feedback_velocity(int(feedback_velocity))

    def _select_note_mode(self):
        track = self._target_track_provider.target_track
        drum_device = self._percussion_instrument_finder.drum_group
        if not is_playable(track):
            self._note_modes.selected_mode = u'disabled'
        elif drum_device:
            self._note_modes.selected_mode = u'drum'
        else:
            self._note_modes.selected_mode = u'melodic'
        if self._note_modes.selected_mode == u'disabled':
            self.release_controlled_track()
        else:
            self.set_controlled_track(track)

    def _send_mode_message(self, mode):
        self._send_midi(
            (CC_STATUS + MODE_MSG_CHANNEL, MODE_NAMES_TO_IDS[mode], 127))

    def _clear_send_cache(self, controls):
        for control in controls:
            control.clear_send_cache()

    def port_settings_changed(self):
        super(Blocks, self).port_settings_changed()
        self.set_feedback_channels(FEEDBACK_CHANNELS)
コード例 #18
0
    def __init__(self, *a, **k):
        super(Elements, self).__init__(*a, **k)
        self.display_up_button = create_button(81, 'Display_Up_Button')
        self.display_down_button = create_button(82, 'Display_Down_Button')
        self.up_button = create_button(85, 'Up_Button')
        self.down_button = create_button(86, 'Down_Button')
        self.mixer_up_button = create_button(87, 'Mixer_Up_Button')
        self.mixer_down_button = create_button(88, 'Mixer_Down_Button')
        self.grid_button = create_button(89, 'Grid_Button')
        self.options_button = create_button(90, 'Options_Button')
        self.shift_button = create_button(91,
                                          'Shift_Button',
                                          resource_type=PrioritizedResource)
        self.duplicate_button = create_button(92, 'Duplicate_Button')
        self.clear_button = create_button(93, 'Clear_Button')
        self.track_left_button = create_button(102, 'Track_Left_Button')
        self.track_right_button = create_button(103, 'Track_Right_Button')
        self.rw_button = create_button(112, 'RW_Button')
        self.ff_button = create_button(113, 'FF_Button')
        self.stop_button = create_button(114, 'Stop_Button')
        self.play_button = create_button(115, 'Play_Button')
        self.loop_button = create_button(116, 'Loop_Button')
        self.record_button = create_button(117, 'Record_Button')

        def with_shift(button):
            return ComboElement(control=button,
                                modifier=self.shift_button,
                                name=('{}_With_Shift').format(button.name))

        self.up_button_with_shift = with_shift(self.up_button)
        self.down_button_with_shift = with_shift(self.down_button)
        self.record_button_with_shift = with_shift(self.record_button)
        self.play_button_with_shift = with_shift(self.play_button)
        self.track_left_button_with_shift = with_shift(self.track_left_button)
        self.track_right_button_with_shift = with_shift(
            self.track_right_button)
        self.duplicate_button_with_shift = with_shift(self.duplicate_button)
        pads_raw = [[
            create_button(offset + col_index,
                          ('Pad_{}_{}').format(col_index, row_index),
                          msg_type=MIDI_NOTE_TYPE)
            for col_index in xrange(SESSION_WIDTH)
        ] for row_index, offset in enumerate((96, 112))]
        self.pads = ButtonMatrixElement(rows=pads_raw, name='Pads')
        self.pads_quadratic = ButtonMatrixElement(rows=[
            pads_raw[0][4:], pads_raw[1][4:], pads_raw[0][:4], pads_raw[1][:4]
        ],
                                                  name='Pads_Quadratic')
        self.pads_flattened = ButtonMatrixElement(
            rows=[pads_raw[0] + pads_raw[1]], name='Pads_Flattened')
        self.shifted_pad_row_1 = ButtonMatrixElement(
            rows=[[with_shift(control) for control in pads_raw[1]]],
            name='Pad_Row_1_With_Shift')
        scene_launch_buttons_raw = [
            create_button(83 + row_index,
                          name=('Scene_Launch_Button_{}').format(row_index))
            for row_index in xrange(SESSION_HEIGHT)
        ]
        self.scene_launch_buttons = ButtonMatrixElement(
            rows=[scene_launch_buttons_raw], name='Scene_Launch_Buttons')
        self.shifted_scene_launch_button_1 = with_shift(
            scene_launch_buttons_raw[1])
        sliders = [
            SpecialFeedbackChannelSliderElement(
                MIDI_CC_TYPE,
                DEFAULT_CHANNEL,
                41 + index,
                name=('Slider_{}').format(index))
            for index in xrange(SESSION_WIDTH)
        ]
        for slider in sliders:
            slider.set_feedback_delay(1)

        self.sliders = ButtonMatrixElement(rows=[sliders], name='Sliders')
        self.slider_leds = ButtonMatrixElement(rows=[[
            create_rgb_led(index + 54, ('Slider_LED_{}').format(index))
            for index in xrange(8)
        ]],
                                               name='Slider_LEDs')
        self.mixer_soft_button_row_0 = ButtonMatrixElement(
            rows=[[
                create_button(identifier,
                              ('Mixer_Soft_Button_{}_0').format(col_index))
                for col_index, identifier in enumerate(
                    xrange(59, 59 + SESSION_WIDTH))
            ]],
            name='Mixer_Soft_Button_Row_0')
        self.mixer_soft_button_row_1 = ButtonMatrixElement(
            rows=[[
                create_button(identifier,
                              ('Mixer_Soft_Button_{}_1').format(col_index))
                for col_index, identifier in enumerate(
                    xrange(59 + SESSION_WIDTH, 59 + SESSION_WIDTH * 2))
            ]],
            name='Mixer_Soft_Button_Row_1')
        self.message_display = SpecialPhysicalDisplayElement(
            width_in_chars=38,
            num_segments=NUM_MESSAGE_SEGMENTS,
            name='Message_Display')
        self.message_display.set_message_parts(sysex.SHOW_MESSAGE_MSG_HEADER,
                                               (sysex.SYSEX_END_BYTE, ))
        self.center_display_1 = mixin(CachingControlElement,
                                      ConfigurablePhysicalDisplayElement)(
                                          v_position=0,
                                          width_in_chars=9,
                                          name='Center_Display_1')
        self.center_display_2 = mixin(CachingControlElement,
                                      ConfigurablePhysicalDisplayElement)(
                                          v_position=1,
                                          width_in_chars=9,
                                          name='Center_Display_2')
        self.mixer_display_1 = mixin(CachingControlElement,
                                     ConfigurablePhysicalDisplayElement)(
                                         v_position=2,
                                         width_in_chars=9,
                                         name='Mixer_Button_Display_1')
        self.mixer_display_2 = mixin(CachingControlElement,
                                     ConfigurablePhysicalDisplayElement)(
                                         v_position=3,
                                         width_in_chars=9,
                                         name='Mixer_Button_Display_2')
        for display in (self.center_display_1, self.center_display_2,
                        self.mixer_display_1, self.mixer_display_2):
            display.set_message_parts(sysex.SET_PROPERTY_MSG_HEADER,
                                      (sysex.SYSEX_END_BYTE, ))
            display.segment(0).set_position_identifier((8, ))

        self.center_color_field = create_display_color_element(
            8, 0, 'Center_Color_Field')
        self.mixer_color_field_1 = create_display_color_element(
            8, 1, 'Mixer_Color_Field_1')
        self.mixer_color_field_2 = create_display_color_element(
            8, 2, 'Mixer_Color_Field_2')
        self.select_buttons_raw = [
            create_button(51 + index, ('Select_Button_{}').format(index))
            for index in xrange(8)
        ]
        self.select_buttons = ButtonMatrixElement(
            rows=[self.select_buttons_raw], name='Select_Buttons')
        self.select_buttons_with_shift_raw = [
            with_shift(button) for button in self.select_buttons_raw
        ]
        self.display_layout_switch = SysexElement(
            name='Display_Layout_Switch',
            send_message_generator=lambda v: sysex.
            SET_SCREEN_LAYOUT_MESSAGE_HEADER + (v, sysex.SYSEX_END_BYTE),
            default_value=sysex.EMPTY_SCREEN_LAYOUT_BYTE,
            optimized=True)
        self.text_display_line_0 = create_text_display_line(0)
        self.text_display_line_1 = create_text_display_line(1)
        self.text_display_line_2 = create_text_display_line(2)
        self.text_display_line_3 = create_text_display_line(3)
        self.text_display_line_5 = create_text_display_line(5)
        self.text_display_line_3_with_shift = with_shift(
            self.text_display_line_3)
        self.text_display_line_5_with_shift = with_shift(
            self.text_display_line_5)
        self.text_display_lines = [
            self.text_display_line_0, self.text_display_line_1,
            self.text_display_line_2, self.text_display_line_3,
            self.text_display_line_5
        ]
        color_field_line_0_raw, self.color_field_line_0 = create_display_color_element_line(
            0)
        color_field_line_1_raw, _ = create_display_color_element_line(1)
        self.color_field_line_2_raw, self.color_field_line_2 = create_display_color_element_line(
            2)
        self.color_field_lines_0_1_flattened = ButtonMatrixElement(
            rows=[color_field_line_0_raw + color_field_line_1_raw],
            name='Color_Field_Lines_0_1_Flattened')
        self.color_field_line_2_with_shift = ButtonMatrixElement(
            rows=[[
                with_shift(color_field)
                for color_field in self.color_field_line_2_raw
            ]],
            name='Color_Field_Line_2_With_Shift')
        selection_field_line_0_raw, _ = create_selection_field_line(0)
        self.selection_field_line_1_raw, self.selection_field_line_1 = create_selection_field_line(
            1)
        self.selection_field_line_2_raw, self.selection_field_line_2 = create_selection_field_line(
            2)
        self.selection_field_lines_0_1_flattened = ButtonMatrixElement(
            rows=[
                selection_field_line_0_raw + self.selection_field_line_1_raw
            ],
            name='Selection_Field_Lines_0_1_Flattened')
        self.selection_field_line_1_with_shift = ButtonMatrixElement(
            rows=[[
                with_shift(field) for field in self.selection_field_line_1_raw
            ]],
            name='Selection_Field_Line_1_With_Shift')
        self.selection_field_line_2_with_shift = ButtonMatrixElement(
            rows=[[
                with_shift(field) for field in self.selection_field_line_2_raw
            ]],
            name='Selection_Field_Line_2_With_Shift')
        encoders = [
            EncoderElement(
                MIDI_CC_TYPE,
                DEFAULT_CHANNEL,
                21 + index,
                map_mode=Live.MidiMap.MapMode.relative_smooth_two_compliment,
                name=('Encoder_{}').format(index)) for index in xrange(8)
        ]
        for encoder in encoders:
            encoder.set_feedback_delay(1)

        self.encoders = ButtonMatrixElement(rows=[encoders], name='Encoders')
        self.encoder_color_fields = ButtonMatrixElement(
            rows=[[
                create_display_color_element(
                    index, 1, ('Encoder_Color_Field_{}').format(index))
                for index in xrange(8)
            ]],
            name='Encoder_Color_Fields')
コード例 #19
0
def create_sysex_element(header, index, name):
    return SysexElement(lambda value: header + (value, index, midi.SYSEX_END),
                        default_value=0,
                        optimized=True,
                        name=name)
コード例 #20
0
    def __init__(self, product_id=None, skin=None, *a, **k):
        super(Elements, self).__init__(*a, **k)
        self._product_id = product_id
        self._skin = skin
        volume_encoder_touch_elements = [ self._make_note_button(13, index, (b'Volume_Encoder_Touch_Element_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                        ]
        tui_volume_sliders = [ SliderElement(MIDI_CC_TYPE, index + 1, 0, name=(b'TUI_Volume_Slider_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                             ]
        for slider in tui_volume_sliders:
            slider.set_feedback_delay(1)

        physical_volume_encoders = [ TouchEncoderElement(MIDI_CC_TYPE, 13, index, Live.MidiMap.MapMode.relative_smooth_two_compliment, name=(b'Physical_Volume_Encoder_{}').format(index), touch_element=volume_encoder_touch_elements[index]) for index in xrange(NUM_TRACK_CONTROLS)
                                   ]
        for encoder in physical_volume_encoders:
            encoder.set_feedback_delay(1)

        self.volume_sliders = ButtonMatrixElement(rows=[
         [ MultiElement(tui_volume_sliders[index], physical_volume_encoders[index]) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Volume_Controls')
        self.pan_sliders = ButtonMatrixElement(rows=[
         [ SliderElement(MIDI_CC_TYPE, index + 1, 1, name=(b'TUI_Pan_Slider_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'TUI_Pan_Sliders')
        tui_device_controls = [ SliderElement(MIDI_CC_TYPE, 9, index, name=(b'TUI_Device_Control_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
                              ]
        for slider in tui_device_controls:
            slider.set_feedback_delay(1)

        self.tui_device_controls = ButtonMatrixElement(rows=[
         tui_device_controls], name=b'TUI_Device_Controls')
        self.physical_device_control_touch_elements = ButtonMatrixElement(rows=[
         [ self._make_note_button(13, index + 8, (b'Physical_Device_Control_Touch_Element_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'Physical_Device_Control_Touch_Elements')
        physical_device_controls = [ EncoderElement(MIDI_CC_TYPE, 13, index + 8, Live.MidiMap.MapMode.relative_smooth_two_compliment, name=(b'Physical_Device_Control_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
                                   ]
        for encoder in physical_device_controls:
            encoder.set_feedback_delay(1)

        self.physical_device_controls = ButtonMatrixElement(rows=[
         physical_device_controls], name=b'Physical_Device_Controls')
        self.device_parameter_enable_controls = ButtonMatrixElement(rows=[
         [ self._make_note_button(9, index + 112, (b'Device_Parameter_Enable_Control_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'Device_Parameter_Enable_Controls')
        self.solo_buttons_raw = [ MultiElement(self._make_note_button(index + 1, 0, (b'TUI_Solo_Button_{}').format(index)), name=(b'Solo_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                ]
        self.solo_buttons = ButtonMatrixElement(rows=[
         self.solo_buttons_raw], name=b'Solo_Buttons')
        self.mute_buttons_raw = [ MultiElement(self._make_note_button(index + 1, 1, (b'TUI_Mute_Button_{}').format(index)), name=(b'Mute_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                ]
        self.mute_buttons = ButtonMatrixElement(rows=[
         self.mute_buttons_raw], name=b'Mute_Buttons')
        self.solo_mute_buttons_raw = [ MultiElement(self._make_note_button(index + 1, 2, (b'TUI_Solo_Mute_Button_{}').format(index)), name=(b'Solo_Mute_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                     ]
        self.solo_mute_buttons = ButtonMatrixElement(rows=[
         self.solo_mute_buttons_raw], name=b'Solo_Mute_Buttons')
        self.arm_buttons_raw = [ MultiElement(self._make_note_button(index + 1, 5, (b'TUI_Arm_Button_{}').format(index)), name=(b'Arm_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                               ]
        self.arm_buttons = ButtonMatrixElement(rows=[
         self.arm_buttons_raw], name=b'Arm_Buttons')
        self.clip_stop_buttons_raw = [ MultiElement(self._make_note_button(0, index + 16, (b'Clip_Stop_TUI_Button_{}').format(index)), name=(b'Clip_Stop_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                     ]
        self.clip_stop_buttons = ButtonMatrixElement(rows=[
         self.clip_stop_buttons_raw], name=b'Clip_Stop_Buttons')
        self.stop_all_clips_button = MultiElement(self._make_note_button(12, 89, name=b'Physical_Stop_All_Clips_Button'), self._make_note_button(10, 20, name=b'TUI_Stop_All_Clips_Button'), name=b'Stop_All_Clips_Button')
        self.send_encoders = ButtonMatrixElement(rows=[ [ EncoderElement(MIDI_CC_TYPE, row_index + 1, col_index + 3, Live.MidiMap.MapMode.absolute, name=(b'TUI_Send_Encoder_{}_{}').format(row_index, col_index)) for col_index in xrange(MAX_NUM_SENDS) ] for row_index in xrange(NUM_TRACK_CONTROLS)
                                                      ], name=b'TUI_Send_Encoders')
        self.send_value_displays = ButtonMatrixElement(rows=[ [ self._create_text_display_element((1, row_index + col_index * NUM_TRACK_CONTROLS + 24), (b'Send_Value_Display_{}_{}').format(row_index, col_index)) for col_index in xrange(MAX_NUM_SENDS) ] for row_index in xrange(NUM_TRACK_CONTROLS)
                                                            ], name=b'Send_Value_Displays')
        self.track_type_controls = ButtonMatrixElement(rows=[
         [ self._make_note_button(0, index + 8, (b'Track_Type_Control_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Track_Type_Controls')
        self.mute_button = self._make_note_button(12, 100, b'Mute_Button')
        self.solo_button = self._make_note_button(12, 101, b'Solo_Button')
        self.rec_arm_button = self._make_note_button(12, 102, b'Rec_Arm_Button')
        self.clip_stop_button = self._make_note_button(12, 103, b'Clip_Stop_Button')
        self.meter_controls_left = ButtonMatrixElement(rows=[
         [ SliderElement(MIDI_CC_TYPE, index + 1, 124, send_should_depend_on_forwarding=False, name=(b'Output_Meter_Display_Left_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Output_Meter_Displays_Left')
        self.meter_controls_right = ButtonMatrixElement(rows=[
         [ SliderElement(MIDI_CC_TYPE, index + 1, 125, send_should_depend_on_forwarding=False, name=(b'Output_Meter_Display_Right_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Output_Meter_Displays_Right')
        self._tui_track_select_buttons_raw = [ self._make_note_button(0, index, (b'TUI_Track_Select_Button_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
                                             ]
        self.track_name_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((0, index), (b'Track_Name_Display_{}').index) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Track_Name_Display')
        self.num_sends_control = ButtonElement(True, MIDI_CC_TYPE, 1, 2, name=b'Num_Sends_Control', send_should_depend_on_forwarding=False)
        self.tui_track_color_controls = ButtonMatrixElement(rows=[
         [ ButtonElement(True, MIDI_CC_TYPE, 0, index + 16, skin=skin, name=(b'TUI_Track_Color_Control_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'TUI_Track_Color_Controls')
        self.oled_display_style_controls_bank_1 = ButtonMatrixElement(rows=[
         [ self._make_note_button(13, index + 16, (b'OLED_Display_Style_Control_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'OLED_Display_Style_Controls_Bank_1')
        self.oled_display_style_controls_bank_2 = ButtonMatrixElement(rows=[
         [ self._make_note_button(13, index + 24, (b'OLED_Display_Style_Control_{}').format(index + NUM_PARAM_CONTROLS)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'OLED_Display_Style_Controls_Bank_2')
        self.track_name_or_volume_value_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((18, index + 16), (b'Track_Name_Or_Volume_Value_Display_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Track_Name_Or_Volume_Value_Displays')
        self.device_parameter_name_or_value_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((18, index + 24), (b'Device_Parameter_Name_Or_Value_Display_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'Device_Parameter_Name_Or_Value_Displays')
        self.crossfade_assign_controls = ButtonMatrixElement(rows=[
         [ self._make_note_button(index + 1, 4, name=(b'Crossfade_Assign_Controk_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Crossfade_Assign_Controls')
        self.crossfader = SliderElement(MIDI_CC_TYPE, 13, 16, name=b'Crossfader')
        self.physical_clip_launch_buttons_raw = [ [ self._make_note_button(12, col_index + self.physical_clip_launch_button_id_offset + row_index * NUM_TRACK_CONTROLS, (b'Physical_Clip_Launch_Button_{}_{}').format(col_index, row_index)) for col_index in xrange(NUM_TRACK_CONTROLS) ] for row_index in xrange(NUM_SCENE_CONTROLS)
                                                ]
        self.clip_launch_buttons_raw = [ [ MultiElement(self._make_note_button(0, col_index + 24 + row_index * NUM_TRACK_CONTROLS, (b'TUI_Clip_Launch_Button_{}_{}').format(col_index, row_index)), name=(b'Clip_Launch_Button_{}_{}').format(col_index, row_index)) for col_index in xrange(NUM_TRACK_CONTROLS) ] for row_index in xrange(NUM_SCENE_CONTROLS)
                                       ]
        self.clip_launch_buttons = ButtonMatrixElement(rows=self.clip_launch_buttons_raw, name=b'Clip_Launch_Buttons')
        self.scene_launch_buttons = ButtonMatrixElement(rows=[
         [ self._make_note_button(0, index + 88, name=(b'TUI_Scene_Launch_Button_{}').format(index)) for index in xrange(NUM_SCENE_CONTROLS)
         ]], name=b'TUI_Scene_Launch_Buttons')
        self.clip_name_displays = ButtonMatrixElement(rows=[ [ self._create_text_display_element((0, row_index + 16 + col_index * NUM_SCENE_CONTROLS), (b'Clip_Name_Display_{}_{}').format(col_index, row_index)) for col_index in xrange(NUM_TRACK_CONTROLS) ] for row_index in xrange(NUM_SCENE_CONTROLS)
                                                           ])
        self.scene_name_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((0, index + 80), (b'Scene_Name_Display_{}').format(index)) for index in xrange(NUM_SCENE_CONTROLS)
         ]], name=b'Scene_Name_Displays')
        self.tui_scene_color_controls = ButtonMatrixElement(rows=[
         [ ButtonElement(True, MIDI_CC_TYPE, 0, index + 88, skin=skin, name=(b'TUI_Scene_Color_Control_{}').format(index)) for index in xrange(NUM_SCENE_CONTROLS)
         ]], name=b'TUI_Scene_Color_Controls')
        self.physical_clip_color_controls_raw = [ [ ButtonElement(True, MIDI_CC_TYPE, 12, row_index + self.pad_identifier_offset + col_index * NUM_SCENE_CONTROLS, skin=skin, name=(b'Physical_Clip_Color_Control_{}_{}').format(col_index, row_index)) for col_index in xrange(NUM_TRACK_CONTROLS) ] for row_index in xrange(NUM_SCENE_CONTROLS)
                                                ]
        self.clip_color_controls_raw = [ [ MultiElement(ButtonElement(True, MIDI_CC_TYPE, 0, row_index + 24 + col_index * NUM_SCENE_CONTROLS, skin=skin, name=(b'TUI_Clip_Color_Control_{}_{}').format(col_index, row_index)), name=(b'Clip_Color_Control_{}_{}').format(col_index, row_index)) for col_index in xrange(NUM_TRACK_CONTROLS) ] for row_index in xrange(NUM_SCENE_CONTROLS)
                                       ]
        self.clip_color_controls = ButtonMatrixElement(rows=self.clip_color_controls_raw, name=b'Clip_Color_Controls')
        self.playing_position_controls = ButtonMatrixElement(rows=[
         [ SliderElement(MIDI_CC_TYPE, 0, index, send_should_depend_on_forwarding=False, name=(b'Playing_Position_Control_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Playing_Position_Controls')
        self.shift_button = self._make_note_button(12, self.shift_button_id, b'Shift_Button', resource_type=PrioritizedResource)
        self.up_button = self._make_note_button(12, self.up_button_id, b'Up_Button')
        self.down_button = self._make_note_button(12, self.down_button_id, b'Down_Button')
        self.left_button = self._make_note_button(12, self.left_button_id, b'Left_Button')
        self.right_button = self._make_note_button(12, self.right_button_id, b'Right_Button')
        self.up_button_with_shift = ComboElement(self.up_button, modifier=[self.shift_button], name=b'Up_Button_With_Shift')
        self.down_button_with_shift = ComboElement(self.down_button, modifier=[self.shift_button], name=b'Down_Button_With_Shift')
        self.left_button_with_shift = ComboElement(self.left_button, modifier=[self.shift_button], name=b'Left_Button_With_Shift')
        self.right_button_with_shift = ComboElement(self.right_button, modifier=[
         self.shift_button], name=b'Right_Button_With_Shift')
        self.scene_selection_controls = ButtonMatrixElement(rows=[
         [ self._make_note_button(0, index + 96, (b'Scene_Selection_Control_{}').format(index)) for index in xrange(NUM_SCENE_CONTROLS)
         ]], name=b'Scene_Selection_Controls')
        self.duplicate_button = self._make_note_button(12, self.duplicate_button_id, b'Duplicate_Button')
        self.undo_button = self._make_note_button(12, self.undo_button_id, b'Undo_Button')
        self.redo_button = ComboElement(self.undo_button, modifier=[self.shift_button], name=b'Redo_Button')
        self.tui_device_parameter_name_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((2, index + 16), (b'TUI_Device_Parameter_Name_Display_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'TUI_Device_Parameter_Name_Displays')
        self.tui_device_parameter_value_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((2, index + 32), (b'TUI_Device_Parameter_Value_Display_{}').format(index)) for index in xrange(NUM_PARAM_CONTROLS)
         ]], name=b'TUI_Device_Parameter_Value_Displays')
        self.tui_arrangement_position_display = self._create_text_display_element((3,
                                                                                   16), b'TUI_Arrangement_Position_Display')
        self.tui_loop_start_display = self._create_text_display_element((3, 17), b'TUI_Loop_Start_Display')
        self.tui_loop_length_display = self._create_text_display_element((3, 18), b'TUI_Loop_Length_Display')
        self.tui_arrangement_position_control = EncoderElement(MIDI_CC_TYPE, 10, 0, Live.MidiMap.MapMode.relative_smooth_two_compliment, name=b'TUI_Arrangement_Position_Control')
        self.tui_loop_start_control = EncoderElement(MIDI_CC_TYPE, 10, 1, Live.MidiMap.MapMode.relative_smooth_two_compliment, name=b'TUI_Loop_Start_Control')
        self.tui_loop_length_control = EncoderElement(MIDI_CC_TYPE, 10, 2, Live.MidiMap.MapMode.relative_smooth_two_compliment, name=b'TUI_Loop_Length_Control')
        tempo_control_identifier = (3, 0)
        self.tempo_display = self._create_text_display_element(tempo_control_identifier, b'Tempo_Display')
        self.tempo_control = SysexElement(sysex_identifier=sysex.SYSEX_MSG_HEADER + (self._product_id, sysex.TEXT_MSG_TYPE) + tempo_control_identifier, name=b'Tempo_Control')
        self.play_button = self._make_note_button(12, self.play_button_id, b'Play_Button')
        self.stop_button = self._make_note_button(12, self.stop_button_id, b'Stop_Button')
        self.session_record_button = self._make_note_button(12, self.session_record_button_id, b'Session_Record_Button')
        self.tap_tempo_button = self._make_note_button(12, self.tap_tempo_button_id, b'Tap_Tempo_Button')
        self._tui_prev_device_button = self._make_note_button(9, 1, b'TUI_Prev_Device_Button')
        self._tui_next_device_button = self._make_note_button(9, 2, b'TUI_Next_Device_Button')
        self.device_lock_button = self._make_note_button(10, 10, b'Device_Lock_Button', is_momentary=False)
        self.num_devices_control = ButtonElement(True, MIDI_CC_TYPE, 9, 16, name=b'Num_Devices_Control')
        self.device_index_control = ButtonElement(True, MIDI_CC_TYPE, 9, 17, name=b'Device_Index_Control')
        self.device_name_display = self._create_text_display_element((2, 1), b'Device_Name_Display')
        self.device_enable_button = self._make_note_button(9, 0, b'Device_Enable_Button', is_momentary=False)
        self._tui_prev_bank_button = self._make_note_button(9, 3, b'TUI_Prev_Bank_Button')
        self._tui_next_bank_button = self._make_note_button(9, 4, b'TUI_Next_Bank_Button')
        self.device_bank_name_display = self._create_text_display_element((2, 0), b'Device_Bank_Name_Display')
        self._tui_phase_nudge_down_button = self._make_note_button(10, 12, b'TUI_Phase_Nudge_Down_Button')
        self._tui_phase_nudge_up_button = self._make_note_button(10, 13, b'TUI_Phase_Nudge_Up_Button')
        self.tui_metronome_button = self._make_note_button(10, 0, b'TUI_Metronome_Button', is_momentary=False)
        self.tui_automation_arm_button = self._make_note_button(10, 4, b'TUI_Automation_Arm_Button', is_momentary=False)
        self.loop_button = self._make_note_button(10, 5, b'Loop_Button', is_momentary=False)
        self.arrangement_overdub_button = self._make_note_button(10, 3, b'Arrangement_Overdub_Button', is_momentary=False)
        self.follow_song_button = self._make_note_button(10, 8, b'Follow_Song_Button', is_momentary=False)
        self.quantization_value_control = self._make_note_button(10, 15, b'Quantization_Value_Control')
        self._tui_quantize_button = self._make_note_button(10, 16, b'TUI_Quantize_Button')
        self.clip_trigger_quantization_control = self._make_note_button(10, 6, b'Clip_Trigger_Quantization_Control')
        self.delete_button = MultiElement(self._make_note_button(10, 14, b'TUI_Delete_Button'), self._make_note_button(12, self.delete_button_id, b'Physical_Delete_Button'), name=b'Delete_Button')
        self.volume_value_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((1, index), (b'Volume_Value_Display_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Volume_Value_Displays')
        self.pan_value_displays = ButtonMatrixElement(rows=[
         [ self._create_text_display_element((1, 16 + index), (b'Pan_Value_Display_{}').format(index)) for index in xrange(NUM_TRACK_CONTROLS)
         ]], name=b'Pan_Value_Displays')
        self.tui_arrangement_record_button = self._make_note_button(10, 22, b'TUI_Arrangement_Record_Button', False)
        self.insert_scene_button = self._make_note_button(10, 21, b'Insert_Scene_Button')
        self.launch_mode_switch = self._make_note_button(10, 23, b'Launch_Mode_Switch')
コード例 #21
0
    def __init__(self, *a, **k):
        super(Elements,
              self).__init__(arrow_button_identifiers=(80, 70, 91, 92),
                             session_mode_button_identifier=93,
                             *a,
                             **k)
        self._create_drum_pads()
        self._create_scale_pads()
        self._create_scale_feedback_switch()
        self.quantize_button = create_modifier_button(40, u'Quantize')
        self.duplicate_button = create_modifier_button(50, u'Duplicate')
        self.clear_button = create_modifier_button(60, u'Clear')
        self.shift_button = create_modifier_button(90, u'Shift')
        self.record_arm_button = create_button(1, u'Record_Arm_Button')
        self.mute_button = create_button(2, u'Mute_Button')
        self.solo_button = create_button(3, u'Solo_Button')
        self.volume_button = create_button(4, u'Volume_Button')
        self.pan_button = create_button(5, u'Pan_Button')
        self.sends_button = create_button(6, u'Sends_Button')
        self.device_button = create_button(7, u'Device_Button')
        self.stop_clip_button = create_button(8, u'Stop_Clip_Button')
        self.record_button = create_button(10, u'Record_Button')
        self.play_button = create_button(20, u'Play_Button')
        self.fixed_length_button = create_button(30, u'Fixed_Length_Button')
        self.track_select_buttons_raw = [
            create_button(index + 101, u'Track_Select_Button_{}'.format(index))
            for index in range(SESSION_WIDTH)
        ]
        self.track_select_buttons = ButtonMatrixElement(
            rows=[self.track_select_buttons_raw], name=u'Track_Select_Buttons')
        for bank, bank_name in enumerate(FADER_MODES):
            capitalized_name = bank_name.capitalize()
            control_elements_name = u'{}_button_faders'.format(bank_name)
            setattr(
                self, control_elements_name,
                ButtonMatrixElement(
                    rows=[[
                        create_slider(
                            index + bank * SESSION_WIDTH,
                            u'{}_Button_Fader_{}'.format(
                                capitalized_name, index))
                        for index in range(SESSION_WIDTH)
                    ]],
                    name=u'{}_Button_Faders'.format(capitalized_name)))
            color_elements_name = u'{}_button_fader_color_elements'.format(
                bank_name)
            setattr(
                self, color_elements_name,
                ButtonMatrixElement(rows=[[
                    create_button(index + bank * SESSION_WIDTH,
                                  u'{}_Button_Fader_Color_Element_{}'.format(
                                      capitalized_name, index),
                                  channel=BUTTON_FADER_COLOR_CHANNEL)
                    for index in range(SESSION_WIDTH)
                ]],
                                    name=u'{}_Button_Fader_Color_Elements'.
                                    format(capitalized_name)))

        def with_shift(button):
            return ComboElement(control=button,
                                modifier=self.shift_button,
                                name=u'{}_With_Shift'.format(button.name))

        self.track_select_buttons_with_shift = ButtonMatrixElement(
            rows=[[
                with_shift(button) for button in self.track_select_buttons_raw
            ]],
            name=u'Track_Select_Buttons_With_Shift')
        self.up_button_with_shift = with_shift(self.up_button)
        self.down_button_with_shift = with_shift(self.down_button)
        self.left_button_with_shift = with_shift(self.left_button)
        self.right_button_with_shift = with_shift(self.right_button)
        self.quantize_button_with_shift = with_shift(self.quantize_button)
        self.duplicate_button_with_shift = with_shift(self.duplicate_button)
        self.clear_button_with_shift = with_shift(self.clear_button)
        self.record_arm_button_with_shift = with_shift(self.record_arm_button)
        self.mute_button_with_shift = with_shift(self.mute_button)
        self.solo_button_with_shift = with_shift(self.solo_button)
        self.sends_button_with_shift = with_shift(self.sends_button)
        self.volume_button_with_shift = with_shift(self.volume_button)
        self.pan_button_with_shift = with_shift(self.pan_button)
        self.device_button_with_shift = with_shift(self.device_button)
        self.stop_clip_button_with_shift = with_shift(self.stop_clip_button)
        self.record_button_with_shift = with_shift(self.record_button)
        self.play_button_with_shift = with_shift(self.play_button)
        self.fixed_length_button_with_shift = with_shift(
            self.fixed_length_button)
        print_to_clip_identifier = sysex.STD_MSG_HEADER + (
            self.model_id, sysex.PRINT_COMMAND_BYTE)
        self.print_to_clip_element = SysexElement(
            name=u'Print_To_Clip_Element',
            sysex_identifier=print_to_clip_identifier,
            send_message_generator=lambda v: print_to_clip_identifier +
            (v, sysex.SYSEX_END_BYTE))
        self.print_to_clip_enabler_element = SysexElement(
            name=u'Print_To_Clip_Enabler',
            send_message_generator=lambda v: sysex.STD_MSG_HEADER +
            (self.model_id, sysex.PRINT_ENABLE_COMMAND_BYTE, v, sysex.
             SYSEX_END_BYTE),
            default_value=0)
        self.fader_setup_element = SysexElement(
            name=u'Fader_Setup_Element',
            send_message_generator=self._fader_setup_message_generator)
        self.stop_fader_element = SysexElement(
            name=u'Stop_Fader_Element',
            send_message_generator=self._stop_fader_message_generator,
            sysex_identifier=sysex.STD_MSG_HEADER +
            (self.model_id, sysex.STOP_FADER_COMMAND_BYTE))