Exemple #1
0
 def _init_note_repeat(self):
     self._note_repeat = NoteRepeatComponent(name='Note_Repeat')
     self._note_repeat.set_enabled(False)
     self._note_repeat.set_note_repeat(self._c_instance.note_repeat)
     self._note_repeat.layer = Layer(
    # aftertouch_control=self._aftertouch_control, 
     select_buttons=self._stop_buttons, 
    # pad_parameters=self._pad_parameter_control
     )
     self._note_repeat.layer.priority = consts.DIALOG_PRIORITY
     self._note_repeat_enabler = EnablingModesComponent(name='Note_Repeat_Enabler', component=self._note_repeat, toggle_value='DefaultButton.Alert', disabled_value='DefaultButton.On')
     self._note_repeat_enabler.set_enabled(False)
     self._note_repeat_enabler.layer = Layer(toggle_button=self._bank_button) 
 def __init__(self, *a, **k):
     super(InstrumentScalesComponent, self).__init__(*a, **k)
     self._key_center_slots = self.register_slot_manager()
     self._key_center_buttons = []
     self._encoder_touch_button_slots = self.register_slot_manager()
     self._encoder_touch_buttons = []
     self._top_key_center_buttons = None
     self._bottom_key_center_buttons = None
     self._absolute_relative_button = None
     self._diatonic_chromatic_button = None
     table = consts.MUSICAL_MODES
     self._info_sources = map(DisplayDataSource,
                              ('Scale selection:', '', ''))
     self._line_sources = recursive_map(DisplayDataSource,
                                        (('', '', '', '', '', '', ''),
                                         ('', '', '', '', '', '', '')))
     self._modus_sources = map(
         partial(DisplayDataSource, adjust_string_fn=adjust_string_crop),
         ('', '', '', ''))
     self._presets = self.register_component(InstrumentPresetsComponent())
     self._presets_enabler = self.register_component(
         EnablingModesComponent(component=self._presets,
                                toggle_value='Scales.PresetsEnabled'))
     self._presets_enabler.momentary_toggle = True
     self._presets.selected_mode = 'scale_p4_vertical'
     self._modus_list = self.register_component(
         ListComponent(data_sources=self._modus_sources))
     self._modus_list.scrollable_list.fixed_offset = 1
     self._modus_list.scrollable_list.assign_items([
         Modus(name=table[i], notes=table[i + 1])
         for i in xrange(0, len(consts.MUSICAL_MODES), 2)
     ])
     self._on_selected_modus.subject = self._modus_list.scrollable_list
     self._update_data_sources()
 def __init__(self, *a, **k):
     super(SpecialSessionComponent, self).__init__(*a, **k)
     self._slot_launch_button = None
     self._duplicate_button = None
     self._duplicate = self.register_component(DuplicateSceneComponent(self))
     self._duplicate_enabler = self.register_component(EnablingModesComponent(component=self._duplicate))
     self._duplicate_enabler.momentary_toggle = True
     self._end_initialisation()
 def __init__(self, *a, **k):
     super(SpecialSessionComponent, self).__init__(*a, **k)
     self._slot_launch_button = None
     self._duplicate_button = None
     self._duplicate, self._paginator = self.register_components(DuplicateSceneComponent(self), ScrollComponent())
     self._duplicate_enabler = self.register_component(EnablingModesComponent(component=self._duplicate))
     self._duplicate_enabler.momentary_toggle = True
     self._paginator.can_scroll_up = self._can_scroll_page_up
     self._paginator.can_scroll_down = self._can_scroll_page_down
     self._paginator.scroll_up = self._scroll_page_up
     self._paginator.scroll_down = self._scroll_page_down
     self._track_playing_slots = self.register_slot_manager()
     self._end_initialisation()
Exemple #5
0
 def __init__(self, *a, **k):
     super(InstrumentComponent, self).__init__(*a, **k)
     self._scales = self.register_component(InstrumentScalesComponent())
     self._matrix = None
     self._delete_button = None
     self._first_note = self.page_length * 3 + self.page_offset
     self._last_page_length = self.page_length
     self._delete_button = None
     self._last_page_offset = self.page_offset
     self._detail_clip = None
     self._has_notes = [False] * 128
     self._has_notes_pattern = self._get_pattern(0)
     self._takeover_pads = False
     self._aftertouch_control = None
     self._scales_menu = self.register_component(EnablingModesComponent(component=self._scales, toggle_value='DefaultButton.On'))
     self._slider = self.register_component(SlideComponent(self))
     self._on_scales_changed.subject = self._scales
     self._on_scales_mode_changed.subject = self._scales._presets
     self._update_pattern()
