class MatrixModesComponent(ModeSelectorComponent): ' SelectorComponent that assigns matrix to different functions ' __module__ = __name__ def __init__(self, matrix, session, zooming, stop_buttons, parent): assert isinstance(matrix, ButtonMatrixElement) ModeSelectorComponent.__init__(self) self._controls = None self._session = session self._session_zoom = zooming self._matrix = matrix self._track_stop_buttons = stop_buttons self._stop_button_matrix = ButtonMatrixElement( ) #new dummy matrix for stop buttons, to allow note mode/user mode switching button_row = [] for track_index in range(8): button = self._track_stop_buttons[track_index] button_row.append(button) self._stop_button_matrix.add_row(tuple(button_row)) self._nav_left_button = None self._nav_right_button = None self._mode_index = 0 self._last_mode = 0 self._parent = parent self._parent.set_pad_translations( PAD_TRANSLATIONS) #comment out to remove Drum Rack mapping self._vu = None self._shift_button = self._parent._shift_button self._shift_button.add_value_listener(self._shift_value) def disconnect(self): for button in self._modes_buttons: button.remove_value_listener(self._mode_value) self._controls = None self._session = None self._session_zoom = None self._matrix = None self._track_stop_buttons = None self._stop_button_matrix = None self._shift_button.remove_value_listener(self._shift_value) ModeSelectorComponent.disconnect(self) def set_mode( self, mode): #override ModeSelectorComponent set_mode, to avoid flickers assert isinstance(mode, int) assert (mode in range(self.number_of_modes())) if (self._mode_index != mode): self._last_mode = 0 # self._mode_index # keep track of previous mode, to allow refresh after Note Mode only self._mode_index = mode self._set_modes() def set_mode_buttons(self, buttons): assert isinstance(buttons, (tuple, type(None))) for button in self._modes_buttons: button.remove_value_listener(self._mode_value) self._modes_buttons = [] if (buttons != None): for button in buttons: assert isinstance(button, ButtonElement) identify_sender = True button.add_value_listener(self._mode_value, identify_sender) self._modes_buttons.append(button) for index in range(len(self._modes_buttons)): if (index == self._mode_index): self._modes_buttons[index].turn_on() else: self._modes_buttons[index].turn_off() def _mode_value(self, value, sender): assert (len(self._modes_buttons) > 0) assert isinstance(value, int) assert isinstance(sender, ButtonElement) assert (self._modes_buttons.count(sender) == 1) if self.is_enabled(): if ((value is not 0) or (not sender.is_momentary())): self.set_mode(self._modes_buttons.index(sender)) def number_of_modes(self): return 8 def update(self): pass def get_mode_index_value(self): return self._mode_index def _set_modes(self): if self.is_enabled(): if self._vu != None: self._vu.disconnect() self._session.set_allow_update(False) self._session_zoom.set_allow_update(False) assert (self._mode_index in range(self.number_of_modes())) for index in range(len(self._modes_buttons)): if (index == self._mode_index): self._modes_buttons[index].turn_on() else: self._modes_buttons[index].turn_off() self._session.set_stop_track_clip_buttons( tuple(self._track_stop_buttons)) for track_index in range(8): button = self._track_stop_buttons[track_index] button.use_default_message() button.set_enabled(True) button.set_force_next_value() button.send_value(0) self._session_zoom.set_enabled(True) self._session.set_enabled(True) self._session.set_show_highlight(True) self._session_zoom.set_zoom_button(self._parent._shift_button) for scene_index in range(5): scene = self._session.scene(scene_index) for track_index in range(8): button = self._matrix.get_button(track_index, scene_index) button.use_default_message() clip_slot = scene.clip_slot(track_index) clip_slot.set_launch_button(button) button.set_enabled(True) if (self._mode_index == 0): #Clip Launch self._session_zoom._on_zoom_value(1) #zoom out elif (self._mode_index == 1): #Session Overview self._session_zoom.set_zoom_button(None) self._session_zoom.set_enabled(True) self._session_zoom._is_zoomed_out = True self._session_zoom._scene_bank_index = int( ((self._session_zoom._session.scene_offset() / self._session_zoom._session.height()) / self._session_zoom._buttons.height())) self._session.set_enabled(False) self._session_zoom.update() elif (self._mode_index == 2): self._set_note_mode(PATTERN_1, CHANNEL_1, NOTEMAP_1, USE_STOP_ROW_1, IS_NOTE_MODE_1) elif (self._mode_index == 3): self._set_note_mode(PATTERN_2, CHANNEL_2, NOTEMAP_2, USE_STOP_ROW_2, IS_NOTE_MODE_2) elif (self._mode_index == 4): self._set_note_mode(PATTERN_3, CHANNEL_3, NOTEMAP_3, USE_STOP_ROW_3, IS_NOTE_MODE_3) elif (self._mode_index == 5): self._set_note_mode(PATTERN_4, CHANNEL_4, NOTEMAP_4, USE_STOP_ROW_4, IS_NOTE_MODE_4) elif (self._mode_index == 6): self._set_note_mode(PATTERN_5, CHANNEL_5, NOTEMAP_5, USE_STOP_ROW_5, IS_NOTE_MODE_5) elif (self._mode_index == 7): self._set_note_mode(PATTERN_6, CHANNEL_6, NOTEMAP_6, True, False) # VU Meters self._session.set_enabled(False) self._session_zoom._on_zoom_value(1) #zoom out self._session_zoom.set_enabled(True) self._session_zoom._is_zoomed_out = False self._session_zoom.set_zoom_button(self._parent._shift_button) self._session_zoom.update() self._update_vu_meters() else: pass self._session.set_allow_update(True) self._session_zoom.set_allow_update(True) #self._rebuild_callback() def _set_note_mode(self, pattern, channel, notemap, use_stop_row=False, is_note_mode=True): self._session_zoom.set_zoom_button(None) self._session_zoom.set_enabled(False) for scene_index in range(5): scene = self._session.scene(scene_index) for track_index in range(8): clip_slot = scene.clip_slot(track_index) button = self._matrix.get_button(track_index, scene_index) clip_slot.set_launch_button(None) button.set_channel( channel) #remap all Note Mode notes to new channel button.set_identifier(notemap[scene_index][track_index]) button.set_on_off_values(pattern[scene_index][track_index], 0) button.set_force_next_value() button.turn_on() if is_note_mode == True: button.set_enabled(False) if use_stop_row == True: self._session.set_stop_track_clip_buttons(None) for track_index in range(8): button = self._stop_button_matrix.get_button(track_index, 0) button.set_channel( channel) #remap all Note Mode notes to new channel button.set_identifier(notemap[5][track_index]) button.set_force_next_value() button.send_value(pattern[5][track_index]) if is_note_mode == True: button.set_enabled(False) else: for track_index in range(8): button = self._stop_button_matrix.get_button(track_index, 0) button.send_value(0, True) self._session.set_enabled(True) self._session.set_show_highlight(True) def _on_track_offset_changed(self): if (self.is_enabled() and self._mode_index == 7): self._update_vu_meters() def _shift_value(self, value): if (self.is_enabled() and self._mode_index == 7 and self._vu != None): if value != 0: self._vu.disconnect() self._vu.disable() else: self._update_vu_meters() self._vu.enable() def _update_vu_meters(self): if self._vu == None: self._vu = VUMeters(self._parent) else: self._vu.disconnect() self._vu.observe(int(self._session_zoom._session.track_offset()))
def _update_vu_meters(self): if self._vu == None: self._vu = VUMeters(self._parent) else: self._vu.disconnect() self._vu.observe(int(self._session_zoom._session.track_offset()))
class MatrixModesComponent(ModeSelectorComponent): ' SelectorComponent that assigns matrix to different functions ' __module__ = __name__ def __init__(self, matrix, session, zooming, stop_buttons, parent): assert isinstance(matrix, ButtonMatrixElement) ModeSelectorComponent.__init__(self) self._controls = None self._session = session self._session_zoom = zooming self._matrix = matrix self._track_stop_buttons = stop_buttons self._stop_button_matrix = ButtonMatrixElement() #new dummy matrix for stop buttons, to allow note mode/user mode switching button_row = [] for track_index in range(8): button = self._track_stop_buttons[track_index] button_row.append(button) self._stop_button_matrix.add_row(tuple(button_row)) self._nav_left_button = None self._nav_right_button = None self._mode_index = 0 self._last_mode = 0 self._parent = parent self._parent.set_pad_translations(PAD_TRANSLATIONS) #comment out to remove Drum Rack mapping self._vu = None self._shift_button = self._parent._shift_button self._shift_button.add_value_listener(self._shift_value) def disconnect(self): for button in self._modes_buttons: button.remove_value_listener(self._mode_value) self._controls = None self._session = None self._session_zoom = None self._matrix = None self._track_stop_buttons = None self._stop_button_matrix = None self._shift_button.remove_value_listener(self._shift_value) ModeSelectorComponent.disconnect(self) def set_mode(self, mode): #override ModeSelectorComponent set_mode, to avoid flickers assert isinstance(mode, int) assert (mode in range(self.number_of_modes())) if (self._mode_index != mode): self._last_mode = 0 # self._mode_index # keep track of previous mode, to allow refresh after Note Mode only self._mode_index = mode self._set_modes() def set_mode_buttons(self, buttons): assert isinstance(buttons, (tuple, type(None))) for button in self._modes_buttons: button.remove_value_listener(self._mode_value) self._modes_buttons = [] if (buttons != None): for button in buttons: assert isinstance(button, ButtonElement) identify_sender = True button.add_value_listener(self._mode_value, identify_sender) self._modes_buttons.append(button) for index in range(len(self._modes_buttons)): if (index == self._mode_index): self._modes_buttons[index].turn_on() else: self._modes_buttons[index].turn_off() def _mode_value(self, value, sender): assert (len(self._modes_buttons) > 0) assert isinstance(value, int) assert isinstance(sender, ButtonElement) assert (self._modes_buttons.count(sender) == 1) if self.is_enabled(): if ((value is not 0) or (not sender.is_momentary())): self.set_mode(self._modes_buttons.index(sender)) def number_of_modes(self): return 8 def update(self): pass def get_mode_index_value(self): return self._mode_index def _set_modes(self): if self.is_enabled(): if self._vu != None: self._vu.disconnect() self._session.set_allow_update(False) self._session_zoom.set_allow_update(False) assert (self._mode_index in range(self.number_of_modes())) for index in range(len(self._modes_buttons)): if (index == self._mode_index): self._modes_buttons[index].turn_on() else: self._modes_buttons[index].turn_off() self._session.set_stop_track_clip_buttons(tuple(self._track_stop_buttons)) for track_index in range(8): button = self._track_stop_buttons[track_index] button.use_default_message() button.set_enabled(True) button.set_force_next_value() button.send_value(0) self._session_zoom.set_enabled(True) self._session.set_enabled(True) self._session.set_show_highlight(True) self._session_zoom.set_zoom_button(self._parent._shift_button) for scene_index in range(5): scene = self._session.scene(scene_index) for track_index in range(8): button = self._matrix.get_button(track_index, scene_index) button.use_default_message() clip_slot = scene.clip_slot(track_index) clip_slot.set_launch_button(button) button.set_enabled(True) if (self._mode_index == 0): #Clip Launch self._session_zoom._on_zoom_value(1) #zoom out elif (self._mode_index == 1): #Session Overview self._session_zoom.set_zoom_button(None) self._session_zoom.set_enabled(True) self._session_zoom._is_zoomed_out = True self._session_zoom._scene_bank_index = int(((self._session_zoom._session.scene_offset() / self._session_zoom._session.height()) / self._session_zoom._buttons.height())) self._session.set_enabled(False) self._session_zoom.update() elif (self._mode_index == 2): self._set_note_mode(PATTERN_1, CHANNEL_1, NOTEMAP_1, USE_STOP_ROW_1, IS_NOTE_MODE_1) elif (self._mode_index == 3): self._set_note_mode(PATTERN_2, CHANNEL_2, NOTEMAP_2, USE_STOP_ROW_2, IS_NOTE_MODE_2) elif (self._mode_index == 4): self._set_note_mode(PATTERN_3, CHANNEL_3, NOTEMAP_3, USE_STOP_ROW_3, IS_NOTE_MODE_3) elif (self._mode_index == 5): self._set_note_mode(PATTERN_4, CHANNEL_4, NOTEMAP_4, USE_STOP_ROW_4, IS_NOTE_MODE_4) elif (self._mode_index == 6): self._set_note_mode(PATTERN_5, CHANNEL_5, NOTEMAP_5, USE_STOP_ROW_5, IS_NOTE_MODE_5) elif (self._mode_index == 7): self._set_note_mode(PATTERN_6, CHANNEL_6, NOTEMAP_6, True, False) # VU Meters self._session.set_enabled(False) self._session_zoom._on_zoom_value(1) #zoom out self._session_zoom.set_enabled(True) self._session_zoom._is_zoomed_out = False self._session_zoom.set_zoom_button(self._parent._shift_button) self._session_zoom.update() self._update_vu_meters() else: pass self._session.set_allow_update(True) self._session_zoom.set_allow_update(True) #self._rebuild_callback() def _set_note_mode(self, pattern, channel, notemap, use_stop_row = False, is_note_mode = True): self._session_zoom.set_zoom_button(None) self._session_zoom.set_enabled(False) for scene_index in range(5): scene = self._session.scene(scene_index) for track_index in range(8): clip_slot = scene.clip_slot(track_index) button = self._matrix.get_button(track_index, scene_index) clip_slot.set_launch_button(None) button.set_channel(channel) #remap all Note Mode notes to new channel button.set_identifier(notemap[scene_index][track_index]) button.set_on_off_values(pattern[scene_index][track_index], 0) button.set_force_next_value() button.turn_on() if is_note_mode == True: button.set_enabled(False) if use_stop_row == True: self._session.set_stop_track_clip_buttons(None) for track_index in range(8): button = self._stop_button_matrix.get_button(track_index, 0) button.set_channel(channel) #remap all Note Mode notes to new channel button.set_identifier(notemap[5][track_index]) button.set_force_next_value() button.send_value(pattern[5][track_index]) if is_note_mode == True: button.set_enabled(False) else: for track_index in range(8): button = self._stop_button_matrix.get_button(track_index, 0) button.send_value(0, True) self._session.set_enabled(True) self._session.set_show_highlight(True) def _on_track_offset_changed(self): if (self.is_enabled() and self._mode_index == 7): self._update_vu_meters() def _shift_value(self, value): if (self.is_enabled() and self._mode_index == 7 and self._vu != None): if value != 0: self._vu.disconnect() self._vu.disable() else: self._update_vu_meters() self._vu.enable() def _update_vu_meters(self): if self._vu == None: self._vu = VUMeters(self._parent) else: self._vu.disconnect() self._vu.observe( int(self._session_zoom._session.track_offset()) )
def _setup_device_and_transport_control(self): is_momentary = True device_bank_buttons = [] device_param_controls = [] bank_button_labels = ('Clip_Track_Button', 'Device_On_Off_Button', 'Previous_Device_Button', 'Next_Device_Button', 'Detail_View_Button', 'Rec_Quantization_Button', 'Midi_Overdub_Button', 'Metronome_Button') for index in range(8): device_bank_buttons.append( ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 58 + index)) device_bank_buttons[-1].name = bank_button_labels[index] ring_mode_button = ButtonElement(not is_momentary, MIDI_CC_TYPE, 0, 24 + index) ringed_encoder = RingedEncoderElement( MIDI_CC_TYPE, 0, 16 + index, Live.MidiMap.MapMode.absolute) ringed_encoder.set_ring_mode_button(ring_mode_button) ringed_encoder.name = 'Device_Control_' + str(index) ring_mode_button.name = ringed_encoder.name + '_Ring_Mode_Button' device_param_controls.append(ringed_encoder) device = ShiftableDeviceComponent() device.name = 'Device_Component' device.set_bank_buttons(tuple(device_bank_buttons)) device.set_shift_button(self._shift_button) device.set_parameter_controls(tuple(device_param_controls)) device.set_on_off_button(device_bank_buttons[1]) self.set_device_component(device) detail_view_toggler = DetailViewCntrlComponent(self) detail_view_toggler.name = 'Detail_View_Control' detail_view_toggler.set_shift_button(self._shift_button) detail_view_toggler.set_device_clip_toggle_button( device_bank_buttons[0]) detail_view_toggler.set_detail_toggle_button(device_bank_buttons[4]) detail_view_toggler.set_device_nav_buttons(device_bank_buttons[2], device_bank_buttons[3]) # VU Meters vu = VUMeters(self) transport = ShiftableTransportComponent() transport.name = 'Transport' play_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 91) stop_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 92) record_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 93) nudge_up_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 100) nudge_down_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 101) tap_tempo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 99) play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' record_button.name = 'Record_Button' nudge_up_button.name = 'Nudge_Up_Button' nudge_down_button.name = 'Nudge_Down_Button' tap_tempo_button.name = 'Tap_Tempo_Button' transport.set_shift_button(self._shift_button) transport.set_play_button(play_button) transport.set_stop_button(stop_button) transport.set_record_button(record_button) transport.set_nudge_buttons(nudge_up_button, nudge_down_button) transport.set_tap_tempo_button(tap_tempo_button) transport.set_quant_toggle_button(device_bank_buttons[5]) transport.set_overdub_button(device_bank_buttons[6]) transport.set_metronome_button(device_bank_buttons[7]) bank_button_translator = ShiftTranslatorComponent() bank_button_translator.set_controls_to_translate( tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
def _update_vu_meters(self): if self._vu == None: self._vu = VUMeters(self._parent) else: self._vu.disconnect() self._vu.observe( int(self._session_zoom._session.track_offset()) )