def _setup_transport(self): rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 27) ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 28) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 29) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 30) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 31) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 32) ffwd_button.name = 'FFwd_Button' rwd_button.name = 'Rwd_Button' loop_button.name = 'Loop_Button' play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' rec_button.name = 'Record_Button' self._transport = ShiftableTransportComponent(self.c_instance, self._session, self, ffwd_button, rwd_button) self._transport.name = 'Transport' self._transport.set_stop_buttonOnInit(stop_button) self._transport.set_play_button(play_button) self._transport.set_record_buttonOnInit(rec_button) # self._transport.set_shift_button(self._shift_button) self._transport.set_mixer9_button(self._button9) self._transport_view_modes = TransportViewModeSelector( self.c_instance, self._transport, self._session, ffwd_button, rwd_button, loop_button) self._transport_view_modes.name = 'Transport_View_Modes'
def _setup_transport_and_session(self): ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 115) rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 114) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 113) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 117) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 116) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 118) ffwd_button.name = "FFwd_Button" rwd_button.name = "Rwd_Button" loop_button.name = "Loop_Button" play_button.name = "Play_Button" stop_button.name = "Stop_Button" rec_button.name = "Record_Button" transport = ShiftableTransportComponent() transport.name = "Transport" transport.set_shift_button(self._shift_button) transport.set_stop_button(stop_button) transport.set_play_button(play_button) transport.set_record_button(rec_button) pads = [] for index in range(len(PAD_TRANSLATIONS)): pads.append(ButtonElement(IS_MOMENTARY, MIDI_NOTE_TYPE, 15, PAD_TRANSLATIONS[index][2])) pads[-1].name = "Pad_" + str(index) self._session = ShiftableSessionComponent(8, 0) self._session.name = "Session_Control" self._session.selected_scene().name = "Selected_Scene" self._session.set_mixer(self._mixer) self._session.set_shift_button(self._shift_button) self._session.set_clip_slot_buttons(tuple(pads)) transport_view_modes = TransportViewModeSelector(transport, self._session, ffwd_button, rwd_button, loop_button) transport_view_modes.name = "Transport_View_Modes"
def _setup_transport(self): rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 27) ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 28) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 29) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 30) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 31) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 32) ffwd_button.name = 'FFwd_Button' rwd_button.name = 'Rwd_Button' loop_button.name = 'Loop_Button' play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' rec_button.name = 'Record_Button' transport = ShiftableTransportComponent() transport.name = 'Transport' transport.set_stop_button(stop_button) transport.set_play_button(play_button) transport.set_record_button(rec_button) transport.set_shift_button(self._shift_button) self._transport_view_modes = TransportViewModeSelector(transport, self._session, ffwd_button, rwd_button, loop_button) self._transport_view_modes.name = 'Transport_View_Modes'
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() 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]) 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 _setup_transport_control(self): is_momentary = True # We'll only be using momentary buttons here transport = ShiftableTransportComponent() #Instantiate a Transport Component #addtransport = AddlTransportComponent() #Instantiate an AddlTransport Component device_param_controls = [] #effects_knob_cc = [16,20,24,28,17,21,25,29] effects_knob_cc = [17,21,25,29,18,22,26,30] device = DeviceComponent() for index in range(8): device_param_controls.append(EncoderElement(MIDI_CC_TYPE, CHAN, effects_knob_cc[index], Live.MidiMap.MapMode.absolute)) device.set_parameter_controls(tuple(device_param_controls)) #self.set_device_component(device) #from apc device_bank_buttons = [] #device_param_controls = [] #device_buttons =[16,20,24,28,17,21,25,29]; device_buttons =[17,21,25,29,18,22,26,30]; 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', 'Device_Lock_Button') #'Metronome_Button') for index in range(8): device_bank_buttons.append(ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, device_buttons[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.name = 'Device_Component' device.set_bank_buttons(tuple(device_bank_buttons)) detail_view_toggler = DetailViewCntrlComponent() detail_view_toggler.name = 'Detail_View_Control' detail_view_toggler.set_device_clip_toggle_button(device_bank_buttons[0]) device.set_on_off_button(device_bank_buttons[1]) detail_view_toggler.set_device_nav_buttons(device_bank_buttons[2], device_bank_buttons[3]) detail_view_toggler.set_detail_toggle_button(device_bank_buttons[4]) device.set_lock_button(device_bank_buttons[7]) #assign device lock to bank_button 8 (in place of metronome)... self.set_device_component(device) #detail_view_toggler.set_shift_button(self._shift_button) #from apc self._shift_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 37) """set up the buttons""" play_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 24) #ButtonElement(is_momentary, msg_type, channel, identifier) Note that the MIDI_NOTE_TYPE constant is defined in the InputControlElement module stop_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 28) record_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 32) nudge_up_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 27) nudge_down_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 23) # tap_tempo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 19) redo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 19) undo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 20) 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' redo_button.name = 'Redo_Button' undo_button.name = 'Undo_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) #addtransport.set_undo_button(undo_button) #addtransport.set_redo_button(redo_button) transport.set_tap_tempo_button(nudge_up_button) #shifted nudge 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]) #transport.set_tempo_encoder(self.prehear_control) #shifted prehear bank_button_translator = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
def _setup_transport_control(self): Live.Base.log("LOG: AAATransport _setup_transport_control start") is_momentary = True # We'll only be using momentary buttons here transport = ShiftableTransportComponent() #Instantiate a AAATransport Component """set up the buttons""" transport.set_loop_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, CYCLE)) #OK transport.set_nudge_buttons(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, FF), ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, RWD)) #(up_button, down_button) #OK transport.set_punch_buttons(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, ARM[1]), ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, ARM[0])) #(in_button, out_button) #OK transport.set_seek_buttons(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, MUTE[1]), ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, MUTE[0])) # (ffwd_button, rwd_button) #OK transport.set_stop_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, STOP)) #OK transport.set_play_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, PLAY)) #ButtonElement(is_momentary, msg_type, channel, identifier) Note that the MIDI_CC_TYPE constant is defined in the InputControlElement module #OK transport.set_record_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, REC)) #OK transport.set_tap_tempo_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[0])) #OK transport.set_metronome_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[1])) #For some reason, in Ver 7.x.x this method's name has no trailing "e" , and must be called as "set_metronom_button()"... #OK transport.set_arrangement_overdub_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[2])) #OK transport.set_overdub_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[3])) #OK #transport.set_session_overdub_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, 35)) #OK """set up the sliders""" transport.set_tempo_control(SliderElement(MIDI_CC_TYPE, CHANNEL, FADER[0]), SliderElement(MIDI_CC_TYPE, CHANNEL, PAN[0])) #(control, fine_control)#OK transport.set_song_position_control(SliderElement(MIDI_CC_TYPE, CHANNEL, PAN[1]))#OK #REDO, UNDO, SHIFT, BTS transport.set_transport_shift_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SET)) #OK transport.set_undo_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, MARKER_LEFT)) transport.set_redo_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, MARKER_RIGHT)) transport.set_bts_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[4])) transport.set_back_to_arranger_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[5])) transport.set_follow_button(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, SOLO[6])) transport.set_tempo_buttons(ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, TRACK_LEFT), ButtonElement(is_momentary, MIDI_CC_TYPE, CHANNEL, TRACK_RIGHT)) #(in_button, out_button) transport.set_launch_quant_slider(SliderElement(MIDI_CC_TYPE, CHANNEL, PAN[2])) transport.set_record_quant_slider(SliderElement(MIDI_CC_TYPE, CHANNEL, PAN[3])) Live.Base.log("LOG: AAATransport _setup_transport_control end")
class Novation_Impulse2(ControlSurface): """ Script for Novation's Impulse keyboards """ def __init__(self, c_instance): ControlSurface.__init__(self, c_instance) self.c_instance = c_instance with self.component_guard(): self.set_pad_translations(PAD_TRANSLATIONS) self._device_selection_follows_track_selection = True self._suggested_input_port = 'Impulse' self._suggested_output_port = 'Impulse' self._has_sliders = True self._current_midi_map = None self._display_reset_delay = -1 self._shift_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 39) self._preview_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 41) self._master_slider = SliderElement(MIDI_CC_TYPE, 0, 8) self._shift_button.name = 'Shift_Button' self._master_slider.name = 'Master_Volume_Control' self._master_slider.add_value_listener(self._slider_value, identify_sender=True) self._preview_button.add_value_listener(self._preview_value) self._setup_mixer() self._setup_session() self._setup_transport() self._setup_device() self._setup_name_display() device_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 1, 10) mixer_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 1, 9) device_button.name = 'Encoder_Device_Mode' mixer_button.name = 'Encoder_Mixer_Mode' self._encoder_modes = EncoderModeSelector(self._device_component, self._mixer, self._next_bank_button, self._prev_bank_button, self._encoders) self._encoder_modes.set_device_mixer_buttons(device_button, mixer_button) self._string_to_display = None self._shift_pressed = False self._shift_button.add_value_listener(self._shift_value) for component in self.components: component.set_enabled(False) def refresh_state(self): ControlSurface.refresh_state(self) self.schedule_message(3, self._send_midi, SYSEX_START + (6, 1, 1, 1, 247)) def handle_sysex(self, midi_bytes): if midi_bytes[0:-2] == SYSEX_START + (7,) and midi_bytes[-2] != 0: self._has_sliders = midi_bytes[-2] != 25 self.schedule_message(1, self._show_startup_message) for control in self.controls: if isinstance(control, InputControlElement): control.clear_send_cache() for component in self.components: component.set_enabled(True) if self._has_sliders: self._mixer.master_strip().set_volume_control(self._master_slider) self._mixer.update() else: self._mixer.master_strip().set_volume_control(None) self._mixer.selected_strip().set_volume_control(self._master_slider) for index in range(len(self._sliders)): self._mixer.channel_strip(index).set_volume_control(None) slider = self._sliders[index] slider.release_parameter() if slider.value_has_listener(self._slider_value): slider.remove_value_listener(self._slider_value) self._encoder_modes.set_provide_volume_mode(not self._has_sliders) self.request_rebuild_midi_map() def disconnect(self): self.log('starting disconnect 1') self._name_display_data_source.set_display_string(' ') for encoder in self._encoders: encoder.remove_value_listener(self._encoder_value) self._master_slider.remove_value_listener(self._slider_value) if self._has_sliders: for slider in tuple(self._sliders): slider.remove_value_listener(self._slider_value) for button in self._strip_buttons: button.remove_value_listener(self._mixer_button_value) self._preview_button.remove_value_listener(self._preview_value) self.log('starting disconnect 3') ControlSurface.disconnect(self) self.log('starting disconnect 3') self._encoders = None self._sliders = None self._strip_buttons = None self._master_slider = None self._current_midi_map = None self._name_display = None self._prev_bank_button = None self._next_bank_button = None self._encoder_modes = None self._transport_view_modes = None self.log('starting disconnect 4') self._send_midi(SYSEX_START + (6, 0, 0, 0, 247)) self.log('starting disconnect 5') if self._shift_button != None: self._shift_button.remove_value_listener(self._shift_value) self._shift_button = None self.log('starting disconnect 6') def build_midi_map(self, midi_map_handle): self._current_midi_map = midi_map_handle ControlSurface.build_midi_map(self, midi_map_handle) def update_display(self): ControlSurface.update_display(self) if self._string_to_display != None: self._name_display_data_source.set_display_string(self._string_to_display) self._string_to_display = None if self._display_reset_delay >= 0: self._display_reset_delay -= 1 if self._display_reset_delay == -1: self._show_current_track_name() def _setup_mixer(self): mute_solo_flip_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 34) self._next_nav_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 37) self._prev_nav_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 38) self._strip_buttons = [] mute_solo_flip_button.name = 'Mute_Solo_Flip_Button' self._next_nav_button.name = 'Next_Track_Button' self._prev_nav_button.name = 'Prev_Track_Button' self._mixer = SpecialMixerComponent(8, self.c_instance) self._mixer.name = 'Mixer' self._mixer.set_select_buttons(self._next_nav_button, self._prev_nav_button) self._mixer.selected_strip().name = 'Selected_Channel_Strip' self._mixer.master_strip().name = 'Master_Channel_Strip' self._mixer.master_strip().set_volume_control(self._master_slider) self._sliders = [] for index in range(8): strip = self._mixer.channel_strip(index) strip.name = 'Channel_Strip_' + str(index) strip.set_invert_mute_feedback(True) self._sliders.append(SliderElement(MIDI_CC_TYPE, 0, index)) self._sliders[-1].name = str(index) + '_Volume_Control' self._sliders[-1].set_feedback_delay(-1) self._sliders[-1].add_value_listener(self._slider_value, identify_sender=True) strip.set_volume_control(self._sliders[-1]) self._strip_buttons.append(ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 9 + index)) self._strip_buttons[-1].name = str(index) + '_Mute_Button' self._strip_buttons[-1].add_value_listener(self._mixer_button_value, identify_sender=True) self._mixer.master_strip().set_mute_button(ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 17)) self._mixer.set_strip_mute_solo_buttons(tuple(self._strip_buttons), mute_solo_flip_button) #self._mixer.set_shift_button(self._shift_button) self._mixer.updateMixerButtons() self._button9 = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 9 + 8) def _setup_session(self): num_pads = len(PAD_TRANSLATIONS) self._session = SessionComponent(8, 0) self._session.name = 'Session_Control' self._session.selected_scene().name = 'Selected_Scene' self._session.set_mixer(self._mixer) # for ableton 9.1.1 and lower #self._session.set_track_banking_increment(num_pads) #self._session.set_track_bank_buttons(ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 35), ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 36)) # for ableton 9.1.1 and higher self._track_left_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 36) self._track_right_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 35) self._session.set_page_left_button(self._track_left_button) self._session.set_page_right_button(self._track_right_button) pads = [] for index in range(num_pads): pads.append(ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 60 + index)) pads[-1].name = 'Pad_' + str(index) clip_slot = self._session.selected_scene().clip_slot(index) clip_slot.set_triggered_to_play_value(GREEN_BLINK) clip_slot.set_triggered_to_record_value(RED_BLINK) clip_slot.set_stopped_value(AMBER_FULL) clip_slot.set_started_value(GREEN_FULL) clip_slot.set_recording_value(RED_FULL) clip_slot.set_launch_button(pads[-1]) clip_slot.name = str(index) + '_Selected_Clip_Slot' def _setup_transport(self): rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 27) ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 28) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 29) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 30) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 31) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 32) ffwd_button.name = 'FFwd_Button' rwd_button.name = 'Rwd_Button' loop_button.name = 'Loop_Button' play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' rec_button.name = 'Record_Button' self._transport = ShiftableTransportComponent(self.c_instance,self._session, self, ffwd_button, rwd_button) self._transport.name = 'Transport' self._transport.set_stop_buttonOnInit(stop_button) self._transport.set_play_button(play_button) self._transport.set_record_buttonOnInit(rec_button) # self._transport.set_shift_button(self._shift_button) self._transport.set_mixer9_button(self._button9) self._transport_view_modes = TransportViewModeSelector(self.c_instance,self._transport, self._session, ffwd_button, rwd_button, loop_button) self._transport_view_modes.name = 'Transport_View_Modes' def _setup_device(self): encoders = [] for index in range(8): encoders.append(PeekableEncoderElement(MIDI_CC_TYPE, 1, index, Live.MidiMap.MapMode.relative_binary_offset)) encoders[-1].set_feedback_delay(-1) encoders[-1].add_value_listener(self._encoder_value, identify_sender=True) encoders[-1].name = 'Device_Control_' + str(index) self._encoders = tuple(encoders) self._prev_bank_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 12) self._next_bank_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 11) self._prev_bank_button.name = 'Device_Bank_Down_Button' self._next_bank_button.name = 'Device_Bank_Up_Button' device = DeviceComponent() device.name = 'Device_Component' self.set_device_component(device) device.set_parameter_controls(self._encoders) device.set_bank_nav_buttons(self._prev_bank_button, self._next_bank_button) def _setup_name_display(self): self._name_display = PhysicalDisplayElement(16, 1) self._name_display.name = 'Display' self._name_display.set_message_parts(SYSEX_START + (8,), (247,)) self._name_display_data_source = DisplayDataSource() self._name_display.segment(0).set_data_source(self._name_display_data_source) def _encoder_value(self, value, sender): if not sender in self._encoders: raise AssertionError if not value in range(128): raise AssertionError # display_string = self._device_component.is_enabled() and ' - ' # display_string = sender.mapped_parameter() != None and sender.mapped_parameter().name display_string = '' if self._device_component.is_enabled(): # display_string = sender.name # track = self.song().view.selected_track # display_string = str(list(tracks).index(track) + 1) pass if (sender.mapped_parameter() != None): # display_string = display_string + '-' display_string = display_string + sender.mapped_parameter().name self._set_string_to_display(display_string) def _slider_value(self, value, sender): self.log ('_slider_value ' + str(value) + ' ' +str(sender)) if not sender in tuple(self._sliders) + (self._master_slider,): raise AssertionError if not value in range(128): raise AssertionError if self._mixer.is_enabled(): display_string = ' - ' master = self.song().master_track tracks = self.song().tracks returns = self.song().return_tracks track = None if sender.mapped_parameter() != None: self.log ('1') if sender == self._master_slider: self.log ('2') # track = self._has_sliders and master if self._has_sliders: track = master else: self.log ('2.1') track = self.song().view.selected_track else: self.log ('3') track = self._mixer.channel_strip(self._sliders.index(sender))._track else: self.log ('4') track = self.song().view.selected_track self.log('track='+str(track)) if track == master: display_string = 'Master' elif track in tracks: display_string = str(list(tracks).index(track) + 1) elif track in returns: display_string = str(chr(ord('A') + list(returns).index(track))) else: # raise False or AssertionError raise AssertionError display_string += ' Volume' self._set_string_to_display(display_string) def _mixer_button_value(self, value, sender): if not value in range(128): raise AssertionError #if self._mixer.is_enabled() and value > 0: if self._mixer.is_enabled(): strip = self._mixer.channel_strip(self._strip_buttons.index(sender)) #self._string_to_display = strip != None and None self._name_display.segment(0).set_data_source(strip.track_name_data_source()) self._name_display.update() self._display_reset_delay = STANDARD_DISPLAY_DELAY else: self._set_string_to_display(' - ') def _preview_value(self, value): if not value in range(128): raise AssertionError for encoder in self._encoders: encoder.set_peek_mode(value > 0) def _show_current_track_name(self): if self._name_display != None and self._mixer != None: self._string_to_display = None self._name_display.segment(0).set_data_source(self._mixer.selected_strip().track_name_data_source()) self._name_display.update() def _show_startup_message(self): self._name_display.display_message('LIVE') self._display_reset_delay = INITIAL_DISPLAY_DELAY def _set_string_to_display(self, string_to_display): if not isinstance(string_to_display, (str, unicode)): raise AssertionError self._name_display.segment(0).set_data_source(self._name_display_data_source) self._string_to_display = string_to_display self._display_reset_delay = STANDARD_DISPLAY_DELAY def _on_selected_track_changed(self): self.log('_on_selected_track_changed') ControlSurface._on_selected_track_changed(self) self._show_current_track_name() #all_tracks = self._has_sliders or self._session.tracks_to_use() all_tracks2 = self._session.tracks_to_use() selected_track = self.song().view.selected_track num_strips = self._session.width() if selected_track in all_tracks2: track_index = list(all_tracks2).index(selected_track) self.log('track_index '+ str(track_index)) new_offset = track_index - track_index % num_strips self.log('new_offset '+ str(new_offset)) if not new_offset / num_strips == int(new_offset / num_strips): raise AssertionError self._session.set_offsets(new_offset, self._session.scene_offset()) def _shift_value(self, value): self.log("root shift handler") if not self._shift_button != None: raise AssertionError if not value in range(128): raise AssertionError self.log("root shift handler 2") self._shift_pressed = value > 0 # calling other handlers self._mixer._shift_value(value) self._transport._shift_value(value) self._transport_view_modes._shift_value(value) #clip stop self.log("root shift handler 3") num_pads = len(PAD_TRANSLATIONS) pads = [] for index in range(num_pads): pads.append(ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 60 + index)) pads[-1].name = 'Pad_' + str(index) clip_slot = self._session.selected_scene().clip_slot(index) if self._shift_pressed: clip_slot.set_launch_button(None) else: clip_slot.set_launch_button(pads[index]) if self._shift_pressed: self._session.set_stop_track_clip_buttons(tuple(pads)) else: self._session.set_stop_track_clip_buttons(None) self.log("root shift handler 4") def log(self, message): pass
def _setup_transport_and_session(self): ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 115) rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 114) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 113) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 117) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 116) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 15, 118) ffwd_button.name = 'FFwd_Button' rwd_button.name = 'Rwd_Button' loop_button.name = 'Loop_Button' play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' rec_button.name = 'Record_Button' transport = ShiftableTransportComponent() transport.name = 'Transport' transport.set_shift_button(self._shift_button) transport.set_stop_button(stop_button) transport.set_play_button(play_button) transport.set_record_button(rec_button) pads = [] for index in range(len(PAD_TRANSLATIONS)): pads.append( ButtonElement(IS_MOMENTARY, MIDI_NOTE_TYPE, 15, PAD_TRANSLATIONS[index][2])) pads[-1].name = 'Pad_' + str(index) self._session = ShiftableSessionComponent(8, 0) self._session.name = 'Session_Control' self._session.selected_scene().name = 'Selected_Scene' self._session.set_mixer(self._mixer) self._session.set_shift_button(self._shift_button) self._session.set_clip_slot_buttons(tuple(pads)) transport_view_modes = TransportViewModeSelector( transport, self._session, ffwd_button, rwd_button, loop_button) transport_view_modes.name = 'Transport_View_Modes'
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', 'Device_Lock_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.set_feedback_delay(-1) #added from Axiom DirectLink example ringed_encoder.name = 'Device_Control_' + str(index) ring_mode_button.name = ringed_encoder.name + '_Ring_Mode_Button' device_param_controls.append(ringed_encoder) self._device = ShiftableDeviceComponent() self._device.name = 'Device_Component' self._device.set_bank_buttons(tuple(device_bank_buttons)) self._device.set_shift_button(self._shift_button) self._device.set_parameter_controls(tuple(device_param_controls)) self._device.set_on_off_button(device_bank_buttons[1]) self.set_device_component(self._device) detail_view_toggler = DetailViewControllerComponent() 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]) 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_undo_button(nudge_down_button) #shifted nudge transport.set_redo_button(nudge_up_button) #shifted nudge transport.set_tap_tempo_button(tap_tempo_button) self._device.set_lock_button(tap_tempo_button) #shifted tap tempo 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]) transport.set_tempo_encoder(self._prehear_control) #shifted prehear bank_button_translator = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
def _setup_transport_control(self): is_momentary = True # We'll only be using momentary buttons here transport = ShiftableTransportComponent( ) #Instantiate a Transport Component #addtransport = AddlTransportComponent() #Instantiate an AddlTransport Component device_param_controls = [] #effects_knob_cc = [16,20,24,28,17,21,25,29] effects_knob_cc = [17, 21, 25, 29, 18, 22, 26, 30] device = DeviceComponent() for index in range(8): device_param_controls.append( EncoderElement(MIDI_CC_TYPE, CHAN, effects_knob_cc[index], Live.MidiMap.MapMode.absolute)) device.set_parameter_controls(tuple(device_param_controls)) #self.set_device_component(device) #from apc device_bank_buttons = [] #device_param_controls = [] #device_buttons =[16,20,24,28,17,21,25,29]; device_buttons = [17, 21, 25, 29, 18, 22, 26, 30] 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', 'Device_Lock_Button' ) #'Metronome_Button') for index in range(8): device_bank_buttons.append( ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, device_buttons[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.name = 'Device_Component' device.set_bank_buttons(tuple(device_bank_buttons)) detail_view_toggler = DetailViewCntrlComponent() detail_view_toggler.name = 'Detail_View_Control' detail_view_toggler.set_device_clip_toggle_button( device_bank_buttons[0]) device.set_on_off_button(device_bank_buttons[1]) detail_view_toggler.set_device_nav_buttons(device_bank_buttons[2], device_bank_buttons[3]) detail_view_toggler.set_detail_toggle_button(device_bank_buttons[4]) device.set_lock_button( device_bank_buttons[7] ) #assign device lock to bank_button 8 (in place of metronome)... self.set_device_component(device) #detail_view_toggler.set_shift_button(self._shift_button) #from apc self._shift_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 37) """set up the buttons""" play_button = ButtonElement( is_momentary, MIDI_NOTE_TYPE, CHAN, 24 ) #ButtonElement(is_momentary, msg_type, channel, identifier) Note that the MIDI_NOTE_TYPE constant is defined in the InputControlElement module stop_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 28) record_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 32) nudge_up_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 27) nudge_down_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 23) # tap_tempo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 19) redo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 19) undo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, CHAN, 20) 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' redo_button.name = 'Redo_Button' undo_button.name = 'Undo_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) #addtransport.set_undo_button(undo_button) #addtransport.set_redo_button(redo_button) transport.set_tap_tempo_button(nudge_up_button) #shifted nudge 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]) #transport.set_tempo_encoder(self.prehear_control) #shifted prehear bank_button_translator = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate( tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
class Novation_Impulse2(ControlSurface): """ Script for Novation's Impulse keyboards """ def __init__(self, c_instance): ControlSurface.__init__(self, c_instance) self.c_instance = c_instance with self.component_guard(): self.set_pad_translations(PAD_TRANSLATIONS) self._device_selection_follows_track_selection = True self._suggested_input_port = 'Impulse' self._suggested_output_port = 'Impulse' self._has_sliders = True self._current_midi_map = None self._display_reset_delay = -1 self._shift_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 39) self._preview_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 41) self._master_slider = SliderElement(MIDI_CC_TYPE, 0, 8) self._shift_button.name = 'Shift_Button' self._master_slider.name = 'Master_Volume_Control' self._master_slider.add_value_listener(self._slider_value, identify_sender=True) self._preview_button.add_value_listener(self._preview_value) self._setup_mixer() self._setup_session() self._setup_transport() self._setup_device() self._setup_name_display() device_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 1, 10) mixer_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 1, 9) device_button.name = 'Encoder_Device_Mode' mixer_button.name = 'Encoder_Mixer_Mode' self._encoder_modes = EncoderModeSelector(self._device_component, self._mixer, self._next_bank_button, self._prev_bank_button, self._encoders) self._encoder_modes.set_device_mixer_buttons( device_button, mixer_button) self._string_to_display = None self._shift_pressed = False self._shift_button.add_value_listener(self._shift_value) for component in self.components: component.set_enabled(False) def refresh_state(self): ControlSurface.refresh_state(self) self.schedule_message(3, self._send_midi, SYSEX_START + (6, 1, 1, 1, 247)) def handle_sysex(self, midi_bytes): if midi_bytes[0:-2] == SYSEX_START + (7, ) and midi_bytes[-2] != 0: self._has_sliders = midi_bytes[-2] != 25 self.schedule_message(1, self._show_startup_message) for control in self.controls: if isinstance(control, InputControlElement): control.clear_send_cache() for component in self.components: component.set_enabled(True) if self._has_sliders: self._mixer.master_strip().set_volume_control( self._master_slider) self._mixer.update() else: self._mixer.master_strip().set_volume_control(None) self._mixer.selected_strip().set_volume_control( self._master_slider) for index in range(len(self._sliders)): self._mixer.channel_strip(index).set_volume_control(None) slider = self._sliders[index] slider.release_parameter() if slider.value_has_listener(self._slider_value): slider.remove_value_listener(self._slider_value) self._encoder_modes.set_provide_volume_mode(not self._has_sliders) self.request_rebuild_midi_map() def disconnect(self): self.log('starting disconnect 1') self._name_display_data_source.set_display_string(' ') for encoder in self._encoders: encoder.remove_value_listener(self._encoder_value) self._master_slider.remove_value_listener(self._slider_value) if self._has_sliders: for slider in tuple(self._sliders): slider.remove_value_listener(self._slider_value) for button in self._strip_buttons: button.remove_value_listener(self._mixer_button_value) self._preview_button.remove_value_listener(self._preview_value) self.log('starting disconnect 3') ControlSurface.disconnect(self) self.log('starting disconnect 3') self._encoders = None self._sliders = None self._strip_buttons = None self._master_slider = None self._current_midi_map = None self._name_display = None self._prev_bank_button = None self._next_bank_button = None self._encoder_modes = None self._transport_view_modes = None self.log('starting disconnect 4') self._send_midi(SYSEX_START + (6, 0, 0, 0, 247)) self.log('starting disconnect 5') if self._shift_button != None: self._shift_button.remove_value_listener(self._shift_value) self._shift_button = None self.log('starting disconnect 6') def build_midi_map(self, midi_map_handle): self._current_midi_map = midi_map_handle ControlSurface.build_midi_map(self, midi_map_handle) def update_display(self): ControlSurface.update_display(self) if self._string_to_display != None: self._name_display_data_source.set_display_string( self._string_to_display) self._string_to_display = None if self._display_reset_delay >= 0: self._display_reset_delay -= 1 if self._display_reset_delay == -1: self._show_current_track_name() def _setup_mixer(self): mute_solo_flip_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 34) self._next_nav_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 37) self._prev_nav_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 38) self._strip_buttons = [] mute_solo_flip_button.name = 'Mute_Solo_Flip_Button' self._next_nav_button.name = 'Next_Track_Button' self._prev_nav_button.name = 'Prev_Track_Button' self._mixer = SpecialMixerComponent(8, self.c_instance) self._mixer.name = 'Mixer' self._mixer.set_select_buttons(self._next_nav_button, self._prev_nav_button) self._mixer.selected_strip().name = 'Selected_Channel_Strip' self._mixer.master_strip().name = 'Master_Channel_Strip' self._mixer.master_strip().set_volume_control(self._master_slider) self._sliders = [] for index in range(8): strip = self._mixer.channel_strip(index) strip.name = 'Channel_Strip_' + str(index) strip.set_invert_mute_feedback(True) self._sliders.append(SliderElement(MIDI_CC_TYPE, 0, index)) self._sliders[-1].name = str(index) + '_Volume_Control' self._sliders[-1].set_feedback_delay(-1) self._sliders[-1].add_value_listener(self._slider_value, identify_sender=True) strip.set_volume_control(self._sliders[-1]) self._strip_buttons.append( ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 9 + index)) self._strip_buttons[-1].name = str(index) + '_Mute_Button' self._strip_buttons[-1].add_value_listener( self._mixer_button_value, identify_sender=True) self._mixer.master_strip().set_mute_button( ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 17)) self._mixer.set_strip_mute_solo_buttons(tuple(self._strip_buttons), mute_solo_flip_button) #self._mixer.set_shift_button(self._shift_button) self._mixer.updateMixerButtons() self._button9 = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 9 + 8) def _setup_session(self): num_pads = len(PAD_TRANSLATIONS) self._session = SessionComponent(8, 0) self._session.name = 'Session_Control' self._session.selected_scene().name = 'Selected_Scene' self._session.set_mixer(self._mixer) # for ableton 9.1.1 and lower #self._session.set_track_banking_increment(num_pads) #self._session.set_track_bank_buttons(ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 35), ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 36)) # for ableton 9.1.1 and higher self._track_left_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 36) self._track_right_button = ButtonElement(not IS_MOMENTARY, MIDI_CC_TYPE, 0, 35) self._session.set_page_left_button(self._track_left_button) self._session.set_page_right_button(self._track_right_button) pads = [] for index in range(num_pads): pads.append( ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 60 + index)) pads[-1].name = 'Pad_' + str(index) clip_slot = self._session.selected_scene().clip_slot(index) clip_slot.set_triggered_to_play_value(GREEN_BLINK) clip_slot.set_triggered_to_record_value(RED_BLINK) clip_slot.set_stopped_value(AMBER_FULL) clip_slot.set_started_value(GREEN_FULL) clip_slot.set_recording_value(RED_FULL) clip_slot.set_launch_button(pads[-1]) clip_slot.name = str(index) + '_Selected_Clip_Slot' def _setup_transport(self): rwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 27) ffwd_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 28) stop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 29) play_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 30) loop_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 31) rec_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 32) ffwd_button.name = 'FFwd_Button' rwd_button.name = 'Rwd_Button' loop_button.name = 'Loop_Button' play_button.name = 'Play_Button' stop_button.name = 'Stop_Button' rec_button.name = 'Record_Button' self._transport = ShiftableTransportComponent(self.c_instance, self._session, self, ffwd_button, rwd_button) self._transport.name = 'Transport' self._transport.set_stop_buttonOnInit(stop_button) self._transport.set_play_button(play_button) self._transport.set_record_buttonOnInit(rec_button) # self._transport.set_shift_button(self._shift_button) self._transport.set_mixer9_button(self._button9) self._transport_view_modes = TransportViewModeSelector( self.c_instance, self._transport, self._session, ffwd_button, rwd_button, loop_button) self._transport_view_modes.name = 'Transport_View_Modes' def _setup_device(self): encoders = [] for index in range(8): encoders.append( PeekableEncoderElement( MIDI_CC_TYPE, 1, index, Live.MidiMap.MapMode.relative_binary_offset)) encoders[-1].set_feedback_delay(-1) encoders[-1].add_value_listener(self._encoder_value, identify_sender=True) encoders[-1].name = 'Device_Control_' + str(index) self._encoders = tuple(encoders) self._prev_bank_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 12) self._next_bank_button = ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 1, 11) self._prev_bank_button.name = 'Device_Bank_Down_Button' self._next_bank_button.name = 'Device_Bank_Up_Button' device = DeviceComponent() device.name = 'Device_Component' self.set_device_component(device) device.set_parameter_controls(self._encoders) device.set_bank_nav_buttons(self._prev_bank_button, self._next_bank_button) def _setup_name_display(self): self._name_display = PhysicalDisplayElement(16, 1) self._name_display.name = 'Display' self._name_display.set_message_parts(SYSEX_START + (8, ), (247, )) self._name_display_data_source = DisplayDataSource() self._name_display.segment(0).set_data_source( self._name_display_data_source) def _encoder_value(self, value, sender): if not sender in self._encoders: raise AssertionError if not value in range(128): raise AssertionError # display_string = self._device_component.is_enabled() and ' - ' # display_string = sender.mapped_parameter() != None and sender.mapped_parameter().name display_string = '' if self._device_component.is_enabled(): # display_string = sender.name # track = self.song().view.selected_track # display_string = str(list(tracks).index(track) + 1) pass if (sender.mapped_parameter() != None): # display_string = display_string + '-' display_string = display_string + sender.mapped_parameter().name self._set_string_to_display(display_string) def _slider_value(self, value, sender): self.log('_slider_value ' + str(value) + ' ' + str(sender)) if not sender in tuple(self._sliders) + (self._master_slider, ): raise AssertionError if not value in range(128): raise AssertionError if self._mixer.is_enabled(): display_string = ' - ' master = self.song().master_track tracks = self.song().tracks returns = self.song().return_tracks track = None if sender.mapped_parameter() != None: self.log('1') if sender == self._master_slider: self.log('2') # track = self._has_sliders and master if self._has_sliders: track = master else: self.log('2.1') track = self.song().view.selected_track else: self.log('3') track = self._mixer.channel_strip( self._sliders.index(sender))._track else: self.log('4') track = self.song().view.selected_track self.log('track=' + str(track)) if track == master: display_string = 'Master' elif track in tracks: display_string = str(list(tracks).index(track) + 1) elif track in returns: display_string = str( chr(ord('A') + list(returns).index(track))) else: # raise False or AssertionError raise AssertionError display_string += ' Volume' self._set_string_to_display(display_string) def _mixer_button_value(self, value, sender): if not value in range(128): raise AssertionError #if self._mixer.is_enabled() and value > 0: if self._mixer.is_enabled(): strip = self._mixer.channel_strip( self._strip_buttons.index(sender)) #self._string_to_display = strip != None and None self._name_display.segment(0).set_data_source( strip.track_name_data_source()) self._name_display.update() self._display_reset_delay = STANDARD_DISPLAY_DELAY else: self._set_string_to_display(' - ') def _preview_value(self, value): if not value in range(128): raise AssertionError for encoder in self._encoders: encoder.set_peek_mode(value > 0) def _show_current_track_name(self): if self._name_display != None and self._mixer != None: self._string_to_display = None self._name_display.segment(0).set_data_source( self._mixer.selected_strip().track_name_data_source()) self._name_display.update() def _show_startup_message(self): self._name_display.display_message('LIVE') self._display_reset_delay = INITIAL_DISPLAY_DELAY def _set_string_to_display(self, string_to_display): if not isinstance(string_to_display, (str, unicode)): raise AssertionError self._name_display.segment(0).set_data_source( self._name_display_data_source) self._string_to_display = string_to_display self._display_reset_delay = STANDARD_DISPLAY_DELAY def _on_selected_track_changed(self): self.log('_on_selected_track_changed') ControlSurface._on_selected_track_changed(self) self._show_current_track_name() #all_tracks = self._has_sliders or self._session.tracks_to_use() all_tracks2 = self._session.tracks_to_use() selected_track = self.song().view.selected_track num_strips = self._session.width() if selected_track in all_tracks2: track_index = list(all_tracks2).index(selected_track) self.log('track_index ' + str(track_index)) new_offset = track_index - track_index % num_strips self.log('new_offset ' + str(new_offset)) if not new_offset / num_strips == int(new_offset / num_strips): raise AssertionError self._session.set_offsets(new_offset, self._session.scene_offset()) def _shift_value(self, value): self.log("root shift handler") if not self._shift_button != None: raise AssertionError if not value in range(128): raise AssertionError self.log("root shift handler 2") self._shift_pressed = value > 0 # calling other handlers self._mixer._shift_value(value) self._transport._shift_value(value) self._transport_view_modes._shift_value(value) #clip stop self.log("root shift handler 3") num_pads = len(PAD_TRANSLATIONS) pads = [] for index in range(num_pads): pads.append( ButtonElement(IS_MOMENTARY, MIDI_CC_TYPE, 0, 60 + index)) pads[-1].name = 'Pad_' + str(index) clip_slot = self._session.selected_scene().clip_slot(index) if self._shift_pressed: clip_slot.set_launch_button(None) else: clip_slot.set_launch_button(pads[index]) if self._shift_pressed: self._session.set_stop_track_clip_buttons(tuple(pads)) else: self._session.set_stop_track_clip_buttons(None) self.log("root shift handler 4") def log(self, message): pass
def _setup_device_and_transport_control(self): is_momentary = True device_bank_buttons = [] device_param_controls = [] for index in range(8): device_bank_buttons.append( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[index])) device_param_controls.append( EncoderElement(MIDI_CC_TYPE, 0, KMK_ENCODER[index], Live.MidiMap.MapMode.relative_two_compliment)) global device # special component, inherits from ShiftableDeviceController and adds lcds device = kmkDisplayingDeviceComponent() 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]) device.set_lock_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_PAD[10])) parameter_displays = [] for index in range(8): parameter_displays.append(PhysicalDisplayElement(8, 1)) parameter_displays[-1].set_message_parts( (SYSEX_KMK_HEADER + (KMK_LCD_COMMAND, 9, (index + 48))), (247, )) device_name_display = PhysicalDisplayElement(8, 1) device_name_display.set_message_parts( (SYSEX_KMK_HEADER + (KMK_LCD_COMMAND, 9, (8 + 32))), (247, )) device.set_display(parameter_displays, device_name_display) self.set_device_component(device) detail_view_toggler = DetailViewControllerComponent() 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]) detail_view_toggler.set_arrange_toggle_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[8])) detail_view_toggler.set_browser_toggle_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[12])) transport = ShiftableTransportComponent() transport.set_shift_button(self._shift_button) transport.set_play_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[4])) transport.set_stop_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[5])) transport.set_record_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[3])) transport.set_seek_buttons( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[1]), SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[0])) transport.set_loop_button( SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[2])) 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 = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate( tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
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 = DetailViewControllerComponent() 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]) 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]) # The metronome button is device lock instead # transport.set_metronome_button(device_bank_buttons[7]) device.set_lock_button(device_bank_buttons[7]) # assign device lock to bank_button 8 (in place of metronome)... transport.set_tempo_encoder(self.prehear_control) bank_button_translator = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
class APC40(APC): __doc__ = " Script for Akai's APC40 Controller " def __init__(self, c_instance): APC.__init__(self, c_instance) self._device_selection_follows_track_selection = True def _setup_session_control(self): is_momentary = True self._shift_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 98) right_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 96) left_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 97) up_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 94) down_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 95) right_button.name = 'Bank_Select_Right_Button' left_button.name = 'Bank_Select_Left_Button' up_button.name = 'Bank_Select_Up_Button' down_button.name = 'Bank_Select_Down_Button' self._session = PedaledSessionComponent(8, 5) self._session.name = 'Session_Control' self._session.set_track_bank_buttons(right_button, left_button) self._session.set_scene_bank_buttons(down_button, up_button) matrix = ButtonMatrixElement() matrix.name = 'Button_Matrix' self.scene_launch_buttons = [ ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, (index + 82)) for index in range(5) ] track_stop_buttons = [ ButtonElement(is_momentary, MIDI_NOTE_TYPE, index, 52) for index in range(8) ] for index in range(len(self.scene_launch_buttons)): self.scene_launch_buttons[index].name = 'Scene_'+ str(index) + '_Launch_Button' for index in range(len(track_stop_buttons)): track_stop_buttons[index].name = 'Track_' + str(index) + '_Stop_Button' self.stop_all_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 81) self.stop_all_button.name = 'Stop_All_Clips_Button' self._session.set_stop_all_clips_button(self.stop_all_button) self._session.set_stop_track_clip_buttons(tuple(track_stop_buttons)) self._session.set_stop_track_clip_value(2) ## Quirksmode self.newZoom_buttons = [] for scene_index in range(5): scene = self._session.scene(scene_index) scene.name = 'Scene_' + str(scene_index) button_row = [] scene.set_launch_button(self.scene_launch_buttons[scene_index]) scene.set_triggered_value(2) for track_index in range(8): button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, track_index, (scene_index + 53)) ## Quirksmode - This moves the zoomer to allow for scene launch customisation (Currently not working 100%) if(track_index == 4): self.newZoom_buttons.append(button) button.name = str(track_index) + '_Clip_' + str(scene_index) + '_Button' button_row.append(button) clip_slot = scene.clip_slot(track_index) clip_slot.name = str(track_index) + '_Clip_Slot_' + str(scene_index) clip_slot.set_triggered_to_play_value(2) clip_slot.set_triggered_to_record_value(4) clip_slot.set_stopped_value(3) clip_slot.set_started_value(1) clip_slot.set_recording_value(3) clip_slot.set_launch_button(button) matrix.add_row(tuple(button_row)) self._session.set_slot_launch_button(ButtonElement(is_momentary, MIDI_CC_TYPE, 0, 67)) self._session.selected_scene().name = 'Selected_Scene' self._session.selected_scene().set_launch_button(ButtonElement(is_momentary, MIDI_CC_TYPE, 0, 64)) self._session_zoom = SessionZoomingComponent(self._session) self._session_zoom.name = 'Session_Overview' self._session_zoom.set_button_matrix(matrix) self._session_zoom.set_zoom_button(self._shift_button) self._session_zoom.set_nav_buttons(up_button, down_button, left_button, right_button) self._session_zoom.set_scene_bank_buttons(tuple(self.newZoom_buttons)) self._session_zoom.set_stopped_value(3) self._session_zoom.set_selected_value(5) return None #return session def _setup_mixer_control(self): is_momentary = True ## Quirksmode self.arm_buttons = [] self._mixer = SpecialMixerComponent(self, 8) #added self for parent self._mixer.name = 'Mixer' self._mixer.master_strip().name = 'Master_Channel_Strip' self._mixer.selected_strip().name = 'Selected_Channel_Strip' for track in range(8): self.strip = self._mixer.channel_strip(track) self.strip.name = 'Channel_Strip_' + str(track) volume_control = SliderElement(MIDI_CC_TYPE, track, 7) arm_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, track, 48) solo_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, track, 49) mute_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, track, 50) select_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, track, 51) volume_control.name = str(track) + '_Volume_Control' arm_button.name = str(track) + '_Arm_Button' solo_button.name = str(track) + '_Solo_Button' mute_button.name = str(track) + '_Mute_Button' select_button.name = str(track) + '_Select_Button' self.strip.set_volume_control(volume_control) ##Quirksmode self.arm_buttons.append(arm_button) self.strip.set_arm_button(arm_button) self.strip.set_solo_button(solo_button) self.strip.set_mute_button(mute_button) self.strip.set_select_button(select_button) self.strip.set_shift_button(self._shift_button) self.strip.set_invert_mute_feedback(True) crossfader = SliderElement(MIDI_CC_TYPE, 0, 15) master_volume_control = SliderElement(MIDI_CC_TYPE, 0, 14) master_select_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 80) ##self._prehear_control = EncoderElement(MIDI_CC_TYPE, 0, 47, Live.MidiMap.MapMode.relative_two_compliment) crossfader.name = 'Crossfader' master_volume_control.name = 'Master_Volume_Control' master_select_button.name = 'Master_Select_Button' ##self._prehear_control.name = 'Prehear_Volume_Control' self._mixer.set_crossfader_control(crossfader) ##self._mixer.set_prehear_volume_control(self._prehear_control) self._mixer.master_strip().set_volume_control(master_volume_control) self._mixer.master_strip().set_select_button(master_select_button) def _setup_custom_components(self): self._setup_device_and_transport_control() self._setup_global_control() self._setup_djModeToggle() def _setup_djModeToggle(self): self._newDjModeToggle_state = False ## How many tracks? self._trackTotal = len(self.song().tracks) ## Re-Assign Metronome to Dj Mode toggle self._newDjModeToggle_button = self.transport._metronome_button self.transport.set_metronome_button(None) self._newDjModeToggle_button.add_value_listener(self._toggleDjMode) ## Assign Cue Volume (Temporary hack until I get the correct Api Values) self.transport._tempo_encoder_control.connect_to(self.song().master_track.mixer_device.cue_volume) def _toggleDjMode(self, value): if value == 1: if(self._newDjModeToggle_state): self._newDjModeToggle_button.turn_off() self._newDjModeToggle_state = False self.show_message("########################################################################################## DJ MODE: OFF ##############################") self._disconnect_djMode() self.transport._cueLevelMode = 1 self.device_bank_buttons[4].turn_on() self.transport._tempo_encoder_control.connect_to(self.song().master_track.mixer_device.cue_volume) else: self._newDjModeToggle_button.turn_on() self._newDjModeToggle_state = True self.show_message("########################################################################################## DJ MODE: ON ##############################") self._setup_djMode() self.transport._cueLevelMode = 2 self.device_bank_buttons[4].turn_off() self.transport._tempo_encoder_control.release_parameter() def _setup_djMode(self): ## Assign imports self.sceneEffect = SceneEffectComponent(self) self.reset = ResetComponent(self) self.armmode = ArmToggleComponent(self) self.trackControl = TrackControlComponent(self) is_momentary = True ##### Scene Effect Component self.sceneEffect.set_shift_button(self._shift_button) for scene_index in range(5): self.sceneEffect.newScene_button = self._session.scene(scene_index)._launch_button self._session.scene(scene_index).set_launch_button(None) self.sceneEffect.newScene_button.add_value_listener(self.sceneEffect._device_toggle, True) self.sceneEffect._device_buttons.append(self.sceneEffect.newScene_button) # Re-assign the stop all clips button self.sceneEffect._newStopAll_button = self._session._stop_all_button self._session.set_stop_all_clips_button(None) self.sceneEffect._newStopAll_button.add_value_listener(self.sceneEffect._masterRepeat) ##### Reset Component self.reset.set_shift_button(self._shift_button) #Re-assign Play and Stop buttons to Reset Track and All self.reset.reset_button = self.transport._play_button self.transport.set_play_button(None) self.reset.reset_button.add_value_listener(self.reset.reset_track) self.reset.resetAll_button = self.transport._stop_button self.transport.set_stop_button(None) self.reset.resetAll_button.add_value_listener(self.reset.reset_all) ##### Arm Toggle Component self.armmode.set_shift_button(self._shift_button) # Re-Assign Clip/Track Button to Loop/Utility toggle self.armmode._newDetailView_button = self.detail_view_toggler._detail_toggle_button self.detail_view_toggler.set_detail_toggle_button(None) self.armmode._newDetailView_button.add_value_listener(self.armmode._toggleArmMode) # Re-assign Arm button functionality for track in range(8): self.armmode.newArm_button = self._mixer.channel_strip(track)._arm_button self._mixer.channel_strip(track).set_arm_button(None) self.armmode.newArm_button.add_value_listener(self.armmode._device_toggle, True) self.armmode._arm_buttons.append(self.armmode.newArm_button) ##### Re-assign Track Control Ringed Encoders self.trackControl._trackEncoders = [] for encoder_index in range(8): self.newTrackEncoder_encoder = self.global_param_controls[encoder_index] self.encoder_modes.set_controls(None) self.trackControl._trackEncoders.append(self.newTrackEncoder_encoder) self.get_current_track() if(self.song().view.selected_track != self.song().master_track): for device in self.song().tracks[self.current_track].devices: if device.name == "DJ EQ and FX": for parameter in range(8): self.trackControl._trackEncoders[parameter].connect_to(device.parameters[parameter+1]) def _disconnect_djMode(self): ##### Disconnect Scene Effect Component # Re-assign the Scene Start Buttons for scene_index in range(5): self.sceneEffect._device_buttons[scene_index].remove_value_listener(self.sceneEffect._device_toggle) self._session.scene(scene_index).set_launch_button(self.scene_launch_buttons[scene_index]) self.sceneEffect._device_buttons = [] # Re-assign the stop all clips button self.sceneEffect._newStopAll_button.remove_value_listener(self.sceneEffect._masterRepeat) self.sceneEffect._newStopAll_button = None self._session.set_stop_all_clips_button(self.stop_all_button) self.song().view.remove_selected_track_listener(self.sceneEffect.sceneLight) ##### Disconnect Reset Component # Re-assign the Play Button self.reset.reset_button.remove_value_listener(self.reset.reset_track) self.reset.reset_button = None self.transport.set_play_button(self.play_button) # Re-assign the Stop Button self.reset.resetAll_button.remove_value_listener(self.reset.reset_all) self.reset.resetAll_button = None self.transport.set_stop_button(self.stop_button) ##### Disconnect Arm Toggle Component for track in range(8): self.armmode._arm_buttons[track].remove_value_listener(self.armmode._device_toggle) self._mixer.channel_strip(track).set_arm_button(self.arm_buttons[track]) self.armmode._arm_buttons = [] self.armmode._newDetailView_button.remove_value_listener(self.armmode._toggleArmMode) self.armmode._newDetailView_button = None self.detail_view_toggler.set_detail_toggle_button(self.device_bank_buttons[4]) self.song().view.remove_selected_track_listener(self.armmode._armLightMode) ##### Disconnect Track Control Ringed Encoders self.trackControl._trackEncoders = [] self.song().view.remove_selected_track_listener(self.trackControl.get_current_track) ##### Link the cutoffs for the Scene Effect Parameters def _linkCutoff(self, value): for device in self.song().tracks[self.current_track].devices: if device.name == "Scene Launch Effects": device.parameters[1].value = value def _setup_device_and_transport_control(self): is_momentary = True self.device_bank_buttons = [] self.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): self.device_bank_buttons.append(ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 58 + index)) self.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' ## Quirksmode ##### Link the cutoffs for the Scene Effect Parameters if (index == 0): ringed_encoder.add_value_listener(self._linkCutoff) self.device_param_controls.append(ringed_encoder) self.device = ShiftableDeviceComponent() self.device.name = 'Device_Component' self.device.set_bank_buttons(tuple(self.device_bank_buttons)) self.device.set_shift_button(self._shift_button) self.device.set_parameter_controls(tuple(self.device_param_controls)) self.device.set_on_off_button(self.device_bank_buttons[1]) self.set_device_component(self.device) self.detail_view_toggler = DetailViewCntrlComponent() self.detail_view_toggler.name = 'Detail_View_Control' self.detail_view_toggler.set_shift_button(self._shift_button) self.detail_view_toggler.set_device_clip_toggle_button(self.device_bank_buttons[0]) self.detail_view_toggler.set_detail_toggle_button(self.device_bank_buttons[4]) self.detail_view_toggler.set_device_nav_buttons(self.device_bank_buttons[2], self.device_bank_buttons[3]) self.transport = ShiftableTransportComponent(self) ## Quirksmode added self self.transport.name = 'Transport' self.play_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 91) self.play_button.name = 'Play_Button' self.stop_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 92) self.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) self.stop_button.name = 'Stop_Button' self.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' self.transport.set_shift_button(self._shift_button) self.transport.set_play_button(self.play_button) self.transport.set_stop_button(self.stop_button) self.transport.set_record_button(self.record_button) self.transport.set_nudge_buttons(nudge_up_button, nudge_down_button) self.transport.set_undo_button(nudge_down_button) #shifted nudge self.transport.set_redo_button(nudge_up_button) #shifted nudge self.transport.set_tap_tempo_button(tap_tempo_button) self.transport.set_quant_toggle_button(self.device_bank_buttons[5]) self.transport.set_overdub_button(self.device_bank_buttons[6]) self.transport.set_metronome_button(self.device_bank_buttons[7]) self._prehear_control = EncoderElement(MIDI_CC_TYPE, 0, 47, Live.MidiMap.MapMode.relative_two_compliment) self.transport.set_tempo_encoder(self._prehear_control) #shifted prehear bank_button_translator = ShiftTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(self.device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button) def _setup_global_control(self): is_momentary = True global_bank_buttons = [] self.global_param_controls = [] for index in range(8): ring_button = ButtonElement(not is_momentary, MIDI_CC_TYPE, 0, 56 + index) ringed_encoder = RingedEncoderElement(MIDI_CC_TYPE, 0, 48 + index, Live.MidiMap.MapMode.absolute) ringed_encoder.name = 'Track_Control_' + str(index) ring_button.name = ringed_encoder.name + '_Ring_Mode_Button' ringed_encoder.set_ring_mode_button(ring_button) self.global_param_controls.append(ringed_encoder) global_bank_buttons = [] global_bank_labels = ('Pan_Button', 'Send_A_Button', 'Send_B_Button', 'Send_C_Button') for index in range(4): global_bank_buttons.append(ButtonElement(not is_momentary, MIDI_NOTE_TYPE, 0, 87 + index)) global_bank_buttons[-1].name = global_bank_labels[index] self.encoder_modes = EncModeSelectorComponent(self._mixer) self.encoder_modes.name = 'Track_Control_Modes' self.encoder_modes.set_modes_buttons(global_bank_buttons) self.encoder_modes.set_controls(tuple(self.global_param_controls)) self.global_translation_selector = ChannelTranslationSelector() self.global_translation_selector.name = 'Global_Translations' self.global_translation_selector.set_controls_to_translate(tuple(self.global_param_controls)) self.global_translation_selector.set_mode_buttons(tuple(global_bank_buttons)) def _on_selected_track_changed(self): ControlSurface._on_selected_track_changed(self) ## Quirksmode if(self._newDjModeToggle_state): if self.application().view.is_view_visible('Detail/Clip'): self.application().view.show_view('Detail/DeviceChain') self.application().view.is_view_visible('Detail/DeviceChain') else: self.application().view.show_view('Detail/Clip') self.application().view.is_view_visible('Detail/Clip') if(self.song().view.selected_track != self.song().master_track): if (self.song().view.selected_track.playing_slot_index > -1): self.song().view.selected_scene = self.song().scenes[self.song().view.selected_track.playing_slot_index] track_index = 0 for track in self.song().tracks: if track == self.song().view.selected_track: break track_index += 1 self.current_track = track_index track = self.song().view.selected_track device_to_select = track.view.selected_device if device_to_select == None and len(track.devices) > 0: device_to_select = track.devices[0] if device_to_select != None: self.song().view.select_device(device_to_select) self._device_component.set_device(device_to_select) return None ######################### Utils # Get the current track def get_current_track(self): track_index = 0 for track in self.song().tracks: if track == self.song().view.selected_track: break track_index += 1 self.current_track = track_index # Get the device on the given track by the given name. def GetDeviceByName(self, trackIndex, deviceName): for device in self.song().tracks[trackIndex].devices: if (device.name == deviceName): return device return None # Get the value of the given device in the given track by the given parameter name. def GetDeviceParameter(self, device, paramName): for deviceParam in device.parameters: if (deviceParam.name == paramName): return deviceParam.value return None # Set the given parameter name of the given device to the given value. def SetDeviceParameter(self, device, paramName, value): for deviceParam in device.parameters: if (deviceParam.name == paramName): deviceParam.value = value pass # Toggles the given param of the given device. Usefull for on/off effects, etc. def ToggleDeviceParameter(self, device, paramName): for deviceParam in device.parameters: if (deviceParam.name == paramName): if (deviceParam.value == 1): deviceParam.value = 0 else: deviceParam.value = 1 pass # Returns if the given track has a triggered clip. def TrackHasTriggeredClip(self, track): for clipSlot in track.clip_slots: if (clipSlot.has_clip): if (clipSlot.clip.is_triggered): return True return False # Returns if the given track has a playing clip. def TrackHasPlayingClip(self, track): for clipSlot in track.clip_slots: if (clipSlot.has_clip): if (clipSlot.clip.is_playing): return True return False def _product_model_id_byte(self): return 115
def _setup_device_and_transport_control(self): is_momentary = True self.device_bank_buttons = [] self.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): self.device_bank_buttons.append(ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 58 + index)) self.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' ## Quirksmode ##### Link the cutoffs for the Scene Effect Parameters if (index == 0): ringed_encoder.add_value_listener(self._linkCutoff) self.device_param_controls.append(ringed_encoder) self.device = ShiftableDeviceComponent() self.device.name = 'Device_Component' self.device.set_bank_buttons(tuple(self.device_bank_buttons)) self.device.set_shift_button(self._shift_button) self.device.set_parameter_controls(tuple(self.device_param_controls)) self.device.set_on_off_button(self.device_bank_buttons[1]) self.set_device_component(self.device) self.detail_view_toggler = DetailViewCntrlComponent() self.detail_view_toggler.name = 'Detail_View_Control' self.detail_view_toggler.set_shift_button(self._shift_button) self.detail_view_toggler.set_device_clip_toggle_button(self.device_bank_buttons[0]) self.detail_view_toggler.set_detail_toggle_button(self.device_bank_buttons[4]) self.detail_view_toggler.set_device_nav_buttons(self.device_bank_buttons[2], self.device_bank_buttons[3]) self.transport = ShiftableTransportComponent(self) ## Quirksmode added self self.transport.name = 'Transport' self.play_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 91) self.play_button.name = 'Play_Button' self.stop_button = ButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, 92) self.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) self.stop_button.name = 'Stop_Button' self.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' self.transport.set_shift_button(self._shift_button) self.transport.set_play_button(self.play_button) self.transport.set_stop_button(self.stop_button) self.transport.set_record_button(self.record_button) self.transport.set_nudge_buttons(nudge_up_button, nudge_down_button) self.transport.set_undo_button(nudge_down_button) #shifted nudge self.transport.set_redo_button(nudge_up_button) #shifted nudge self.transport.set_tap_tempo_button(tap_tempo_button) self.transport.set_quant_toggle_button(self.device_bank_buttons[5]) self.transport.set_overdub_button(self.device_bank_buttons[6]) self.transport.set_metronome_button(self.device_bank_buttons[7]) self._prehear_control = EncoderElement(MIDI_CC_TYPE, 0, 47, Live.MidiMap.MapMode.relative_two_compliment) self.transport.set_tempo_encoder(self._prehear_control) #shifted prehear bank_button_translator = ShiftTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(self.device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)
def _setup_device_and_transport_control(self): is_momentary = True device_bank_buttons = [] device_param_controls = [] for index in range(8): device_bank_buttons.append(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[index])) device_param_controls.append(EncoderElement(MIDI_CC_TYPE, 0, KMK_ENCODER[index], Live.MidiMap.MapMode.relative_two_compliment)) global device # special component, inherits from ShiftableDeviceController and adds lcds device = kmkDisplayingDeviceComponent() 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]) device.set_lock_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_PAD[10])) parameter_displays = [] for index in range(8): parameter_displays.append(PhysicalDisplayElement(8, 1)) parameter_displays[-1].set_message_parts((SYSEX_KMK_HEADER + (KMK_LCD_COMMAND, 9, (index + 48))), (247,)) device_name_display = PhysicalDisplayElement(8,1) device_name_display.set_message_parts((SYSEX_KMK_HEADER + (KMK_LCD_COMMAND, 9, (8 + 32))), (247,)) device.set_display(parameter_displays, device_name_display) self.set_device_component(device) detail_view_toggler = DetailViewControllerComponent() 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]) detail_view_toggler.set_arrange_toggle_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[8])) detail_view_toggler.set_browser_toggle_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, 0, KMK_PAD[12])) transport = ShiftableTransportComponent() transport.set_shift_button(self._shift_button) transport.set_play_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[4])) transport.set_stop_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[5])) transport.set_record_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[3])) transport.set_seek_buttons(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[1]), SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[0])) transport.set_loop_button(SysexButtonElement(is_momentary, MIDI_NOTE_TYPE, CHANNEL, KMK_BUTTON[2])) 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 = ShiftableTranslatorComponent() bank_button_translator.set_controls_to_translate(tuple(device_bank_buttons)) bank_button_translator.set_shift_button(self._shift_button)