Exemple #6
0
class APC40_MkII(APC, OptimizedControlSurface):
    def __init__(self, *a, **k):

        #pydevd.settrace('localhost', port=55983, stdoutToServer=True, stderrToServer=True)

        super(APC40_MkII, self).__init__(*a, **k)
        self._color_skin = make_rgb_skin()
        self._default_skin = make_default_skin()
        self._stop_button_skin = make_stop_button_skin()
        self._crossfade_button_skin = make_crossfade_button_skin()
        self._double_press_context = DoublePressContext()
        self._shift_button = None

        with self.component_guard():
            self._create_controls()
            self._create_bank_toggle()
            self._create_mixer()
            self._create_transport()
            self._create_view_control()
            self._create_quantization_selection()
            self._create_recording()

            self._skin = make_custom_skin()

            self._clip_creator = ClipCreator()

            self._init_background()
            self._init_instrument()
            self._init_step_sequencer()
            self._init_drum_component()
            self._init_note_repeat()
            self._create_session()
            self._session.set_mixer(self._mixer)

            self._init_matrix_modes()
            self._create_device()

            self.set_feedback_channels(FEEDBACK_CHANNELS)

        self.set_highlighting_session_component(self._session)
        self.set_device_component(self._device)

    def _with_shift(self, button):
        return ComboElement(button, modifiers=[self._shift_button])

    def _create_controls(self):
        make_on_off_button = partial(make_button, skin=self._default_skin)

        def make_color_button(*a, **k):
            button = make_button(skin=self._color_skin, *a, **k)
            button.is_rgb = True
            button.num_delayed_messages = 2
            return button

        def make_matrix_button(track, scene):
            return make_color_button(0,
                                     32 + track - NUM_TRACKS * scene,
                                     name='%d_Clip_%d_Button' % (track, scene))

        def make_stop_button(track, prior=False):
            butt = make_button(track,
                               52,
                               name='%d_Stop_Button' % track,
                               skin=self._stop_button_skin)

            if prior:
                butt.resource_type = PrioritizedResource

            return butt

        self._shift_button = make_button(0,
                                         98,
                                         name='Shift_Button',
                                         resource_type=PrioritizedResource)
        self._bank_button = make_on_off_button(0, 103, name='Bank_Button')
        self._left_button = make_button(0, 97, name='Bank_Select_Left_Button')
        self._right_button = make_button(0,
                                         96,
                                         name='Bank_Select_Right_Button')
        self._up_button = make_button(0, 94, name='Bank_Select_Up_Button')
        self._down_button = make_button(0, 95, name='Bank_Select_Down_Button')

        self._stop_buttons_raw = [
            make_stop_button(track) for track in xrange(NUM_TRACKS)
        ]
        self._stop_buttons = ButtonMatrixElement(rows=[self._stop_buttons_raw])

        self._shifted_stop_buttons = ButtonMatrixElement(rows=[[
            self._with_shift(button) for button in self._stop_buttons_raw
        ]])

        self._stop_all_button = make_button(0,
                                            81,
                                            name='Stop_All_Clips_Button')
        self._scene_launch_buttons_raw = [
            make_color_button(0,
                              scene + 82,
                              name='Scene_%d_Launch_Button' % scene)
            for scene in xrange(NUM_SCENES)
        ]
        self._scene_launch_buttons = ButtonMatrixElement(
            rows=[self._scene_launch_buttons_raw])
        self._matrix_rows_raw = [[
            make_matrix_button(track, scene) for track in xrange(NUM_TRACKS)
        ] for scene in xrange(NUM_SCENES)]
        self._session_matrix = ButtonMatrixElement(rows=self._matrix_rows_raw)
        self._pan_button = make_on_off_button(
            0, 87, name='Pan_Button', resource_type=PrioritizedResource)
        self._sends_button = make_on_off_button(
            0, 88, name='Sends_Button', resource_type=PrioritizedResource)
        self._user_button = make_on_off_button(
            0, 89, name='User_Button', resource_type=PrioritizedResource)
        self._mixer_encoders = ButtonMatrixElement(rows=[[
            make_ring_encoder(
                48 + track, 56 + track, name='Track_Control_%d' % track)
            for track in xrange(NUM_TRACKS)
        ]])
        self._volume_controls = ButtonMatrixElement(rows=[[
            make_slider(track, 7, name='%d_Volume_Control' % track)
            for track in xrange(NUM_TRACKS)
        ]])
        self._master_volume_control = make_slider(0,
                                                  14,
                                                  name='Master_Volume_Control')
        self._prehear_control = make_encoder(0,
                                             47,
                                             name='Prehear_Volume_Control')
        self._crossfader_control = make_slider(0, 15, name='Crossfader')
        self._raw_select_buttons = [
            make_on_off_button(channel, 51, name='%d_Select_Button' % channel)
            for channel in xrange(NUM_TRACKS)
        ]
        self._arm_buttons = ButtonMatrixElement(rows=[[
            make_on_off_button(channel, 48, name='%d_Arm_Button' % channel)
            for channel in xrange(NUM_TRACKS)
        ]])
        self._solo_buttons = ButtonMatrixElement(rows=[[
            make_on_off_button(channel, 49, name='%d_Solo_Button' % channel)
            for channel in xrange(NUM_TRACKS)
        ]])
        self._mute_buttons = ButtonMatrixElement(rows=[[
            make_on_off_button(channel, 50, name='%d_Mute_Button' % channel)
            for channel in xrange(NUM_TRACKS)
        ]])
        self._crossfade_buttons = ButtonMatrixElement(rows=[[
            make_button(channel,
                        66,
                        name='%d_Crossfade_Button' % channel,
                        skin=self._crossfade_button_skin)
            for channel in xrange(NUM_TRACKS)
        ]])
        self._select_buttons = ButtonMatrixElement(
            rows=[self._raw_select_buttons])
        self._master_select_button = make_on_off_button(
            channel=0, identifier=80, name='Master_Select_Button')
        self._send_select_buttons = ButtonMatrixElement(rows=[[
            ComboElement(button, modifiers=[self._sends_button])
            for button in self._raw_select_buttons
        ]])
        self._quantization_buttons = ButtonMatrixElement(rows=[[
            ComboElement(button, modifiers=[self._shift_button])
            for button in self._raw_select_buttons
        ]])
        self._metronome_button = make_on_off_button(0,
                                                    90,
                                                    name='Metronome_Button')
        self._play_button = make_on_off_button(0, 91, name='Play_Button')
        self._record_button = make_on_off_button(0, 93, name='Record_Button')
        self._session_record_button = make_on_off_button(
            0, 102, name='Session_Record_Button')
        self._nudge_down_button = make_button(0, 100, name='Nudge_Down_Button')
        self._nudge_up_button = make_button(0, 101, name='Nudge_Up_Button')
        self._tap_tempo_button = make_button(0, 99, name='Tap_Tempo_Button')
        self._tempo_control = make_encoder(0, 13, name='Tempo_Control')
        self._device_controls = ButtonMatrixElement(rows=[[
            make_ring_encoder(16 + index,
                              24 + index,
                              handler=self.value_changed,
                              name='Device_Control_%d' % index)
            for index in xrange(8)
        ]])

        self._device_control_buttons_raw = [
            make_on_off_button(0, 58 + index) for index in xrange(8)
        ]
        self._device_bank_buttons = ButtonMatrixElement(rows=[[
            DeviceBankButtonElement(button, modifiers=[self._shift_button])
            for button in self._device_control_buttons_raw
        ]])
        self._device_prev_bank_button = self._device_control_buttons_raw[2]
        self._device_prev_bank_button.name = 'Device_Prev_Bank_Button'
        self._device_next_bank_button = self._device_control_buttons_raw[3]
        self._device_next_bank_button.name = 'Device_Next_Bank_Button'
        self._device_on_off_button = self._device_control_buttons_raw[4]
        self._device_on_off_button.name = 'Device_On_Off_Button'
        self._device_lock_button = self._device_control_buttons_raw[5]
        self._device_lock_button.name = 'Device_Lock_Button'
        self._prev_device_button = self._device_control_buttons_raw[0]
        self._prev_device_button.name = 'Prev_Device_Button'
        self._next_device_button = self._device_control_buttons_raw[1]
        self._next_device_button.name = 'Next_Device_Button'
        self._clip_device_button = self._device_control_buttons_raw[6]
        self._clip_device_button.name = 'Clip_Device_Button'
        self._detail_view_button = self._device_control_buttons_raw[7]
        self._detail_view_button.name = 'Detail_View_Button'
        self._foot_pedal_button = DoublePressElement(
            make_pedal_button(64, name='Foot_Pedal'))
        self._shifted_matrix = ButtonMatrixElement(
            rows=recursive_map(self._with_shift, self._matrix_rows_raw))
        self._shifted_scene_buttons = ButtonMatrixElement(rows=[[
            self._with_shift(button)
            for button in self._scene_launch_buttons_raw
        ]])

        self._grid_resolution = GridResolution()
        self._velocity_slider = ButtonSliderElement(
            tuple(self._scene_launch_buttons_raw[::-1]))
        #self._velocity_slider.resource_type = PrioritizedResource
        double_press_rows = recursive_map(DoublePressElement,
                                          self._matrix_rows_raw)
        self._double_press_matrix = ButtonMatrixElement(
            name='Double_Press_Matrix', rows=double_press_rows)
        self._double_press_event_matrix = ButtonMatrixElement(
            name='Double_Press_Event_Matrix',
            rows=recursive_map(lambda x: x.double_press, double_press_rows))
        self._playhead = PlayheadElement(self._c_instance.playhead)

    def _create_bank_toggle(self):
        self._bank_toggle = BankToggleComponent(
            is_enabled=False,
            layer=Layer(bank_toggle_button=self._bank_button))

    def _create_session(self):
        def when_bank_on(button):
            return self._bank_toggle.create_toggle_element(on_control=button)

        def when_bank_off(button):
            return self._bank_toggle.create_toggle_element(off_control=button)

        self._session = CustomSessionComponent(
            NUM_TRACKS,
            NUM_SCENES,
            auto_name=True,
            is_enabled=False,
            enable_skinning=True,
            layer=Layer(
                track_bank_left_button=when_bank_off(self._left_button),
                track_bank_right_button=when_bank_off(self._right_button),
                scene_bank_up_button=when_bank_off(self._up_button),
                scene_bank_down_button=when_bank_off(self._down_button),
                page_left_button=when_bank_on(self._left_button),
                page_right_button=when_bank_on(self._right_button),
                page_up_button=when_bank_on(self._up_button),
                page_down_button=when_bank_on(self._down_button),
                stop_track_clip_buttons=self._stop_buttons,
                stop_all_clips_button=self._stop_all_button,
                scene_launch_buttons=self._scene_launch_buttons,
                clip_launch_buttons=self._session_matrix))

        clip_color_table = Colors.LIVE_COLORS_TO_MIDI_VALUES.copy()
        clip_color_table[16777215] = 119
        self._session.set_rgb_mode(clip_color_table, Colors.RGB_COLOR_TABLE)
        self._session_zoom = SessionZoomingComponent(
            self._session,
            name='Session_Overview',
            enable_skinning=True,
            is_enabled=False,
            layer=Layer(button_matrix=self._shifted_matrix,
                        nav_left_button=self._with_shift(self._left_button),
                        nav_right_button=self._with_shift(self._right_button),
                        nav_up_button=self._with_shift(self._up_button),
                        nav_down_button=self._with_shift(self._down_button),
                        scene_bank_buttons=self._shifted_scene_buttons))
        self._session.set_delete_button(self._nudge_down_button)
        self._session.set_copy_button(self._nudge_up_button)

    def _create_mixer(self):
        self._mixer = MixerComponent(
            NUM_TRACKS,
            auto_name=True,
            is_enabled=False,
            invert_mute_feedback=True,
            layer=Layer(volume_controls=self._volume_controls,
                        arm_buttons=self._arm_buttons,
                        solo_buttons=self._solo_buttons,
                        mute_buttons=self._mute_buttons,
                        shift_button=self._shift_button,
                        track_select_buttons=self._select_buttons,
                        prehear_volume_control=self._with_shift(
                            self._prehear_control),
                        crossfader_control=self._crossfader_control,
                        crossfade_buttons=self._crossfade_buttons))
        self._mixer.master_strip().layer = Layer(
            volume_control=self._master_volume_control,
            select_button=self._master_select_button)
        self._encoder_mode = ModesComponent(name='Encoder_Mode',
                                            is_enabled=False)
        self._encoder_mode.default_behaviour = ImmediateBehaviour()
        self._encoder_mode.add_mode('pan', [
            AddLayerMode(self._mixer, Layer(pan_controls=self._mixer_encoders))
        ])
        self._encoder_mode.add_mode('sends', [
            AddLayerMode(self._mixer,
                         Layer(send_controls=self._mixer_encoders)),
            DelayMode(
                AddLayerMode(
                    self._mixer,
                    Layer(send_select_buttons=self._send_select_buttons)))
        ])
        self._encoder_mode.add_mode('user', [
            AddLayerMode(self._mixer,
                         Layer(user_controls=self._mixer_encoders))
        ])
        self._encoder_mode.layer = Layer(pan_button=self._pan_button,
                                         sends_button=self._sends_button,
                                         user_button=self._user_button)
        self._encoder_mode.selected_mode = 'pan'

    def _create_transport(self):
        self._transport = TransportComponent(
            name='Transport',
            is_enabled=False,
            layer=Layer(
                shift_button=self._shift_button,
                play_button=self._play_button,
                stop_button=ComboElement(self._play_button,
                                         modifiers=[self._shift_button]),
                record_button=self._record_button,
                metronome_button=self._with_shift(self._tap_tempo_button),
                tap_tempo_button=self._tap_tempo_button,
                nudge_down_button=self._with_shift(self._nudge_down_button),
                nudge_up_button=self._with_shift(self._nudge_up_button),
                tempo_encoder=self._tempo_control),
            play_toggle_model_transform=lambda v: v)

    def _create_device(self):
        self._device = DeviceComponent(
            name=u'Device',
            is_enabled=False,
            layer=Layer(parameter_controls=self._device_controls,
                        bank_buttons=self._device_bank_buttons,
                        bank_prev_button=self._device_prev_bank_button,
                        bank_next_button=self._device_next_bank_button,
                        on_off_button=self._device_on_off_button,
                        lock_button=self._device_lock_button),
            device_selection_follows_track_selection=True)

    def _create_view_control(self):
        self._view_control = DetailViewCntrlComponent(
            name='View_Control',
            is_enabled=False,
            layer=Layer(device_nav_left_button=self._prev_device_button,
                        device_nav_right_button=self._next_device_button,
                        device_clip_toggle_button=self._clip_device_button,
                        detail_toggle_button=self._detail_view_button))
        self._view_control.device_clip_toggle_button.pressed_color = 'DefaultButton.On'

    def _create_quantization_selection(self):
        self._quantization_selection = QuantizationComponent(
            name='Quantization_Selection',
            is_enabled=False,
            layer=Layer(quantization_buttons=self._quantization_buttons))

    def _create_recording(self):
        record_button = MultiElement(self._session_record_button,
                                     self._foot_pedal_button.single_press)
        self._session_recording = SessionRecordingComponent(
            ClipCreator(),
            self._view_control,
            name='Session_Recording',
            is_enabled=False,
            layer=Layer(new_button=self._foot_pedal_button.double_press,
                        record_button=record_button,
                        _uses_foot_pedal=self._foot_pedal_button))

    def get_matrix_button(self, column, row):
        return self._matrix_rows_raw[row][column]

    def _product_model_id_byte(self):
        return 41

    def _init_background(self):
        self._background = BackgroundComponent(is_root=True)
        self._background.set_enabled(False)
        self._background.layer = Layer(
            stop_buttons=self._stop_buttons
        )  # , display_line2=self._display_line2, display_line3=self._display_line3, display_line4=self._display_line4, top_buttons=self._select_buttons, bottom_buttons=self._track_state_buttons, scales_button=self._scale_presets_button, octave_up=self._octave_up_button, octave_down=self._octave_down_button, side_buttons=self._side_buttons, repeat_button=self._repeat_button, accent_button=self._accent_button, double_button=self._double_button, in_button=self._in_button, out_button=self._out_button, param_controls=self._global_param_controls, param_touch=self._global_param_touch_buttons, tempo_control_tap=self._tempo_control_tap, master_control_tap=self._master_volume_control_tap, touch_strip=self._touch_strip_control, touch_strip_tap=self._touch_strip_tap, nav_up_button=self._nav_up_button, nav_down_button=self._nav_down_button, nav_left_button=self._nav_left_button, nav_right_button=self._nav_right_button, aftertouch=self._aftertouch_control, pad_parameters=self._pad_parameter_control, _notification=self._notification.use_single_line(2), priority=consts.BACKGROUND_PRIORITY)

        self._matrix_background = BackgroundComponent()
        self._matrix_background.set_enabled(False)
        self._matrix_background.layer = Layer(matrix=self._session_matrix)

        self._mod_background = ModifierBackgroundComponent(is_root=True)
        self._mod_background.layer = Layer(shift_button=self._shift_button)

    def _init_step_sequencer(self):
        self._step_sequencer = StepSeqComponent(
            grid_resolution=self._grid_resolution)
        self._step_sequencer.layer = self._create_step_sequencer_layer()

    def _create_step_sequencer_layer(self):
        return Layer(
            velocity_slider=self._velocity_slider,
            drum_matrix=self._session_matrix.submatrix[:4, 0:5],
            # [4, 1:5],  mess with this for possible future 32 pad drum rack :
            button_matrix=self._double_press_matrix.submatrix[
                4:8, 0:4],  # [4:8, 1:5],

            #  next_page_button = self._bank_button,

            #select_button=self._user_button,
            delete_button=self._stop_all_button,
            playhead=self._playhead,
            quantization_buttons=self._stop_buttons,
            shift_button=self._shift_button,
            loop_selector_matrix=self._double_press_matrix.submatrix[4:8, 4],
            # changed from [:8, :1] so as to enable bottem row of rack   . second value clip length rows
            short_loop_selector_matrix=self._double_press_event_matrix.
            submatrix[4:8, 4],
            # changed from [:8, :1] no change noticed as of yet
            drum_bank_up_button=self._up_button,
            drum_bank_down_button=self._down_button)

    #       capture_button = self._tap_tempo_button)

    def _init_drum_component(self):
        self._drum_component = DrumGroupComponent(name='Drum_Group',
                                                  is_enabled=False)
        self._drum_component.layer = Layer(
            drum_matrix=self._session_matrix,
            #    page_strip=self._touch_strip_control,
            #    scroll_strip=self._with_shift(self._touch_strip_control),
            #    solo_button=self._global_solo_button,
            #select_button=self._metronome_button,
            #    delete_button=self._delete_button,
            scroll_page_up_button=self._up_button,
            scroll_page_down_button=self._down_button,
            #    quantize_button=self._quantize_button,
            #    mute_button=self._global_mute_button,
            scroll_up_button=self._with_shift(self._up_button),
            scroll_down_button=self._with_shift(self._down_button))

    #    self._drum_component.select_drum_pad = self._selector.on_select_drum_pad
    #    self._drum_component.quantize_pitch = self._quantize.quantize_pitch

    def _init_instrument(self):
        instrument_basic_layer = Layer(
            # octave_strip=self._with_shift(self._touch_strip_control),
            #   capture_button = self._tap_tempo_button,
            #scales_toggle_button=self._metronome_button,
            octave_up_button=self._up_button,
            octave_down_button=self._down_button,
            scale_up_button=self._with_shift(self._up_button),
            scale_down_button=self._with_shift(self._down_button))

        self._instrument = MelodicComponent(
            skin=self._skin,
            is_enabled=False,
            clip_creator=self._clip_creator,
            name='Melodic_Component',
            grid_resolution=self._grid_resolution,
            note_editor_settings=self._add_note_editor_setting(),
            layer=self._create_instrument_layer(),
            instrument_play_layer=Layer(
                octave_up_button=self._up_button,
                octave_down_button=self._down_button,
                scale_up_button=self._with_shift(self._up_button),
                scale_down_button=self._with_shift(self._down_button),
                matrix=self._session_matrix),
            # touch_strip=self._touch_strip_control, touch_strip_indication=self._with_firmware_version(1, 16, ComboElement(self._touch_strip_control, modifiers=[self._select_button])),
            # touch_strip_toggle=self._with_firmware_version(1, 16, ComboElement(self._touch_strip_tap, modifiers=[self._select_button])),
            # aftertouch_control=self._aftertouch_control, delete_button=self._delete_button),
            instrument_sequence_layer=
            instrument_basic_layer  # + Layer(note_strip=self._touch_strip_control)
        )
        self._on_note_editor_layout_changed.subject = self._instrument

    def _create_instrument_layer(self):
        return Layer(
            playhead=self._playhead,
            velocity_slider=self._velocity_slider,
            # mute_button=self._global_mute_button,
            quantization_buttons=self._stop_buttons,
            loop_selector_matrix=self._double_press_matrix.submatrix[
                0:8, 0],  # [:, 0]
            short_loop_selector_matrix=self._double_press_event_matrix.
            submatrix[0:8, 0],  # [:, 0]
            #note_editor_matrices=ButtonMatrixElement(
            #    [[self._session_matrix.submatrix[:, 4 - row] for row in xrange(7)]]))
            note_editor_matrices=ButtonMatrixElement([[
                self._session_matrix.submatrix[:8, 4 - row]
                for row in xrange(4)
            ]]))

    def enter_note_mode_layout(self):
        self._matrix_modes.selected_mode = 'user'
        self._select_note_mode()

        #if self._user_modes.selected_mode == 'instrument':
        #    self._instrument._set_selected_mode(self._instrument.selected_mode)
        #el
        if self._user_modes.selected_mode == 'drums':
            self._drum_modes._set_selected_mode(self._drum_modes.selected_mode)

        self.reset_controlled_track()

    def exit_note_mode_layout(self):
        self.reset_controlled_track()

    def switch_note_mode_layout(self):
        self._matrix_modes.selected_mode = 'user'
        self._select_note_mode()

        #if self._user_modes.selected_mode == 'instrument':
        #   getattr(self._instrument, 'cycle_mode', nop)()
        #el
        if self._user_modes.selected_mode == 'drums':
            getattr(self._drum_modes, 'cycle_mode', nop)()

        self.reset_controlled_track()

    def _init_matrix_modes(self):
        """ Switch between Session and StepSequencer modes """
        """here we go trying to switch.... lew  05:53   21/10/17"""

        self._auto_arm = AutoArmComponent(name='Auto_Arm')

        self._matrix_modes = ModesComponent(name='Matrix_Modes', is_root=True)
        self._matrix_modes.default_behaviour = ImmediateBehaviour()
        self._matrix_modes.add_mode(
            'disable',
            [self._matrix_background, self._background, self._mod_background])
        self._matrix_modes.add_mode('sends', self._session_mode_layers())

        self._matrix_modes.add_mode('user', self._user_mode_layers())
        self._matrix_modes.add_mode('user2', self._user2_mode_layers())

        self._matrix_modes.add_mode('session', self._session_mode_layers())

        #self._matrix_modes.add_mode('user', [self._user_modes], behaviour=CustomReenterBehaviour(on_reenter=self.switch_note_mode_layout, on_enter=self.enter_note_mode_layout))

        #self._matrix_modes.add_mode('user', [self._drum_group_finder, self._view_control, self._user_modes],
        #                           behaviour=self._auto_arm.auto_arm_restore_behaviour(ReenterBehaviour,
        #                                                                               on_reenter=self.switch_note_mode_layout))

        self._matrix_modes.layer = Layer(session_button=self._pan_button,
                                         sends_button=self._sends_button,
                                         user_button=self._user_button,
                                         user2_button=self._metronome_button)

        self._on_matrix_mode_changed.subject = self._matrix_modes
        self._matrix_modes.selected_mode = 'session'

        #self._disable_mode = ModesComponent(name='Disable_Mode', is_enabled=False)
        #self._disable_mode.add_mode('disable', [self._matrix_background, self._background])

    def _session_mode_layers(self):
        return [self._session, self._view_control,
                self._session_zoom]  #, self._mixer

    def _user_mode_layers(self):
        self._drum_group_finder = DrumGroupFinderComponent()
        self._on_drum_group_changed.subject = self._drum_group_finder

        self._drum_modes = ModesComponent(name='Drum_Modes', is_enabled=False)
        self._drum_modes.add_mode('sequencer', self._step_sequencer)
        #self._drum_modes.add_mode('64pads', self._drum_component)  # added 15:18 subday 22/10/17     can maybe look into this. causes issues when trying to scroll.(drumcomp1)

        self._drum_modes.selected_mode = 'sequencer'

        #self._user_modes = ModesComponent(name='User_Modes', is_enabled=False)
        #self._user_modes.add_mode('drums', [self._drum_modes])
        #self._user_modes.add_mode('instrument', [self._note_repeat_enabler, self._instrument])
        #self._user_modes.selected_mode = 'drums'

        return [self._drum_modes, self._view_control,
                self._matrix_background]  # , self._mixer

    def _user2_mode_layers(self):

        self._user_modes = ModesComponent(name='Instrument_Modes',
                                          is_enabled=False)
        #self._user_modes.add_mode('drums', [self._drum_modes])
        self._user_modes.add_mode(
            'instrument', [self._note_repeat_enabler, self._instrument])
        self._user_modes.selected_mode = 'instrument'

        return [self._user_modes, self._view_control,
                self._matrix_background]  # , self._mixer

    def _init_note_repeat(self):
        self._note_repeat = NoteRepeatComponent(name='Note_Repeat')
        self._note_repeat.set_enabled(False)
        self._note_repeat.set_note_repeat(self._c_instance.note_repeat)
        self._note_repeat.layer = Layer(
            # aftertouch_control=self._aftertouch_control,
            select_buttons=self._shifted_stop_buttons
            # pad_parameters=self._pad_parameter_control
        )
        self._note_repeat.layer.priority = consts.DIALOG_PRIORITY
        self._note_repeat_enabler = EnablingModesComponent(
            name='Note_Repeat_Enabler',
            component=self._note_repeat,
            toggle_value='DefaultButton.Alert',
            disabled_value='DefaultButton.On')
        self._note_repeat_enabler.set_enabled(False)
        self._note_repeat_enabler.layer = Layer(
            toggle_button=self._with_shift(self._bank_button))

    def _select_note_mode(self):
        """
        Selects which note mode to use depending on the kind of
        current selected track and its device chain...
        """
        track = self.song().view.selected_track
        drum_device = self._drum_group_finder.drum_group
        self._step_sequencer.set_drum_group_device(drum_device)
        self._drum_component.set_drum_group_device(drum_device)
        if track == None or track.is_foldable or track in self.song(
        ).return_tracks or track == self.song(
        ).master_track or track.is_frozen:
            self._user_modes.selected_mode = 'disabled'
        elif track and track.has_audio_input:
            self._user_modes.selected_mode = 'disabled'
            #self._note_modes.selected_mode = 'looper'
        elif drum_device:
            self._user_modes.selected_mode = 'drums'
        #else:
        #    self._user_modes.selected_mode = 'instrument'
        #self.reset_controlled_track()

    @subject_slot('value')
    def value_changed(self, value):
        print('value_changed')
        print(value)
        '''if self.is_enabled() and not self._device_mode:
            if value > 0 or not self._bank_down_button.is_momentary():
                new_mode = max(self._mode_index - 1, 0)
                self.set_mode(new_mode)'''

    @subject_slot('drum_group')
    def _on_drum_group_changed(self):
        #self._shift_button.receive_value(127)
        #self.schedule_message(1, self.resetshift)
        self._matrix_background.set_enabled(True)
        self.schedule_message(1, self.disablebackground)

        if self._matrix_modes.selected_mode != 'session':
            pass
            #self._select_note_mode()

    def resetshift(self):
        self._shift_button.receive_value(0)

    def shiftmodedisable(self):
        self._matrix_modes.selected_mode = 'disabled'

    def disablebackground(self):
        self._matrix_background.set_enabled(False)

    @subject_slot('selected_mode')
    def _on_matrix_mode_changed(self, mode):
        #self._shift_button.receive_value(127)
        #self.schedule_message(1, self.resetshift)
        self._matrix_background.set_enabled(True)
        self.schedule_message(1, self.disablebackground)

        if self._matrix_modes.selected_mode != 'disabled':
            self._update_auto_arm(selected_mode=mode)
            self.reset_controlled_track()
        '''

        #if self._matrix_modes.selected_mode != mode and mode != 'session':
        #    self._select_note_mode()
        if mode == None:
            return

        if mode != 'disabled' and self.holdMode != mode:

            if mode != 'disabled':
                self.holdMode = mode
                self.schedule_message(3, self.shiftmode)

            else:
                self.holdMode = None

            #if self._matrix_modes.selected_mode != mode and self._matrix_modes.selected_mode == 'user':
            #    self._step_sequencer.set_enabled(False)

            #if self._matrix_modes.selected_mode != mode and mode == 'session':
            #    self._session.set_enabled(True)

                #self._disable_mode.selected_mode = 'disable'
                #self._session.set_enabled(True)

            if self._matrix_modes.selected_mode != 'disabled':
                self._update_auto_arm(selected_mode=mode)
                self.reset_controlled_track()

        else:
            if self._matrix_modes.selected_mode != self.holdMode:
                self.schedule_message(1, self.shiftmodehold)
            else:
                if self._matrix_modes.selected_mode != 'disabled':
                    self._update_auto_arm(selected_mode=mode)
                    self.reset_controlled_track()'''

    def _update_auto_arm(self, selected_mode=None):
        self._auto_arm.set_enabled(
            selected_mode or self._matrix_modes.selected_mode == 'user')

    @subject_slot('selected_mode')
    def _on_note_editor_layout_changed(self, mode):
        pass
        #self.reset_controlled_track(mode)

    def reset_controlled_track(self, mode=None):
        #if mode == None:
        #   mode = self._instrument.selected_mode
        #if self._instrument and self._instrument.is_enabled() and mode == 'sequence':
        #    self.release_controlled_track()
        #else:
        self.set_controlled_track(self.song().view.selected_track)

    def _add_note_editor_setting(self):
        return NoteEditorSettingsComponent(
            self._grid_resolution,
            Layer(initial_encoders=self._mixer_encoders),
            Layer(encoders=self._mixer_encoders))

    @contextmanager
    def component_guard(self):
        """ Customized to inject additional things """
        with super(APC40_MkII, self).component_guard():

            with self.make_injector().everywhere():
                yield

    def make_injector(self):
        """ Adds some additional stuff to the injector, used in BaseMessenger """
        return inject(double_press_context=const(self._double_press_context),
                      control_surface=const(self),
                      log_message=const(self.log_message))
Exemple #7
0
class PHAZE(APC40_MkII):
  """ APC40Mk2 script with step sequencer mode """
  def __init__(self, *a, **k):
    self._double_press_context = DoublePressContext()
    APC40_MkII.__init__(self, *a, **k)
    with self.component_guard():
      self._skin = make_default_skin()
  #    self._create_session()
      self._clip_creator = ClipCreator()
      self._init_background()
      self._init_step_sequencer()
      self._init_drum_component()
      self._init_instrument()
      self._init_note_repeat()
      self._init_matrix_modes() 
      self._create_device()
#      self._create_view_control()
      self._on_selected_track_changed()
    
    self.set_pad_translations(PAD_TRANSLATIONS)
    self.set_feedback_channels(FEEDBACK_CHANNELS)

  
  
  def _create_controls(self):
    """ Add some additional stuff baby """
    super(PHAZE, self)._create_controls()
    self._grid_resolution = GridResolution()
    self._velocity_slider = ButtonSliderElement(tuple(self._scene_launch_buttons_raw[::-1])) 
    double_press_rows = recursive_map(DoublePressElement, self._matrix_rows_raw) 
    self._double_press_matrix = ButtonMatrixElement(name='Double_Press_Matrix', rows=double_press_rows)
    self._double_press_event_matrix = ButtonMatrixElement(name='Double_Press_Event_Matrix', rows=recursive_map(lambda x: x.double_press, double_press_rows))
    self._playhead = PlayheadElement(self._c_instance.playhead)

    # Make these prioritized resources, which share between Layers() equally
    # Rather than building a stack
 
    """not sure but we greened out below on 05/11/17.. maybe work on order of definitions so as to tidy up some"""
 
    self._pan_button._resource_type = PrioritizedResource 
    self._user_button._resource_type = PrioritizedResource 
    
#    self._view_control = ViewControlComponent(name='View_Control')
#    self._view_control.set_enabled(False)
 

#  def _create_session(self):
      
#      def when_bank_on(button):
#        return self._bank_toggle.create_toggle_element(on_control=button)
    
#      def when_bank_off(button):
#        return self._bank_toggle.create_toggle_element(off_control=button)      
      
      
      
      
 #     self._session = SessionComponent(NUM_TRACKS, NUM_SCENES, 
 #     auto_name=True, is_enabled=False, enable_skinning=True, 
 #     layer=Layer(track_bank_left_button=when_bank_off(self._left_button), 
 #     track_bank_right_button=when_bank_off(self._right_button), 
 #     scene_bank_up_button=when_bank_off(self._up_button), 
 #     scene_bank_down_button=when_bank_off(self._down_button), 
 #     page_left_button=when_bank_on(self._left_button), 
 #     page_right_button=when_bank_on(self._right_button), 
 #     page_up_button=when_bank_on(self._up_button), 
 #     page_down_button=when_bank_on(self._down_button), 
 #     stop_track_clip_buttons=self._stop_buttons, 
 #     stop_all_clips_button=self._stop_all_button, 
 #     scene_launch_buttons=self._scene_launch_buttons, 
 #     clip_launch_buttons=self._session_matrix))
 #     clip_color_table = colors.CLIP_COLOR_TABLE.copy()
 #     clip_color_table[16777215] = 119
 #     self._session.set_rgb_mode(clip_color_table, colors.RGB_COLOR_TABLE)
 #     self._session_zoom = SessionZoomingComponent(self._session, name=u'Session_Overview', enable_skinning=True, is_enabled=False, layer=Layer(button_matrix=self._shifted_matrix, nav_left_button=self._with_shift(self._left_button), nav_right_button=self._with_shift(self._right_button), nav_up_button=self._with_shift(self._up_button), nav_down_button=self._with_shift(self._down_button), scene_bank_buttons=self._shifted_scene_buttons))
  
  
  
#  def _init_session(self):
#      self._session_mode = LazyEnablingMode(self._create_session)  
  
  
  def _create_device(self):
      self._device = DeviceComponent(name=u'Device', is_enabled=False, layer=Layer(parameter_controls=self._device_controls, bank_buttons=self._device_bank_buttons, bank_prev_button=self._device_prev_bank_button, bank_next_button=self._device_next_bank_button, on_off_button=self._device_on_off_button, lock_button=self._device_lock_button), device_selection_follows_track_selection=True)
  
  
  def _create_view_control(self):
      self._view_control = DetailViewCntrlComponent(name=u'View_Control', is_enabled=False, layer=Layer(device_nav_left_button=self._prev_device_button, device_nav_right_button=self._next_device_button, device_clip_toggle_button=self._clip_device_button, detail_toggle_button=self._detail_view_button))
      self._view_control.device_clip_toggle_button.pressed_color = u'DefaultButton.On'  
  
 
  def _init_background(self):
      self._background = BackgroundComponent(is_root=True)
      self._background.layer = Layer(velocity_slider = self._velocity_slider, stop_buttons = self._stop_buttons)#, display_line2=self._display_line2, display_line3=self._display_line3, display_line4=self._display_line4, top_buttons=self._select_buttons, bottom_buttons=self._track_state_buttons, scales_button=self._scale_presets_button, octave_up=self._octave_up_button, octave_down=self._octave_down_button, side_buttons=self._side_buttons, repeat_button=self._repeat_button, accent_button=self._accent_button, double_button=self._double_button, in_button=self._in_button, out_button=self._out_button, param_controls=self._global_param_controls, param_touch=self._global_param_touch_buttons, tempo_control_tap=self._tempo_control_tap, master_control_tap=self._master_volume_control_tap, touch_strip=self._touch_strip_control, touch_strip_tap=self._touch_strip_tap, nav_up_button=self._nav_up_button, nav_down_button=self._nav_down_button, nav_left_button=self._nav_left_button, nav_right_button=self._nav_right_button, aftertouch=self._aftertouch_control, pad_parameters=self._pad_parameter_control, _notification=self._notification.use_single_line(2), priority=consts.BACKGROUND_PRIORITY)
      self._matrix_background = BackgroundComponent()
      self._matrix_background.set_enabled(False)
      self._matrix_background.layer = Layer(matrix=self._session_matrix)
    #  self._mod_background = ModifierBackgroundComponent(is_root=True)
    #  self._mod_background.layer = Layer(shift_button=self._shift_button, velocity_slider = self._velocity_slider, stop_buttons = self._stop_buttons)
 
 
  def _init_step_sequencer(self):
    self._step_sequencer = StepSeqComponent(grid_resolution = self._grid_resolution)
    self._step_sequencer.layer = self._create_step_sequencer_layer()
  
 
 
  """added sunday PM  05/11/17"""
 
 
  def _init_note_repeat(self):
      self._note_repeat = NoteRepeatComponent(name='Note_Repeat')
      self._note_repeat.set_enabled(False)
      self._note_repeat.set_note_repeat(self._c_instance.note_repeat)
      self._note_repeat.layer = Layer(
     # aftertouch_control=self._aftertouch_control, 
      select_buttons=self._stop_buttons, 
     # pad_parameters=self._pad_parameter_control
      )
      self._note_repeat.layer.priority = consts.DIALOG_PRIORITY
      self._note_repeat_enabler = EnablingModesComponent(name='Note_Repeat_Enabler', component=self._note_repeat, toggle_value='DefaultButton.Alert', disabled_value='DefaultButton.On')
      self._note_repeat_enabler.set_enabled(False)
      self._note_repeat_enabler.layer = Layer(toggle_button=self._bank_button) 
 
 
  """added sunday PM 15:25 22/10/17"""
  
  def _init_drum_component(self):
    self._drum_component = DrumGroupComponent(name='Drum_Group', is_enabled=False)
    self._drum_component.layer = Layer(
    drum_matrix=self._session_matrix, 
#    page_strip=self._touch_strip_control, 
#    scroll_strip=self._with_shift(self._touch_strip_control), 
#    solo_button=self._global_solo_button, 
    select_button=self._metronome_button, 
#    delete_button=self._delete_button, 
    scroll_page_up_button=self._up_button, 
    scroll_page_down_button=self._down_button, 
#    quantize_button=self._quantize_button, 
#    mute_button=self._global_mute_button, 
    scroll_up_button=self._with_shift(self._up_button), 
    scroll_down_button=self._with_shift(self._down_button))
    
#    self._drum_component.select_drum_pad = self._selector.on_select_drum_pad
#    self._drum_component.quantize_pitch = self._quantize.quantize_pitch



  
  """lew sunday"""
  def _init_instrument(self):
    instrument_basic_layer = Layer(
    #octave_strip=self._with_shift(self._touch_strip_control), 
   # scales_toggle_button=self._tap_tempo_button, 
    
 #   capture_button = self._tap_tempo_button,
    octave_up_button=self._up_button, octave_down_button=self._down_button, 
    scale_up_button=self._with_shift(self._up_button), 
    scale_down_button=self._with_shift(self._down_button))
    self._instrument = MelodicComponent(skin=self._skin, is_enabled=False, 
    clip_creator=self._clip_creator, name='Melodic_Component', 
    grid_resolution=self._grid_resolution, 
    #note_editor_settings=self._add_note_editor_setting(), 
    layer=self._create_instrument_layer(), instrument_play_layer=instrument_basic_layer + Layer(matrix=self._session_matrix), 
    #touch_strip=self._touch_strip_control, touch_strip_indication=self._with_firmware_version(1, 16, ComboElement(self._touch_strip_control, modifiers=[self._select_button])), 
    #touch_strip_toggle=self._with_firmware_version(1, 16, ComboElement(self._touch_strip_tap, modifiers=[self._select_button])), 
    #aftertouch_control=self._aftertouch_control, delete_button=self._delete_button), 
    instrument_sequence_layer=instrument_basic_layer)# + Layer(note_strip=self._touch_strip_control))
    self._on_note_editor_layout_changed.subject = self._instrument



  def _init_matrix_modes(self):
    """ Switch between Session and StepSequencer modes """
    
 
 
   
    """here we go trying to switch.... lew  05:53   21/10/17"""
    
    self._auto_arm = AutoArmComponent(name='Auto_Arm')
    
    self._drum_group_finder = DrumGroupFinderComponent()
    self._on_drum_group_changed.subject = self._drum_group_finder
    
    
    self._drum_modes = ModesComponent(name='Drum_Modes', is_enabled=False)
    self._drum_modes.add_mode('sequencer', self._step_sequencer)   
    self._drum_modes.add_mode('64pads', self._drum_component)                                     # added 15:18 subday 22/10/17     can maybe look into this. causes issues when trying to scroll.(drumcomp1)
    
    self._drum_modes.selected_mode = 'sequencer'
   
    self._note_modes = ModesComponent(name='Note_Modes')#, is_enabled=False)
    self._note_modes.add_mode('drums', [self._note_repeat_enabler, self._drum_modes])
    self._drum_modes.selected_mode = 'sequencer'
    self._note_modes.add_mode('looper', self._audio_loop if consts.PROTO_AUDIO_NOTE_MODE else self._matrix_background)
    self._note_modes.add_mode('instrument', [self._note_repeat_enabler, self._instrument])
    self._note_modes.add_mode('disabled', self._matrix_background)
    self._note_modes.selected_mode = 'disabled'    
    self._note_modes.set_enabled(False)
    
    
    
    def switch_note_mode_layout():
      self._matrix_modes.selected_mode = 'note'

      if self._note_modes.selected_mode == 'instrument':
        getattr(self._instrument, 'cycle_mode', nop)()
      elif self._note_modes.selected_mode == 'drums':
        getattr(self._drum_modes, 'cycle_mode', nop)()    
    
    
    self._matrix_modes = ModesComponent(name='Matrix_Modes', is_root=True)
    self._matrix_modes.add_mode('session', self._session_mode_layers())
    self._matrix_modes.add_mode('note', [self._drum_group_finder, self._view_control, self._note_modes],behaviour=self._auto_arm.auto_arm_restore_behaviour(ReenterBehaviour, on_reenter=switch_note_mode_layout))
    
    self._matrix_modes.selected_mode = 'note'
    self._matrix_modes.layer = Layer(session_button=self._pan_button, note_button=self._user_button)
    
    self._on_matrix_mode_changed.subject = self._matrix_modes   
    self._matrix_modes.selected_mode = 'note'


    #added for looping capability
    #self._looper = LooperComponent(self)               
    #self._looper.name = 'looper_Component'    
    
  
  def _session_mode_layers(self):
    return [ self._session, self._session_zoom]

  def _create_step_sequencer_layer(self):
    return Layer(
        velocity_slider = self._velocity_slider,
        drum_matrix = self._session_matrix.submatrix[:4, 1:5],  # [4, 1:5],  mess with this for possible future 32 pad drum rack :
     

        button_matrix = self._double_press_matrix.submatrix[4:8, 1:5],   # [4:8, 1:5],
        
      #  next_page_button = self._bank_button,
        
        select_button = self._user_button,
        delete_button = self._stop_all_button,
        playhead = self._playhead,
        quantization_buttons = self._stop_buttons,
        shift_button = self._shift_button,
        loop_selector_matrix = self._double_press_matrix.submatrix[:4, :1],                # changed from [:8, :1] so as to enable bottem row of rack   . second value clip length rows
        short_loop_selector_matrix = self._double_press_event_matrix.submatrix[:4, :1],     # changed from [:8, :1] no change noticed as of yet   
        drum_bank_up_button = self._up_button,
        drum_bank_down_button = self._down_button)
 #       capture_button = self._tap_tempo_button)
        
  
  """lew sunday"""
  
  def _create_instrument_layer(self):
    return Layer(
      playhead=self._playhead, 
      #mute_button=self._global_mute_button, 
      quantization_buttons=self._stop_buttons, 
      loop_selector_matrix=self._double_press_matrix.submatrix[:8, :1],# [:, 0]
      short_loop_selector_matrix=self._double_press_event_matrix.submatrix[:, 0],# [:, 0]
      note_editor_matrices=ButtonMatrixElement([[ self._session_matrix.submatrix[:, 4 - row] for row in xrange(7) ]]))
      #note_editor_matrices=ButtonMatrixElement([[ self._session_matrix.submatrix[:, 7 - row] for row in xrange(7) ]]))
  
  
  def _session_layer(self):
    def when_bank_on(button):
      return self._bank_toggle.create_toggle_element(on_control=button)
    def when_bank_off(button):
      return self._bank_toggle.create_toggle_element(off_control=button)
    return Layer(
      track_bank_left_button = when_bank_off(self._left_button), 
      track_bank_right_button = when_bank_off(self._right_button), 
      scene_bank_up_button = when_bank_off(self._up_button), 
      scene_bank_down_button = when_bank_off(self._down_button), 
      page_left_button = when_bank_on(self._left_button), 
      page_right_button = when_bank_on(self._right_button), 
      page_up_button = when_bank_on(self._up_button), 
      page_down_button = when_bank_on(self._down_button), 
    #  stop_track_clip_buttons = self._stop_buttons,
      stop_all_clips_button = self._stop_all_button, 
      scene_launch_buttons = self._scene_launch_buttons, 
      clip_launch_buttons = self._session_matrix)

  def _session_zoom_layer(self):
    return Layer(button_matrix=self._shifted_matrix, 
      nav_left_button=self._with_shift(self._left_button), 
      nav_right_button=self._with_shift(self._right_button), 
      nav_up_button=self._with_shift(self._up_button), 
      nav_down_button=self._with_shift(self._down_button), 
      scene_bank_buttons=self._shifted_scene_buttons)

  
  @subject_slot('selected_mode')
  def _on_matrix_mode_changed(self, mode):
      self._update_auto_arm(selected_mode=mode)  
  
  
  def _update_auto_arm(self, selected_mode = None):
      self._auto_arm.set_enabled(selected_mode or self._matrix_modes.selected_mode == 'note')  
  
  
  @subject_slot('drum_group')
  def _on_drum_group_changed(self):
      self._select_note_mode()


  def _select_note_mode(self):
    """
    Selects which note mode to use depending on the kind of
    current selected track and its device chain...
    """
    track = self.song().view.selected_track
    drum_device = self._drum_group_finder.drum_group
    self._step_sequencer.set_drum_group_device(drum_device)
    self._drum_component.set_drum_group_device(drum_device)
    if track == None or track.is_foldable or track in self.song().return_tracks or track == self.song().master_track or track.is_frozen:
      self._note_modes.selected_mode = 'disabled'
    elif track and track.has_audio_input:
      self._note_modes.selected_mode = 'looper'
    elif drum_device:
      self._note_modes.selected_mode = 'drums'
    else:
      self._note_modes.selected_mode = 'instrument'
    self.reset_controlled_track()


  # added so as to have looping with pan_button held
#    self._select_modes = SelectComponent(self, tuple(self._raw_select_buttons), self._metronome_button, self._nudge_down_button, self._nudge_up_button, self._tap_tempo_button, self._transport, self._looper, self._session, self._session_matrix) 
#    self._select_modes.name = 'Select_Modes'
#    self._select_modes.set_mode_toggle(self._pan_button)  
  
  
  
  # commented to test 0:47 
  
  # EVENT HANDLING FUNCTIONS
 # def reset_controlled_track(self):
   # self.set_controlled_track(self.song().view.selected_track)
  
  
  
  """lew sunday"""


  @subject_slot('selected_mode')
  def _on_note_editor_layout_changed(self, mode):
      self.reset_controlled_track(mode)  
  
  
  def reset_controlled_track(self, mode = None):
    if mode == None:
      mode = self._instrument.selected_mode
    if self._instrument.is_enabled() and mode == 'sequence':
      self.release_controlled_track()
    else:
      self.set_controlled_track(self.song().view.selected_track)  
  
  
  
  def update(self):
    self.reset_controlled_track()
    self.set_feedback_channels(FEEDBACK_CHANNELS)  # push added line
    super(PHAZE, self).update()

  
  
  def _on_selected_track_changed(self):
      super(PHAZE, self)._on_selected_track_changed()
      self.reset_controlled_track()
      self._select_note_mode()
  #    self._main_modes.pop_groups(['add_effect'])
      self._note_repeat_enabler.selected_mode = 'disabled'  
  
  
  
  @contextmanager
  def component_guard(self):
    """ Customized to inject additional things """
    with super(PHAZE, self).component_guard():
      with self.make_injector().everywhere():
        yield

  def make_injector(self):
    """ Adds some additional stuff to the injector, used in BaseMessenger """
    return inject(
      double_press_context = const(self._double_press_context),
      control_surface = const(self),
     
      log_message = const(self.log_message))