└── MIDI Remote Scripts ├── ADVANCE ├── Advance.py └── __init__.py ├── AIRA_MX_1 ├── Colors.py ├── ControlElementUtils.py ├── NotifyingMixerComponent.py ├── NotifyingSessionComponent.py ├── RolandMX1.py ├── SkinDefault.py └── __init__.py ├── APC20 ├── APC20.py ├── BackgroundComponent.py ├── ShiftableSelectorComponent.py ├── ShiftableZoomingComponent.py ├── SliderModesComponent.py ├── __init__.py └── consts.py ├── APC40 ├── APC40.py ├── SessionComponent.py ├── TransportComponent.py └── __init__.py ├── APC40_MkII ├── APC40_MkII.py ├── BankToggleComponent.py ├── Colors.py ├── MixerComponent.py ├── QuantizationComponent.py ├── TransportComponent.py └── __init__.py ├── APC_Key_25 ├── APC_Key_25.py ├── MixerComponent.py ├── SendToggleComponent.py └── __init__.py ├── APC_mini ├── APC_mini.py └── __init__.py ├── ATOM ├── __init__.py ├── atom.py ├── channel_strip.py ├── colors.py ├── drum_group.py ├── elements.py ├── keyboard.py ├── lighting.py ├── midi.py ├── mixer.py ├── note_pad.py ├── session.py ├── skin.py ├── translating_background.py └── view_toggle.py ├── ATOMSQ ├── __init__.py ├── atomsq.py ├── button_labels.py ├── channel_strip.py ├── colors.py ├── control.py ├── elements.py ├── launch_and_stop.py ├── midi.py ├── session.py ├── simple_device.py ├── simple_display.py ├── skin.py ├── touch_strip.py ├── translating_background.py ├── transport.py └── view_toggle.py ├── Akai_Force_MPC ├── __init__.py ├── akai_force_mpc.py ├── background.py ├── channel_strip.py ├── clip_actions.py ├── clip_slot.py ├── control.py ├── device.py ├── device_navigation.py ├── device_parameters.py ├── elements.py ├── live_colors.py ├── mixer.py ├── mode.py ├── multi_element.py ├── physical_display.py ├── ping_pong.py ├── scene.py ├── scene_list.py ├── session.py ├── session_navigation.py ├── session_recording.py ├── skin.py ├── sysex.py ├── sysex_element.py └── transport.py ├── Alesis_V ├── Alesis_V.py └── __init__.py ├── Alesis_VI ├── Alesis_VI.py └── __init__.py ├── Alesis_VX ├── Alesis_VX.py └── __init__.py ├── Axiom ├── __init__.py ├── config.py └── consts.py ├── AxiomPro ├── AxiomPro.py ├── DisplayingMixerComponent.py ├── EncoderMixerModeSelector.py ├── MixerOrDeviceModeSelector.py ├── NotifyingMixerComponent.py ├── PageableDeviceComponent.py ├── PeekableEncoderElement.py ├── SelectButtonModeSelector.py ├── TransportViewModeSelector.py └── __init__.py ├── Axiom_25_Classic ├── Axiom.py └── __init__.py ├── Axiom_49_61_Classic ├── Axiom.py ├── SliderSection.py └── __init__.py ├── Axiom_AIR_25_49_61 ├── Axiom_AIR_25_49_61.py ├── BestBankDeviceComponent.py ├── ConfigurableButtonElement.py ├── DeviceNavComponent.py ├── DisplayingChanStripComponent.py ├── EncoderModeSelector.py ├── FaderButtonModeSelector.py ├── FaderModeSelector.py ├── IdentifyingEncoderElement.py ├── MainModeSelector.py ├── NumericalDisplayElement.py ├── NumericalDisplaySegment.py ├── SingleFaderButtonModeSelector.py ├── SpecialMixerComponent.py ├── SpecialSessionComponent.py ├── TransportViewModeSelector.py ├── __init__.py └── consts.py ├── Axiom_AIR_Mini32 ├── AxiomAirMini32.py ├── DeviceNavComponent.py ├── EncoderMixerModeSelector.py ├── MixerOrDeviceModeSelector.py └── __init__.py ├── Axiom_DirectLink ├── Axiom_DirectLink.py ├── BestBankDeviceComponent.py ├── DetailViewCntrlComponent.py ├── PeekableEncoderElement.py ├── ShiftableMixerComponent.py ├── ShiftableSessionComponent.py ├── ShiftableTransportComponent.py ├── TransportViewModeSelector.py └── __init__.py ├── BCF2000 ├── __init__.py ├── config.py └── consts.py ├── BCR2000 ├── __init__.py ├── config.py └── consts.py ├── BLOCKS ├── __init__.py ├── blocks.py ├── button.py ├── colors.py ├── element_translator.py ├── mode.py ├── skin.py └── target_track_provider.py ├── BeatStep ├── BeatStep.py └── __init__.py ├── Blackstar_Live_Logic ├── __init__.py ├── blackstar_live_logic.py ├── clip_util.py ├── elements.py ├── footswitch_row_control.py ├── looper.py ├── midi.py ├── skin.py ├── time_display.py └── track_util.py ├── CTRL49 ├── __init__.py └── ctrl49.py ├── Code_Series ├── __init__.py ├── code.py ├── element_utils.py ├── mixer_navigation.py └── skin_default.py ├── FireOne ├── FireOne.py └── __init__.py ├── KONTROL49 ├── __init__.py ├── config.py └── consts.py ├── KeyFadr ├── KeyFadr.py └── __init__.py ├── KeyLab ├── DeviceNavigationComponent.py ├── DisplayElement.py ├── KeyLab.py ├── MixerComponent.py ├── SessionComponent.py └── __init__.py ├── KeyLab_88 ├── KeyLab88.py └── __init__.py ├── KeyLab_Essential ├── __init__.py ├── arrangement.py ├── channel_strip.py ├── clip_slot.py ├── control_element_utils.py ├── hardware_settings.py ├── keylab_essential.py ├── ringed_encoder.py ├── ringed_mapped_encoder_control.py ├── session.py ├── skin_default.py ├── sysex.py ├── transport.py ├── undo.py └── view_control.py ├── KeyLab_mkII ├── __init__.py ├── channel_strip.py ├── clip_slot.py ├── hardware_settings.py ├── keylab_mkii.py ├── mixer.py ├── session.py └── view_control.py ├── KeyPad ├── CombinedButtonsElement.py ├── CuePointControlComponent.py ├── KeyPad.py └── __init__.py ├── Keystation_Pro_88 ├── __init__.py ├── config.py └── consts.py ├── Komplete_Kontrol_A ├── __init__.py ├── komplete_kontrol_a.py └── view_control_component.py ├── Komplete_Kontrol_S_Mk2 ├── __init__.py ├── channel_strip_component.py ├── komplete_kontrol_s_mk2.py ├── meter_display_element.py ├── mixer_component.py ├── session_ring_navigation_component.py └── view_control_component.py ├── LPD8 ├── __init__.py ├── config.py └── consts.py ├── LV1_LX1 ├── LV1_LX1.py └── __init__.py ├── LV2_LX2_LC2_LD2 ├── Devices.py ├── DevicesXY.py ├── FaderfoxComponent.py ├── FaderfoxDeviceController.py ├── FaderfoxHelper.py ├── FaderfoxMixerController.py ├── FaderfoxScript.py ├── FaderfoxTransportController.py ├── LV2DeviceController.py ├── LV2MixerController.py ├── LV2TransportController.py ├── LV2_LX2_LC2_LD2.py ├── ParamMap.py ├── Params.py ├── __init__.py └── consts.py ├── Launch_Control ├── ButtonSysexControl.py ├── Colors.py ├── ConfigurableButtonElement.py ├── DeviceNavigationComponent.py ├── LaunchControl.py ├── SpecialMixerComponent.py ├── SpecialSessionComponent.py ├── Sysex.py └── __init__.py ├── Launch_Control_XL ├── ButtonElement.py ├── DeviceComponent.py ├── LaunchControlXL.py ├── MixerComponent.py ├── SkinDefault.py └── __init__.py ├── Launchkey ├── Launchkey.py ├── SessionNavigationComponent.py ├── SpecialMixerComponent.py ├── TransportViewModeSelector.py ├── __init__.py └── consts.py ├── Launchkey_MK2 ├── BackgroundComponent.py ├── Colors.py ├── ControlElementUtils.py ├── DeviceComponent.py ├── InControlStatusComponent.py ├── Launchkey_MK2.py ├── MixerComponent.py ├── ModeUtils.py ├── SessionComponent.py ├── Skin.py ├── __init__.py └── consts.py ├── Launchkey_MK3 ├── __init__.py ├── channel_strip.py ├── control.py ├── device.py ├── elements.py ├── launchkey_mk3.py ├── midi.py ├── mixer.py ├── notification.py ├── rgb_button.py ├── simple_display.py ├── skin.py └── transport.py ├── Launchkey_Mini ├── LaunchkeyMini.py └── __init__.py ├── Launchkey_Mini_MK3 ├── __init__.py ├── elements.py ├── launchkey_mini_mk3.py ├── midi.py ├── skin.py └── sysex_ids.py ├── Launchpad ├── ConfigurableButtonElement.py ├── DefChannelStripComponent.py ├── Launchpad.py ├── MainSelectorComponent.py ├── PreciseButtonSliderElement.py ├── SpecialMixerComponent.py ├── SpecialSessionComponent.py ├── SubSelectorComponent.py └── __init__.py ├── Launchpad_MK2 ├── BackgroundComponent.py ├── ChannelStripComponent.py ├── Colors.py ├── ComponentUtils.py ├── ControlElementUtils.py ├── Launchpad_MK2.py ├── MixerComponent.py ├── ModeUtils.py ├── SessionComponent.py ├── SessionZoomingComponent.py ├── Skin.py ├── SliderElement.py ├── __init__.py └── consts.py ├── Launchpad_Mini_MK3 ├── __init__.py ├── elements.py ├── launchpad_mini_mk3.py ├── notifying_background.py ├── skin.py └── sysex_ids.py ├── Launchpad_Pro ├── ActionsComponent.py ├── BackgroundComponent.py ├── ClipActionsComponent.py ├── Colors.py ├── ConfigurableButtonElement.py ├── DeviceNavigationComponent.py ├── DrumGroupComponent.py ├── DrumGroupFinderComponent.py ├── Launchpad_Pro.py ├── LedLightingComponent.py ├── MultiButtonElement.py ├── SkinDefault.py ├── SlideComponent.py ├── SliderElement.py ├── SpecialDeviceComponent.py ├── SpecialMidiMap.py ├── SpecialMixerComponent.py ├── SpecialModesComponent.py ├── SpecialSessionComponent.py ├── SpecialSessionRecordingComponent.py ├── TargetTrackComponent.py ├── TranslationComponent.py ├── UserMatrixComponent.py ├── __init__.py └── consts.py ├── Launchpad_Pro_MK3 ├── __init__.py ├── channel_strip.py ├── control.py ├── drum_group.py ├── elements.py ├── launchpad_pro_mk3.py ├── mixer.py ├── session.py ├── simple_device.py ├── skin.py ├── sysex_ids.py └── transport.py ├── Launchpad_X ├── __init__.py ├── channel_strip.py ├── elements.py ├── launchpad_x.py ├── session_recording.py ├── skin.py └── sysex_ids.py ├── MIDI_Mix ├── ControlElementUtils.py ├── MIDI_Mix.py ├── MixerComponent.py └── __init__.py ├── MPD18 ├── __init__.py ├── config.py └── consts.py ├── MPD218 ├── MPD218.py └── __init__.py ├── MPD226 ├── MPD226.py └── __init__.py ├── MPD232 ├── MPD232.py └── __init__.py ├── MPD24 ├── __init__.py ├── config.py └── consts.py ├── MPD32 ├── __init__.py ├── config.py └── consts.py ├── MPK225 ├── MPK225.py └── __init__.py ├── MPK249 ├── MPK249.py └── __init__.py ├── MPK25 ├── __init__.py ├── config.py └── consts.py ├── MPK261 ├── MPK261.py └── __init__.py ├── MPK49 ├── __init__.py ├── config.py └── consts.py ├── MPK61 ├── __init__.py ├── config.py └── consts.py ├── MPK88 ├── __init__.py ├── config.py └── consts.py ├── MPK_mini ├── __init__.py ├── config.py └── consts.py ├── MPK_mini_mkI ├── __init__.py ├── config.py └── consts.py ├── MPK_mini_mkII ├── __init__.py ├── config.py └── consts.py ├── MPK_mini_mkIII ├── __init__.py ├── config.py └── consts.py ├── MackieControl ├── ChannelStrip.py ├── ChannelStripController.py ├── MackieControl.py ├── MackieControlComponent.py ├── MainDisplay.py ├── MainDisplayController.py ├── SoftwareController.py ├── TimeDisplay.py ├── Transport.py ├── __init__.py └── consts.py ├── MackieControlXT ├── MackieControlXT.py └── __init__.py ├── MackieControl_Classic ├── ChannelStrip.py ├── ChannelStripController.py ├── MackieControl.py ├── MackieControlComponent.py ├── MainDisplay.py ├── MainDisplayController.py ├── SoftwareController.py ├── TimeDisplay.py ├── Transport.py ├── __init__.py └── consts.py ├── MasterControl ├── MasterControl.py └── __init__.py ├── MaxForLive ├── MaxForLive.py └── __init__.py ├── MidAir25 ├── __init__.py ├── config.py └── consts.py ├── MiniLab ├── MiniLab.py └── __init__.py ├── MiniLab_mkII ├── HardwareSettingsComponent.py ├── MiniLabMk2.py ├── SessionComponent.py └── __init__.py ├── Novation_Impulse ├── EncoderModeSelector.py ├── Novation_Impulse.py ├── PeekableEncoderElement.py ├── ShiftableTransportComponent.py ├── SpecialMixerComponent.py ├── TransportViewModeSelector.py └── __init__.py ├── O2 ├── __init__.py ├── config.py └── consts.py ├── OpenLabs ├── OpenLabs.py ├── SpecialDeviceComponent.py ├── SpecialTransportComponent.py └── __init__.py ├── Oxygen49_61 ├── __init__.py ├── config.py └── consts.py ├── Oxygen8 ├── __init__.py ├── config.py └── consts.py ├── Oxygen8v2 ├── __init__.py ├── config.py └── consts.py ├── Oxygen_3rd_Gen ├── Oxygen_3rd_Gen.py ├── SpecialMixerComponent.py ├── TransportViewModeSelector.py └── __init__.py ├── Oxygen_4th_Gen └── __init__.py ├── Oxygen_Pro ├── __init__.py ├── elements.py ├── oxygen_pro.py ├── session.py └── skin.py ├── Ozone ├── __init__.py ├── config.py └── consts.py ├── Ozonic ├── __init__.py ├── config.py └── consts.py ├── Photon_25 ├── __init__.py ├── config.py └── consts.py ├── Photon_X25 ├── __init__.py ├── config.py └── consts.py ├── ProjectMixIO ├── ProjectMixIO.py └── __init__.py ├── Push ├── __init__.py ├── actions.py ├── browser_component.py ├── browser_model.py ├── browser_model_factory.py ├── browser_query.py ├── device_component.py ├── device_navigation_component.py ├── drum_group_component.py ├── elements.py ├── firmware_handling.py ├── global_pad_parameters.py ├── handshake_component.py ├── mode_behaviours.py ├── multi_entry_mode.py ├── navigation_node.py ├── notification_component.py ├── pad_sensitivity.py ├── parameter_mapping_sensitivities.py ├── push.py ├── quantization_settings.py ├── scales_component.py ├── selected_track_parameter_provider.py ├── settings.py ├── special_chan_strip_component.py ├── special_mixer_component.py ├── special_physical_display.py ├── sysex.py ├── user_settings_component.py └── with_priority.py ├── Push2 ├── __init__.py ├── actions.py ├── auto_filter.py ├── automation.py ├── bank_selection_component.py ├── browser_component.py ├── browser_item.py ├── browser_list.py ├── browser_modes.py ├── chain_selection_component.py ├── channel_eq.py ├── clip_control.py ├── clip_decoration.py ├── color_chooser.py ├── colors.py ├── compressor.py ├── convert.py ├── custom_bank_definitions.py ├── decoration.py ├── delay.py ├── device_component.py ├── device_component_provider.py ├── device_decoration.py ├── device_decorator_factory.py ├── device_navigation.py ├── device_options.py ├── device_parameter_bank_with_options.py ├── device_parameter_icons.py ├── device_util.py ├── device_view_component.py ├── drum_group_component.py ├── drum_pad_parameter_component.py ├── echo.py ├── elements.py ├── eq8.py ├── firmware.py ├── hardware_settings_component.py ├── item_lister.py ├── master_track.py ├── mixable_utilities.py ├── mixer_control_component.py ├── mode_collector.py ├── model │ ├── __init__.py │ ├── declaration.py │ ├── generation.py │ ├── repr.py │ └── uniqueid.py ├── mute_solo_stop.py ├── note_editor.py ├── note_settings.py ├── notification_component.py ├── operator.py ├── pad_sensitivity.py ├── pad_velocity_curve.py ├── parameter_mapping_sensitivities.py ├── push2.py ├── push2_model.py ├── real_time_channel.py ├── routing.py ├── scales_component.py ├── selected_track_parameter_provider.py ├── session_component.py ├── session_ring_selection_linking.py ├── settings.py ├── setup_component.py ├── simple_mode_switcher.py ├── simpler.py ├── skin_default.py ├── sliced_simpler.py ├── sysex.py ├── timeline_navigation.py ├── track_list.py ├── track_mixer_control_component.py ├── track_selection.py ├── transport_state.py ├── user_component.py ├── visualisation_settings.py └── wavetable.py ├── Radium49_61 ├── __init__.py ├── config.py └── consts.py ├── RemoteSL ├── DisplayController.py ├── EffectController.py ├── MixerController.py ├── RemoteSL.py ├── RemoteSLComponent.py ├── __init__.py └── consts.py ├── RemoteSL_Classic ├── DisplayController.py ├── EffectController.py ├── MixerController.py ├── RemoteSL.py ├── RemoteSLComponent.py ├── __init__.py └── consts.py ├── Roland_A_PRO ├── DeviceNavigationComponent.py ├── MixerComponent.py ├── Roland_A_PRO.py └── __init__.py ├── Roland_FA ├── __init__.py ├── control_element_utils.py ├── fa.py ├── navigation.py ├── scroll.py ├── skin.py └── transport.py ├── SL_MkIII ├── __init__.py ├── actions.py ├── caching_control_element.py ├── channel_strip.py ├── color_sysex_element.py ├── control.py ├── device.py ├── device_navigation.py ├── device_parameters.py ├── elements.py ├── message.py ├── messenger.py ├── midi_message_cache.py ├── mixer.py ├── mode.py ├── parameter_mapping_sensitivities.py ├── physical_display.py ├── session.py ├── session_navigation.py ├── session_ring_selection_linking.py ├── skin.py ├── sl_mkiii.py ├── sysex.py ├── transport.py └── util.py ├── Tranzport ├── Tranzport.py ├── __init__.py └── consts.py ├── TriggerFinger ├── __init__.py ├── config.py └── consts.py ├── UC33e ├── __init__.py ├── config.py └── consts.py ├── VCM600 ├── MixerComponent.py ├── TrackEQComponent.py ├── TrackFilterComponent.py ├── TransportComponent.py ├── VCM600.py ├── ViewTogglerComponent.py └── __init__.py ├── ZERO8 ├── __init__.py ├── config.py └── consts.py ├── _APC ├── APC.py ├── ControlElementUtils.py ├── DetailViewCntrlComponent.py ├── DeviceBankButtonElement.py ├── DeviceComponent.py ├── MixerComponent.py ├── RingedEncoderElement.py ├── SessionComponent.py ├── SkinDefault.py └── __init__.py ├── _Arturia ├── ArturiaControlSurface.py ├── MixerComponent.py ├── ScrollComponent.py ├── SessionComponent.py └── __init__.py ├── _Axiom ├── Encoders.py ├── Pads.py ├── Transport.py ├── __init__.py └── consts.py ├── _Framework ├── BackgroundComponent.py ├── ButtonElement.py ├── ButtonMatrixElement.py ├── ButtonSliderElement.py ├── Capabilities.py ├── ChannelStripComponent.py ├── ChannelTranslationSelector.py ├── ClipCreator.py ├── ClipSlotComponent.py ├── ComboElement.py ├── CompoundComponent.py ├── CompoundElement.py ├── Control.py ├── ControlElement.py ├── ControlSurface.py ├── ControlSurfaceComponent.py ├── Defaults.py ├── Dependency.py ├── DeviceBankRegistry.py ├── DeviceComponent.py ├── Disconnectable.py ├── DisplayDataSource.py ├── DrumGroupComponent.py ├── DrumRackComponent.py ├── EncoderElement.py ├── IdentifiableControlSurface.py ├── InputControlElement.py ├── Layer.py ├── LogicalDisplaySegment.py ├── MessageScheduler.py ├── MidiMap.py ├── MixerComponent.py ├── ModeSelectorComponent.py ├── ModesComponent.py ├── MomentaryModeObserver.py ├── NotifyingControlElement.py ├── OptionalElement.py ├── PhysicalDisplayElement.py ├── Profile.py ├── Proxy.py ├── Resource.py ├── SceneComponent.py ├── ScrollComponent.py ├── SessionComponent.py ├── SessionRecordingComponent.py ├── SessionZoomingComponent.py ├── Signal.py ├── Skin.py ├── SlideComponent.py ├── SliderElement.py ├── SubjectSlot.py ├── SysexValueControl.py ├── Task.py ├── ToggleComponent.py ├── TrackArmState.py ├── TransportComponent.py ├── Util.py ├── ViewControlComponent.py └── __init__.py ├── _Generic ├── Devices.py ├── GenericScript.py ├── SelectChanStripComponent.py ├── SpecialMixerComponent.py ├── __init__.py ├── testing │ ├── __init__.py │ └── util.py └── util.py ├── _Komplete_Kontrol ├── __init__.py ├── channel_strip_component.py ├── clip_launch_component.py ├── control_element_util.py ├── detail_clip_component.py ├── focus_follow_component.py ├── komplete_kontrol_base.py ├── mixer_component.py ├── physical_display_element.py ├── selection_linked_session_ring_component.py ├── skin.py ├── sysex.py └── transport_component.py ├── _MPDMkIIBase ├── ControlElementUtils.py ├── MPDMkIIBase.py └── __init__.py ├── _MxDCore ├── LomTypes.py ├── LomUtils.py ├── MxDControlSurfaceAPI.py ├── MxDCore.py ├── MxDUtils.py └── __init__.py ├── _Tools └── __init__.py ├── _UserScript └── __init__.py ├── ableton ├── __init__.py └── v2 │ ├── __init__.py │ ├── base │ ├── __init__.py │ ├── collection │ │ ├── __init__.py │ │ └── indexed_dict.py │ ├── dependency.py │ ├── disconnectable.py │ ├── event.py │ ├── gcutil.py │ ├── isclose.py │ ├── live_api_utils.py │ ├── proxy.py │ ├── signal.py │ ├── task.py │ └── util.py │ └── control_surface │ ├── __init__.py │ ├── banking_util.py │ ├── capabilities.py │ ├── clip_creator.py │ ├── component.py │ ├── components │ ├── __init__.py │ ├── accent.py │ ├── auto_arm.py │ ├── background.py │ ├── channel_strip.py │ ├── clip_actions.py │ ├── clip_slot.py │ ├── device.py │ ├── device_navigation.py │ ├── device_parameters.py │ ├── drum_group.py │ ├── item_lister.py │ ├── mixer.py │ ├── playable.py │ ├── scene.py │ ├── scroll.py │ ├── session.py │ ├── session_navigation.py │ ├── session_overview.py │ ├── session_recording.py │ ├── session_ring.py │ ├── slide.py │ ├── target_track.py │ ├── toggle.py │ ├── transport.py │ ├── undo_redo.py │ └── view_control.py │ ├── compound_element.py │ ├── control │ ├── __init__.py │ ├── button.py │ ├── control.py │ ├── control_list.py │ ├── encoder.py │ ├── mapped.py │ ├── radio_button.py │ ├── sysex.py │ ├── text_display.py │ └── toggle_button.py │ ├── control_element.py │ ├── control_surface.py │ ├── decoration.py │ ├── default_bank_definitions.py │ ├── defaults.py │ ├── delay_decoration.py │ ├── device_bank_registry.py │ ├── device_chain_utils.py │ ├── device_decorator_factory.py │ ├── device_parameter_bank.py │ ├── device_provider.py │ ├── elements │ ├── __init__.py │ ├── button.py │ ├── button_matrix.py │ ├── button_slider.py │ ├── color.py │ ├── combo.py │ ├── display_data_source.py │ ├── encoder.py │ ├── full_velocity_element.py │ ├── logical_display_segment.py │ ├── optional.py │ ├── physical_display.py │ ├── playhead_element.py │ ├── proxy_element.py │ ├── slider.py │ ├── sysex_element.py │ └── velocity_levels_element.py │ ├── identifiable_control_surface.py │ ├── input_control_element.py │ ├── internal_parameter.py │ ├── layer.py │ ├── message_scheduler.py │ ├── midi.py │ ├── midi_map.py │ ├── mode.py │ ├── parameter_provider.py │ ├── parameter_slot_description.py │ ├── percussion_instrument_finder.py │ ├── profile.py │ ├── resource.py │ ├── session_ring_selection_linking.py │ ├── simpler_decoration.py │ ├── simpler_slice_nudging.py │ ├── skin.py │ └── wavetable_decoration.py ├── iRig_Keys_IO ├── __init__.py ├── irig_keys_io.py ├── mixer.py ├── scroll.py ├── session_recording.py ├── session_ring.py └── skin.py ├── microKONTROL ├── __init__.py ├── config.py └── consts.py ├── novation ├── __init__.py ├── blinking_button.py ├── channel_strip.py ├── clip_actions.py ├── clip_slot.py ├── colors.py ├── configurable_playable.py ├── drum_group.py ├── fixed_length.py ├── fixed_length_recording.py ├── fixed_radio_button_group.py ├── instrument_control.py ├── launchkey_drum_group.py ├── launchkey_elements.py ├── launchpad_elements.py ├── mixer.py ├── mode.py ├── novation_base.py ├── print_to_clip.py ├── quantization.py ├── session_modes.py ├── session_navigation.py ├── simple_device.py ├── simple_device_navigation.py ├── skin.py ├── sysex.py ├── testing │ ├── __init__.py │ └── control_surface_test_base.py ├── track_recording.py ├── transport.py ├── util.py └── view_control.py ├── padKONTROL ├── __init__.py ├── config.py └── consts.py └── pushbase ├── __init__.py ├── action_with_options_component.py ├── actions.py ├── auto_arm_component.py ├── automation_component.py ├── browser_modes.py ├── browser_util.py ├── clip_control_component.py ├── colors.py ├── consts.py ├── control_element_factory.py ├── device_chain_utils.py ├── device_parameter_component.py ├── drum_group_component.py ├── elements.py ├── fixed_length.py ├── grid_resolution.py ├── instrument_component.py ├── internal_parameter.py ├── loop_selector_component.py ├── matrix_maps.py ├── melodic_component.py ├── melodic_pattern.py ├── message_box_component.py ├── messenger_mode_component.py ├── mixer_utils.py ├── note_editor_component.py ├── note_editor_paginator.py ├── note_layout_switcher.py ├── note_repeat_component.py ├── note_settings_component.py ├── pad_button_element.py ├── pad_control.py ├── pad_sensitivity.py ├── playhead_component.py ├── push_base.py ├── quantization_component.py ├── scrollable_list.py ├── scrollable_list_component.py ├── select_playing_clip_component.py ├── selected_track_parameter_provider.py ├── selection.py ├── session_recording_component.py ├── setting.py ├── skin_default.py ├── sliced_simpler_component.py ├── slideable_touch_strip_component.py ├── song_utils.py ├── special_session_component.py ├── step_duplicator.py ├── step_seq_component.py ├── sysex.py ├── touch_encoder_element.py ├── touch_strip_controller.py ├── touch_strip_element.py ├── track_frozen_mode.py ├── transport_component.py ├── undo_step_handler.py ├── user_component.py ├── value_component.py └── velocity_levels_component.py /MIDI Remote Scripts/ADVANCE/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .Advance import Advance 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=2536, product_ids=[46, 47, 48], model_name=[u'ADVANCE25', u'ADVANCE49', u'ADVANCE61']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Advance(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/AIRA_MX_1/Colors.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ButtonElement import Color 3 | BLINK_LED_CHANNEL = 14 4 | 5 | class Blink(Color): 6 | 7 | def draw(self, interface): 8 | interface.send_value(self.midi_value) 9 | interface.send_value(0, channel=BLINK_LED_CHANNEL) 10 | 11 | 12 | class Rgb: 13 | BLACK = Color(0) 14 | RED = Color(5) 15 | RED_BLINK = Blink(5) 16 | GREEN_HALF = Color(20) 17 | GREEN = Color(21) 18 | GREEN_BLINK = Blink(21) 19 | BLUE_HALF = Color(44) 20 | BLUE = Color(45) 21 | BLUE_BLINK = Blink(45) 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/AIRA_MX_1/ControlElementUtils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.Resource import PrioritizedResource 4 | from _Framework.Dependency import depends 5 | from _Framework.InputControlElement import MIDI_NOTE_TYPE, MIDI_CC_TYPE 6 | from _Framework.ComboElement import ComboElement 7 | from _Framework.ButtonElement import ButtonElement 8 | from _Framework.EncoderElement import EncoderElement 9 | 10 | @depends(skin=None) 11 | def make_button(name, identifier, channel = 0, msg_type = MIDI_NOTE_TYPE, is_momentary = True, is_modifier = False, skin = None): 12 | return ButtonElement(is_momentary, msg_type, channel, identifier, name=name, resource_type=PrioritizedResource if is_modifier else None, skin=skin) 13 | 14 | 15 | def make_encoder(name, identifier, channel = 0): 16 | return EncoderElement(MIDI_CC_TYPE, channel, identifier, Live.MidiMap.MapMode.absolute, name=name) 17 | 18 | 19 | def with_modifier(control, modifier): 20 | return ComboElement(control, modifiers=[modifier], name=control.name + u'_With_Modifier') 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/AIRA_MX_1/SkinDefault.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Skin import Skin 3 | from .Colors import Rgb 4 | 5 | class Colors: 6 | 7 | class Session: 8 | ClipEmpty = Rgb.BLACK 9 | ClipStopped = Rgb.GREEN_HALF 10 | ClipStarted = Rgb.GREEN 11 | ClipRecording = Rgb.RED 12 | ClipTriggeredPlay = Rgb.GREEN_BLINK 13 | ClipTriggeredRecord = Rgb.RED_BLINK 14 | NoScene = Rgb.BLACK 15 | Scene = Rgb.BLUE_HALF 16 | SceneTriggered = Rgb.BLUE_BLINK 17 | ScenePlaying = Rgb.BLUE 18 | StopClip = Rgb.RED 19 | StopClipTriggered = Rgb.RED_BLINK 20 | 21 | 22 | def make_default_skin(): 23 | return Skin(Colors) 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/AIRA_MX_1/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, SCRIPT, controller_id, inport, outport 3 | from .RolandMX1 import RolandMX1 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1410, product_ids=[419], model_name=[u'MX-1']), 7 | PORTS_KEY: [inport(props=[]), 8 | inport(props=[SCRIPT]), 9 | outport(props=[]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return RolandMX1(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC20/BackgroundComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.BackgroundComponent import BackgroundComponent as BackgroundComponentBase 3 | from _Framework.Util import nop 4 | 5 | class BackgroundComponent(BackgroundComponentBase): 6 | 7 | def _clear_control(self, name, control): 8 | if control: 9 | control.add_value_listener(nop) 10 | elif name in self._control_map: 11 | self._control_map[name].remove_value_listener(nop) 12 | super(BackgroundComponent, self)._clear_control(name, control) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC20/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE, controller_id, inport, outport 3 | from .APC20 import APC20 4 | 5 | def create_instance(c_instance): 6 | u""" Creates and returns the APC20 script """ 7 | return APC20(c_instance) 8 | 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[123], model_name=u'Akai APC20'), 12 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC20/consts.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | MANUFACTURER_ID = 71 3 | ABLETON_MODE = 65 4 | NOTE_MODE = 67 5 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC40/SessionComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Control import ButtonControl 3 | from _APC.SessionComponent import SessionComponent as SessionComponentBase 4 | 5 | class SessionComponent(SessionComponentBase): 6 | u""" Special SessionComponent with a button (pedal) to fire the selected clip slot """ 7 | slot_launch_button = ButtonControl() 8 | selected_scene_launch_button = ButtonControl() 9 | 10 | def set_slot_launch_button(self, button): 11 | self.slot_launch_button.set_control_element(button) 12 | 13 | @slot_launch_button.pressed 14 | def slot_launch_button(self, button): 15 | clip_slot = self.song().view.highlighted_clip_slot 16 | if clip_slot: 17 | clip_slot.fire() 18 | 19 | def set_selected_scene_launch_button(self, button): 20 | self.selected_scene_launch_button.set_control_element(button) 21 | 22 | @selected_scene_launch_button.pressed 23 | def selected_scene_launch_button(self, button): 24 | scene = self.song().view.selected_scene 25 | if scene: 26 | scene.fire() 27 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC40/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE, controller_id, inport, outport 3 | from .APC40 import APC40 4 | 5 | def create_instance(c_instance): 6 | return APC40(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[115], model_name=u'Akai APC40'), 11 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC40_MkII/BankToggleComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ComboElement import ToggleElement 3 | from _Framework.Control import ToggleButtonControl 4 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 5 | 6 | class BankToggleComponent(ControlSurfaceComponent): 7 | bank_toggle_button = ToggleButtonControl() 8 | 9 | def __init__(self, *a, **k): 10 | super(BankToggleComponent, self).__init__(*a, **k) 11 | self._toggle_elements = [] 12 | 13 | @bank_toggle_button.toggled 14 | def bank_toggle_button(self, toggled, button): 15 | for e in self._toggle_elements: 16 | e.set_toggled(toggled) 17 | 18 | def create_toggle_element(self, *a, **k): 19 | element = ToggleElement(*a, **k) 20 | element.toggled = self.bank_toggle_button.is_toggled 21 | self._toggle_elements.append(element) 22 | return element 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC40_MkII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, SYNC, REMOTE, controller_id, inport, outport 3 | from .APC40_MkII import APC40_MkII 4 | 5 | def create_instance(c_instance): 6 | return APC40_MkII(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[41], model_name=u'Akai APC40 MkII'), 11 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SYNC, SCRIPT, REMOTE])]} 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC_Key_25/MixerComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _APC.MixerComponent import MixerComponent as MixerComponentBase 3 | from _APC.MixerComponent import ChanStripComponent as ChanStripComponentBase 4 | from _Framework.Util import nop 5 | 6 | class ChanStripComponent(ChanStripComponentBase): 7 | 8 | def __init__(self, *a, **k): 9 | self.reset_button_on_exchange = nop 10 | super(ChanStripComponent, self).__init__(*a, **k) 11 | 12 | 13 | class MixerComponent(MixerComponentBase): 14 | 15 | def on_num_sends_changed(self): 16 | if self.send_index is None and self.num_sends > 0: 17 | self.send_index = 0 18 | 19 | def _create_strip(self): 20 | return ChanStripComponent() 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC_Key_25/SendToggleComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Control import ButtonControl 3 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 4 | 5 | class SendToggleComponent(ControlSurfaceComponent): 6 | toggle_control = ButtonControl() 7 | 8 | def __init__(self, mixer, *args, **kwargs): 9 | super(SendToggleComponent, self).__init__(*args, **kwargs) 10 | self.mixer = mixer 11 | self.last_number_of_sends = self.mixer.num_sends 12 | self.set_toggle_button = self.toggle_control.set_control_element 13 | 14 | def inc_send_index(self): 15 | if self.mixer.num_sends: 16 | self.mixer.send_index = (self.mixer.send_index + 1) % self.mixer.num_sends 17 | 18 | @toggle_control.pressed 19 | def toggle_button_pressed(self, _button): 20 | self.inc_send_index() 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC_Key_25/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE, controller_id, inport, outport 3 | from .APC_Key_25 import APC_Key_25 4 | 5 | def create_instance(c_instance): 6 | return APC_Key_25(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[39], model_name=u'APC Key 25'), 11 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/APC_mini/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE, controller_id, inport, outport 3 | from .APC_mini import APC_mini 4 | 5 | def create_instance(c_instance): 6 | return APC_mini(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[40], model_name=u'APC MINI'), 11 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 3 | from .atom import ATOM 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=6479, product_ids=[518], model_name=[u'ATOM']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[NOTES_CC, 8 | SYNC, 9 | SCRIPT, 10 | REMOTE])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return ATOM(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import ChannelStripComponent as ChannelStripComponentBase 4 | 5 | class ChannelStripComponent(ChannelStripComponentBase): 6 | empty_color = u'Mixer.EmptyTrack' 7 | 8 | def _update_select_button(self): 9 | if liveobj_valid(self._track) and self.song.view.selected_track == self._track: 10 | self.select_button.color = u'Mixer.Selected' 11 | else: 12 | self.select_button.color = u'DefaultButton.Off' 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/lighting.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Component 3 | from ableton.v2.control_surface.control import ButtonControl 4 | 5 | class LightingComponent(Component): 6 | shift_button = ButtonControl(color=u'DefaultButton.Off', pressed_color=u'DefaultButton.On') 7 | zoom_button = ButtonControl(color=u'DefaultButton.Off', pressed_color=u'DefaultButton.On') 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/midi.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | NATIVE_MODE_ON_MESSAGE = (143, 0, 127) 3 | NATIVE_MODE_OFF_MESSAGE = (143, 0, 0) 4 | RED_MIDI_CHANNEL = 1 5 | GREEN_MIDI_CHANNEL = 2 6 | BLUE_MIDI_CHANNEL = 3 7 | KEYBOARD_CHANNEL = 2 8 | DRUM_CHANNEL = 10 9 | USER_CHANNEL = 15 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/mixer.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import MixerComponent as MixerComponentBase 3 | 4 | class MixerComponent(MixerComponentBase): 5 | 6 | def set_send_a_controls(self, controls): 7 | self._set_send_controls(controls, 0) 8 | 9 | def set_send_b_controls(self, controls): 10 | self._set_send_controls(controls, 1) 11 | 12 | def _set_send_controls(self, controls, send_index): 13 | if controls: 14 | for index, control in enumerate(controls): 15 | if control: 16 | self.channel_strip(index).set_send_controls((None,) * send_index + (control,)) 17 | 18 | else: 19 | for strip in self._channel_strips: 20 | strip.set_send_controls(None) 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/note_pad.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import PlayableControl 3 | 4 | class NotePadMixin(object): 5 | 6 | def set_matrix(self, matrix): 7 | super(NotePadMixin, self).set_matrix(matrix) 8 | for button in self.matrix: 9 | button.set_mode(PlayableControl.Mode.playable_and_listenable) 10 | button.pressed_color = u'NotePad.Pressed' 11 | 12 | def _on_matrix_pressed(self, _): 13 | pass 14 | 15 | def _on_matrix_released(self, button): 16 | self._update_button_color(button) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOM/session.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import ClipSlotComponent as ClipSlotComponentBase, SceneComponent as SceneComponentBase, SessionComponent as SessionComponentBase 4 | from .colors import LIVE_COLOR_INDEX_TO_RGB 5 | 6 | class ClipSlotComponent(ClipSlotComponentBase): 7 | 8 | def _color_value(self, slot_or_clip): 9 | return LIVE_COLOR_INDEX_TO_RGB.get(slot_or_clip.color_index, 0) 10 | 11 | 12 | class SceneComponent(SceneComponentBase): 13 | clip_slot_component_type = ClipSlotComponent 14 | 15 | def _color_value(self, color): 16 | if liveobj_valid(self._scene): 17 | return LIVE_COLOR_INDEX_TO_RGB.get(self._scene.color_index, 0) 18 | return 0 19 | 20 | 21 | class SessionComponent(SessionComponentBase): 22 | scene_component_type = SceneComponent 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOMSQ/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 3 | from .atomsq import ATOMSQ 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=6479, product_ids=[522], model_name=[u'ATM SQ']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[NOTES_CC, 8 | SYNC, 9 | SCRIPT, 10 | REMOTE])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return ATOMSQ(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOMSQ/button_labels.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Component 3 | from ableton.v2.control_surface.control import control_list 4 | from .control import DisplayControl 5 | BUTTON_LABELS_MAP = {u'song': (u'Solo', u'Mute', u'Arm', u'Clip', u'Scene', u'Stop'), 6 | u'instrument': (u'-', u'-', u'-', u'-', u'-', u'-'), 7 | u'editor': (u'Lock', u'< Device', u'Device >', u'On/Off', u'< Bank', u'Bank >'), 8 | u'user': (u'User 1', u'User 2', u'User 3', u'User 4', u'User 5', u'User 6')} 9 | 10 | class ButtonLabelsComponent(Component): 11 | display_lines = control_list(DisplayControl, control_count=6) 12 | 13 | def show_button_labels_for_mode(self, mode_name): 14 | if mode_name in BUTTON_LABELS_MAP: 15 | for display, text in zip(self.display_lines, BUTTON_LABELS_MAP[mode_name]): 16 | display.message = text 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOMSQ/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import ChannelStripComponent as ChannelStripComponentBase 4 | from .control import DisplayControl 5 | 6 | class ChannelStripComponent(ChannelStripComponentBase): 7 | track_name_display = DisplayControl() 8 | 9 | def _update_track_name_data_source(self): 10 | self.track_name_display.message = self._track.name if liveobj_valid(self._track) else u' - ' 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOMSQ/midi.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | NATIVE_MODE_ON_MESSAGE = (143, 0, 1) 3 | NATIVE_MODE_OFF_MESSAGE = (143, 0, 0) 4 | RED_MIDI_CHANNEL = 1 5 | GREEN_MIDI_CHANNEL = 2 6 | BLUE_MIDI_CHANNEL = 3 7 | USER_MODE_START_CHANNEL = 10 8 | SYSEX_START_BYTE = 240 9 | SYSEX_END_BYTE = 247 10 | SYSEX_HEADER = (SYSEX_START_BYTE, 11 | 0, 12 | 1, 13 | 6, 14 | 34) 15 | DISPLAY_HEADER = SYSEX_HEADER + (18,) 16 | LOWER_FIRMWARE_TOGGLE_HEADER = SYSEX_HEADER + (19,) 17 | UPPER_FIRMWARE_TOGGLE_HEADER = SYSEX_HEADER + (20,) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ATOMSQ/session.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import ClipSlotComponent as ClipSlotComponentBase, SceneComponent as SceneComponentBase, SessionComponent as SessionComponentBase 4 | from .colors import LIVE_COLOR_INDEX_TO_RGB 5 | 6 | class ClipSlotComponent(ClipSlotComponentBase): 7 | 8 | def _color_value(self, slot_or_clip): 9 | return LIVE_COLOR_INDEX_TO_RGB.get(slot_or_clip.color_index, 0) 10 | 11 | 12 | class SceneComponent(SceneComponentBase): 13 | clip_slot_component_type = ClipSlotComponent 14 | 15 | def _color_value(self, color): 16 | if liveobj_valid(self._scene): 17 | return LIVE_COLOR_INDEX_TO_RGB.get(self._scene.color_index, 0) 18 | return 0 19 | 20 | 21 | class SessionComponent(SessionComponentBase): 22 | scene_component_type = SceneComponent 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import NOTES_CC, PORTS_KEY, SUGGESTED_PORT_NAMES_KEY, REMOTE, SCRIPT, inport, outport 3 | from .akai_force_mpc import Akai_Force_MPC 4 | 5 | def get_capabilities(): 6 | return {SUGGESTED_PORT_NAMES_KEY: [u'Akai Network - DAW Control'], 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[NOTES_CC, SCRIPT, REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Akai_Force_MPC(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/background.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import BackgroundComponent 3 | 4 | class LightingBackgroundComponent(BackgroundComponent): 5 | 6 | def _clear_control(self, name, control): 7 | super(LightingBackgroundComponent, self)._clear_control(name, control) 8 | if control: 9 | control.set_light(u'Background.On') 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/mode.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.mode import Mode 3 | 4 | class ExtendComboElementMode(Mode): 5 | 6 | def __init__(self, combo_pairs = None, *a, **k): 7 | super(ExtendComboElementMode, self).__init__(*a, **k) 8 | self._combo_pairs = combo_pairs 9 | 10 | def enter_mode(self): 11 | for combo, nested in self._combo_pairs: 12 | combo.register_control_element(nested) 13 | 14 | def leave_mode(self): 15 | for combo, nested in self._combo_pairs: 16 | combo.unregister_control_element(nested) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/multi_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.elements import MultiElement as MultiElementBase 3 | 4 | class MultiElement(MultiElementBase): 5 | 6 | def __init__(self, *a, **k): 7 | super(MultiElement, self).__init__(*a, **k) 8 | self._parameter_to_map_to = None 9 | 10 | @property 11 | def touch_element(self): 12 | for control in self.owned_control_elements(): 13 | if hasattr(control, u'touch_element'): 14 | return control.touch_element 15 | 16 | def connect_to(self, parameter): 17 | self._parameter_to_map_to = parameter 18 | for control in self.owned_control_elements(): 19 | control.connect_to(parameter) 20 | 21 | def release_parameter(self): 22 | self._parameter_to_map_to = None 23 | for control in self.owned_control_elements(): 24 | control.release_parameter() 25 | 26 | def mapped_parameter(self): 27 | return self._parameter_to_map_to 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/physical_display.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from itertools import chain, izip, starmap 3 | from ableton.v2.base import clamp, group 4 | from ableton.v2.control_surface.elements import PhysicalDisplayElement as PhysicalDisplayElementBase 5 | 6 | def message_length(message): 7 | length = len(message) 8 | return (clamp(length // 128, 0, 127), length % 128) 9 | 10 | 11 | class PhysicalDisplayElement(PhysicalDisplayElementBase): 12 | 13 | def _build_display_message(self, display): 14 | message_string = display.display_string.strip() 15 | return chain(message_length(message_string), self._translate_string(message_string)) 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/session_navigation.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionNavigationComponent as SessionNavigationComponentBase 3 | 4 | class SessionNavigationComponent(SessionNavigationComponentBase): 5 | 6 | def __init__(self, *a, **k): 7 | super(SessionNavigationComponent, self).__init__(*a, **k) 8 | for scroll_component in (self._vertical_banking, 9 | self._horizontal_banking, 10 | self._vertical_paginator, 11 | self._horizontal_paginator): 12 | for button in (scroll_component.scroll_up_button, scroll_component.scroll_down_button): 13 | button.color = u'Navigation.Enabled' 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/session_recording.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionRecordingComponent as SessionRecordingComponentBase 3 | from ableton.v2.control_surface.control import ToggleButtonControl 4 | 5 | class SessionRecordingComponent(SessionRecordingComponentBase): 6 | mpc_automation_toggle = ToggleButtonControl(toggled_color=u'Automation.On', untoggled_color=u'Automation.Off') 7 | 8 | def _on_session_automation_record_changed(self): 9 | super(SessionRecordingComponent, self)._on_session_automation_record_changed() 10 | self.mpc_automation_toggle.is_toggled = self.song.session_automation_record 11 | 12 | @mpc_automation_toggle.toggled 13 | def mpc_automation_toggle(self, is_toggled, _): 14 | self.song.session_automation_record = is_toggled 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | SYSEX_MSG_HEADER = (240, 71, 0) 3 | SYSEX_END_BYTE = 247 4 | MPC_X_PRODUCT_ID = 58 5 | MPC_LIVE_PRODUCT_ID = 59 6 | FORCE_PRODUCT_ID = 64 7 | SUPPORTED_PRODUCT_IDS = (MPC_LIVE_PRODUCT_ID, MPC_X_PRODUCT_ID, FORCE_PRODUCT_ID) 8 | BROADCAST_ID = 127 9 | PING_MSG_TYPE = 0 10 | PONG_MSG_TYPE = 1 11 | TEXT_MSG_TYPE = 16 12 | COLOR_MSG_TYPE = 17 13 | PING_MSG = SYSEX_MSG_HEADER + (BROADCAST_ID, PING_MSG_TYPE, SYSEX_END_BYTE) 14 | INNER_MESSAGE_MAX_LENGTH = 251 15 | NUM_MSG_IDENTIFYING_BYTES = 3 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Akai_Force_MPC/sysex_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.elements import SysexElement 3 | 4 | class IdentifyingSysexElement(SysexElement): 5 | 6 | def receive_value(self, _): 7 | value = self._msg_sysex_identifier[3] 8 | self.notify_value(value) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Alesis_V/Alesis_V.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.ControlSurface import ControlSurface 4 | from _Framework.Layer import Layer 5 | from _Framework.EncoderElement import EncoderElement 6 | from _Framework.ButtonMatrixElement import ButtonMatrixElement 7 | from _Framework.InputControlElement import MIDI_CC_TYPE 8 | from _Framework.DeviceComponent import DeviceComponent 9 | 10 | class Alesis_V(ControlSurface): 11 | 12 | def __init__(self, *a, **k): 13 | super(Alesis_V, self).__init__(*a, **k) 14 | with self.component_guard(): 15 | encoders = ButtonMatrixElement(rows=[[ EncoderElement(MIDI_CC_TYPE, 0, identifier + 20, Live.MidiMap.MapMode.absolute, name=u'Encoder_%d' % identifier) for identifier in xrange(4) ]]) 16 | device = DeviceComponent(name=u'Device', is_enabled=False, layer=Layer(parameter_controls=encoders), device_selection_follows_track_selection=True) 17 | device.set_enabled(True) 18 | self.set_device_component(device) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Alesis_V/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Alesis_V import Alesis_V 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=5042, product_ids=[134, 135, 136], model_name=[u'V25', u'V49', u'V61']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Alesis_V(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Alesis_VI/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Alesis_VI import Alesis_VI 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=5042, product_ids=[131, 132, 133], model_name=[u'VI25', u'VI49', u'VI61']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Alesis_VI(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Alesis_VX/Alesis_VX.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ADVANCE.Advance import Advance 3 | 4 | class Alesis_VX(Advance): 5 | pass 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Alesis_VX/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Alesis_VX import Alesis_VX 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=5042, product_ids=[4176], model_name=u'VX49'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Alesis_VX(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.relative_smooth_binary_offset, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/AxiomPro/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .AxiomPro import AxiomPro 3 | 4 | def create_instance(c_instance): 5 | return AxiomPro(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[8227], model_name=u'Axiom Pro 49'), 12 | PORTS_KEY: [inport(props=[NOTES_CC]), 13 | inport(props=[NOTES_CC, SCRIPT]), 14 | inport(props=[NOTES_CC]), 15 | inport(props=[NOTES_CC]), 16 | outport(props=[]), 17 | outport(props=[SCRIPT])]} 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom_25_Classic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Axiom import Axiom 3 | 4 | def create_instance(c_instance): 5 | return Axiom(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[408], model_name=u'USB Axiom 25'), 12 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), inport(props=[PLAIN_OLD_MIDI]), outport(props=[SCRIPT])]} 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom_49_61_Classic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Axiom import Axiom 3 | 4 | def create_instance(c_instance): 5 | return Axiom(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom_AIR_25_49_61/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Axiom_AIR_25_49_61 import Axiom_AIR_25_49_61 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[8243], model_name=u'Axiom AIR 49'), 7 | PORTS_KEY: [inport(props=[NOTES_CC]), 8 | inport(props=[SCRIPT]), 9 | inport(props=[NOTES_CC]), 10 | outport(props=[NOTES_CC]), 11 | outport(props=[SCRIPT])]} 12 | 13 | 14 | def create_instance(c_instance): 15 | return Axiom_AIR_25_49_61(c_instance) 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom_AIR_Mini32/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .AxiomAirMini32 import AxiomAirMini32 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[8247], model_name=u'Axiom A.I.R. Mini32'), 7 | PORTS_KEY: [inport(props=[NOTES_CC]), 8 | inport(props=[NOTES_CC, SCRIPT]), 9 | outport(props=[NOTES_CC]), 10 | outport(props=[NOTES_CC, SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return AxiomAirMini32(c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Axiom_DirectLink/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Axiom_DirectLink import Axiom_DirectLink 3 | 4 | def create_instance(c_instance): 5 | return Axiom_DirectLink(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[8237], model_name=u'Axiom 49'), 12 | PORTS_KEY: [inport(props=[NOTES_CC]), 13 | inport(props=[NOTES_CC, SCRIPT]), 14 | inport(props=[NOTES_CC]), 15 | outport(props=[]), 16 | outport(props=[SCRIPT])]} 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BCF2000/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BCR2000/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=5015, product_ids=[188], model_name=u'BCR2000'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BLOCKS/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import capabilities as caps 3 | from .blocks import Blocks 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=10996, product_ids=[2304], model_name=[u'Lightpad BLOCK', u'BLOCKS']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT])], 8 | caps.TYPE_KEY: u'blocks'} 9 | 10 | 11 | def create_instance(c_instance): 12 | return Blocks(c_instance=c_instance) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BLOCKS/button.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import in_range 3 | from ableton.v2.control_surface.elements import ButtonElement as ButtonElementBase 4 | 5 | class ButtonElement(ButtonElementBase): 6 | 7 | def set_light(self, value): 8 | if isinstance(value, int) and in_range(value, 0, 128): 9 | self.send_value(value) 10 | else: 11 | super(ButtonElement, self).set_light(value) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BLOCKS/element_translator.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | 3 | class ElementTranslator(object): 4 | 5 | def __init__(self, elements = None, feedback_channel = None, non_feedback_channel = None, *a, **k): 6 | super(ElementTranslator, self).__init__(*a, **k) 7 | assert elements is not None 8 | self._elements = elements 9 | self._feedback_channel = feedback_channel 10 | self._non_feedback_channel = non_feedback_channel 11 | 12 | def set_enabled(self, enable): 13 | for element in self._elements: 14 | channel = self._non_feedback_channel 15 | if enable: 16 | element.reset_state() 17 | channel = self._feedback_channel 18 | element.set_channel(channel) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BLOCKS/mode.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import ButtonControl 3 | from ableton.v2.control_surface.mode import ModesComponent as ModesComponentBase 4 | 5 | class ModesComponent(ModesComponentBase): 6 | cycle_mode_button = ButtonControl() 7 | 8 | @cycle_mode_button.pressed 9 | def cycle_mode_button(self, button): 10 | if len(self._mode_list): 11 | self.cycle_mode(1) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/BeatStep/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .BeatStep import BeatStep 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=7285, product_ids=[518], model_name=[u'Arturia BeatStep']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return BeatStep(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Blackstar_Live_Logic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import controller_id, CONTROLLER_ID_KEY, inport, NOTES_CC, outport, PORTS_KEY, REMOTE, SCRIPT 3 | from .blackstar_live_logic import Blackstar_Live_Logic 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=10196, product_ids=[4097], model_name=[u'Live Logic MIDI Controller']), 7 | PORTS_KEY: [inport(props=[SCRIPT, REMOTE, NOTES_CC]), outport(props=[SCRIPT, REMOTE, NOTES_CC])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return Blackstar_Live_Logic(c_instance=c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Blackstar_Live_Logic/midi.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.midi import SYSEX_START, SYSEX_END 3 | SYSEX_HEADER = (SYSEX_START, 4 | 0, 5 | 32, 6 | 114) 7 | NUMERIC_DISPLAY_COMMAND = (0,) 8 | LIVE_INTEGRATION_MODE_ID = (SYSEX_START, 9 | 0, 10 | 0, 11 | 116, 12 | 1, 13 | 0, 14 | 77, 15 | 67, 16 | 1, 17 | 0, 18 | 7, 19 | 1, 20 | 0) 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Blackstar_Live_Logic/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Skin 3 | from ableton.v2.control_surface.elements import Color 4 | LED_ON = Color(127) 5 | LED_OFF = Color(0) 6 | 7 | class Colors: 8 | 9 | class DefaultButton: 10 | On = LED_ON 11 | Off = LED_OFF 12 | Disabled = LED_OFF 13 | 14 | 15 | skin = Skin(Colors) 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/CTRL49/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .ctrl49 import Ctrl49 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[12552], model_name=[u'CTRL49']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[]), 9 | inport(props=[]), 10 | inport(props=[NOTES_CC, SCRIPT]), 11 | outport(props=[]), 12 | outport(props=[]), 13 | outport(props=[]), 14 | outport(props=[SCRIPT])]} 15 | 16 | 17 | def create_instance(c_instance): 18 | return Ctrl49(c_instance=c_instance) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/CTRL49/ctrl49.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionNavigationComponent 3 | from Code_Series.code import Code 4 | 5 | class Ctrl49(Code): 6 | mixer_navigation_type = SessionNavigationComponent 7 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Code_Series/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .code import Code 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[12548, 12549, 12550], model_name=[u'Code 25', u'Code 49', u'Code 61']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[]), 9 | inport(props=[NOTES_CC, SCRIPT]), 10 | inport(props=[]), 11 | outport(props=[]), 12 | outport(props=[]), 13 | outport(props=[SCRIPT]), 14 | outport(props=[])]} 15 | 16 | 17 | def create_instance(c_instance): 18 | return Code(c_instance=c_instance) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Code_Series/element_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.base import depends 4 | from ableton.v2.control_surface import MIDI_CC_TYPE, MIDI_NOTE_TYPE, MIDI_PB_TYPE 5 | from ableton.v2.control_surface.elements import ButtonElement, EncoderElement, SliderElement 6 | IS_MOMENTARY = True 7 | CHANNEL = 0 8 | 9 | @depends(skin=None) 10 | def make_button(identifier, name, **k): 11 | return ButtonElement(IS_MOMENTARY, MIDI_NOTE_TYPE, CHANNEL, identifier, name=name, **k) 12 | 13 | 14 | def make_slider(channel, name): 15 | return SliderElement(MIDI_PB_TYPE, channel, 0, name=name) 16 | 17 | 18 | def make_encoder(identifier, name): 19 | return EncoderElement(MIDI_CC_TYPE, 0, identifier, Live.MidiMap.MapMode.relative_smooth_signed_bit, name=name) 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Code_Series/skin_default.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Skin 3 | from ableton.v2.control_surface.elements import Color 4 | 5 | class Colors: 6 | 7 | class DefaultButton: 8 | On = Color(127) 9 | Off = Color(0) 10 | Disabled = Color(0) 11 | 12 | class Transport: 13 | PlayOn = Color(127) 14 | PlayOff = Color(0) 15 | 16 | class Mixer: 17 | MuteOff = Color(127) 18 | MuteOn = Color(0) 19 | SoloOn = Color(127) 20 | SoloOff = Color(0) 21 | ArmOn = Color(127) 22 | ArmOff = Color(0) 23 | 24 | 25 | def make_default_skin(): 26 | return Skin(Colors) 27 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/FireOne/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .FireOne import FireOne 3 | 4 | def create_instance(c_instance): 5 | return FireOne(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KONTROL49/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyFadr/KeyFadr.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from KeyPad import KeyPad 3 | 4 | class KeyFadr(KeyPad): 5 | u""" 6 | Reloop KeyFadr controller script. 7 | """ 8 | _encoder_range = range(80, 72, -1) 9 | _product_model_id = 102 10 | 11 | def __init__(self, *a, **k): 12 | super(KeyFadr, self).__init__(*a, **k) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyFadr/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .KeyFadr import KeyFadr 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=9901, product_ids=[28150], model_name=u'Reloop KeyFadr'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[NOTES_CC, SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return KeyFadr(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab/DeviceNavigationComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 4 | from _Framework.Control import ButtonControl 5 | NavDirection = Live.Application.Application.View.NavDirection 6 | 7 | class DeviceNavigationComponent(ControlSurfaceComponent): 8 | device_nav_left_button = ButtonControl() 9 | device_nav_right_button = ButtonControl() 10 | 11 | @device_nav_left_button.pressed 12 | def device_nav_left_button(self, value): 13 | self._scroll_device_chain(NavDirection.left) 14 | 15 | @device_nav_right_button.pressed 16 | def device_nav_right_button(self, value): 17 | self._scroll_device_chain(NavDirection.right) 18 | 19 | def _scroll_device_chain(self, direction): 20 | view = self.application().view 21 | if not view.is_view_visible(u'Detail') or not view.is_view_visible(u'Detail/DeviceChain'): 22 | view.show_view(u'Detail') 23 | view.show_view(u'Detail/DeviceChain') 24 | else: 25 | view.scroll_view(direction, u'Detail/DeviceChain', False) 26 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab/SessionComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Arturia.SessionComponent import SessionComponent as SessionComponentBase 3 | 4 | class SessionComponent(SessionComponentBase): 5 | 6 | def set_selected_scene_launch_button(self, button): 7 | self.selected_scene().set_launch_button(button) 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .KeyLab import KeyLab 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=7285, product_ids=[517, 581, 645], model_name=[u'KeyLab 25', u'KeyLab 49', u'KeyLab 61']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return KeyLab(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_88/KeyLab88.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from KeyLab.KeyLab import KeyLab 3 | 4 | class KeyLab88(KeyLab): 5 | 6 | def _setup_hardware_encoder(self, hardware_id, identifier, channel = 0): 7 | self._set_encoder_cc_msg_type(hardware_id) 8 | self._set_identifier(hardware_id, identifier) 9 | self._set_channel(hardware_id, channel) 10 | self._set_binary_offset_mode(hardware_id) 11 | 12 | def _setup_hardware_button(self, hardware_id, identifier, channel = 0, **k): 13 | self._set_button_msg_type(hardware_id, u'cc') 14 | self._set_channel(hardware_id, channel) 15 | self._set_identifier(hardware_id, identifier) 16 | self._set_value_minimum(hardware_id) 17 | self._set_value_maximum(hardware_id) 18 | self._set_momentary_mode(hardware_id, is_momentary=True) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_88/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .KeyLab88 import KeyLab88 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=7285, product_ids=[717], model_name=[u'KeyLab 88']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return KeyLab88(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .keylab_essential import KeyLabEssential 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=7285, product_ids=[586, 650], model_name=[u'Arturia KeyLab Essential 49', u'Arturia KeyLab Essential 61']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[NOTES_CC, SCRIPT, REMOTE]), 9 | outport(props=[]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return KeyLabEssential(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/arrangement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Component 3 | from ableton.v2.control_surface.control import ButtonControl, EncoderControl 4 | 5 | class ArrangementComponent(Component): 6 | set_or_delete_cue_button = ButtonControl() 7 | jump_encoder = EncoderControl() 8 | 9 | @set_or_delete_cue_button.pressed 10 | def set_or_delete_cue_button(self, _): 11 | if self.application.view.focused_document_view == u'Arranger': 12 | self.song.set_or_delete_cue() 13 | 14 | @jump_encoder.value 15 | def jump_encoder(self, value, _): 16 | step = -1.0 if value < 0 else 1.0 17 | if self.song.is_playing: 18 | step *= 4.0 19 | self.song.jump_by(step) 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import ChannelStripComponent as ChannelStripComponentBase 3 | from .ringed_mapped_encoder_control import RingedMappedEncoderControl 4 | 5 | class ChannelStripComponent(ChannelStripComponentBase): 6 | pan_control = RingedMappedEncoderControl() 7 | 8 | def set_pan_control(self, control): 9 | self.pan_control.set_control_element(control) 10 | self.update() 11 | 12 | def _connect_parameters(self): 13 | super(ChannelStripComponent, self)._connect_parameters() 14 | self.pan_control.mapped_parameter = self.track.mixer_device.panning 15 | 16 | def _disconnect_parameters(self): 17 | self.pan_control.mapped_parameter = None 18 | super(ChannelStripComponent, self)._disconnect_parameters() 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/ringed_mapped_encoder_control.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import listens 3 | from ableton.v2.control_surface.control import MappedControl 4 | 5 | class RingedMappedEncoderControl(MappedControl): 6 | 7 | class State(MappedControl.State): 8 | 9 | def _update_direct_connection(self): 10 | super(RingedMappedEncoderControl.State, self)._update_direct_connection() 11 | self._on_parameter_value.subject = self._direct_mapping 12 | if self._direct_mapping: 13 | self._on_parameter_value() 14 | 15 | @listens(u'value') 16 | def _on_parameter_value(self): 17 | if self._control_element and self.enabled: 18 | self._control_element.set_ring_value(self._direct_mapping) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/undo.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from functools import partial 3 | from ableton.v2.base import task 4 | from ableton.v2.control_surface import Component 5 | from ableton.v2.control_surface.control import ButtonControl 6 | 7 | class UndoComponent(Component): 8 | undo_button = ButtonControl(color=u'DefaultButton.Off') 9 | 10 | def __init__(self, *a, **k): 11 | super(UndoComponent, self).__init__(*a, **k) 12 | self._light_undo_button_task = self._tasks.add(task.sequence(task.run(partial(self._set_undo_button_light, u'DefaultButton.On')), task.wait(1.0), task.run(partial(self._set_undo_button_light, u'DefaultButton.Off')))) 13 | self._light_undo_button_task.kill() 14 | 15 | @undo_button.pressed 16 | def undo_button(self, _): 17 | if self.song.can_undo: 18 | self.song.undo() 19 | if not self._light_undo_button_task.is_running: 20 | self._light_undo_button_task.restart() 21 | 22 | def _set_undo_button_light(self, value): 23 | self.undo_button.color = value 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_Essential/view_control.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import BasicSceneScroller, ScrollComponent, ViewControlComponent as ViewControlComponentBase 3 | from ableton.v2.control_surface.control import StepEncoderControl 4 | 5 | class ViewControlComponent(ViewControlComponentBase): 6 | scene_scroll_encoder = StepEncoderControl(num_steps=64) 7 | 8 | def __init__(self, *a, **k): 9 | super(ViewControlComponent, self).__init__(*a, **k) 10 | self._scroll_scenes = ScrollComponent(BasicSceneScroller(), parent=self) 11 | 12 | @scene_scroll_encoder.value 13 | def scene_scroll_encoder(self, value, _): 14 | if value > 0: 15 | self._scroll_scenes.scroll_down() 16 | elif value < 0: 17 | self._scroll_scenes.scroll_up() 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .keylab_mkii import KeyLabMkII 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=7285, product_ids=[587, 651, 715], model_name=[u'KeyLab mkII 49', u'KeyLab mkII 61', u'KeyLab mkII 88']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[NOTES_CC, SCRIPT, REMOTE]), 9 | outport(props=[]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return KeyLabMkII(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.control import TextDisplayControl 4 | from KeyLab_Essential.channel_strip import ChannelStripComponent as ChannelStripComponentBase 5 | 6 | class ChannelStripComponent(ChannelStripComponentBase): 7 | track_name_display = TextDisplayControl(u' ') 8 | 9 | def set_track_name_display(self, display): 10 | self.track_name_display.set_control_element(display) 11 | self._update_track_name_display() 12 | 13 | def set_track(self, track): 14 | super(ChannelStripComponent, self).set_track(track) 15 | self._update_track_name_display() 16 | 17 | def _update_track_name_display(self): 18 | track = self._track 19 | self.track_name_display[0] = track.name if liveobj_valid(track) else u'' 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/clip_slot.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from KeyLab_Essential.clip_slot import ClipSlotComponent as ClipSlotComponentBase 3 | 4 | class ClipSlotComponent(ClipSlotComponentBase): 5 | 6 | def _show_launched_clip_as_highlighted_clip(self): 7 | pass 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/hardware_settings.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from KeyLab_Essential import sysex 3 | from KeyLab_Essential.hardware_settings import HardwareSettingsComponent as HardwareSettingsComponentBase 4 | 5 | class HardwareSettingsComponent(HardwareSettingsComponentBase): 6 | 7 | def __init__(self, *a, **k): 8 | super(HardwareSettingsComponent, self).__init__(*a, **k) 9 | self._vegas_mode_switch = None 10 | 11 | def set_vegas_mode_switch(self, switch): 12 | self._vegas_mode_switch = switch 13 | 14 | def set_hardware_live_mode_enabled(self, enable): 15 | super(HardwareSettingsComponent, self).set_hardware_live_mode_enabled(enable) 16 | if enable and self._vegas_mode_switch: 17 | self._vegas_mode_switch.send_value(sysex.OFF_VALUE) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/mixer.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import MixerComponent as MixerComponentBase 4 | 5 | class MixerComponent(MixerComponentBase): 6 | 7 | def set_selected_track_name_display(self, display): 8 | self._selected_strip.set_track_name_display(display) 9 | 10 | def _update_selected_strip(self): 11 | selected_strip = self._selected_strip 12 | if liveobj_valid(selected_strip): 13 | selected_strip.set_track(self.song.view.selected_track) 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyLab_mkII/session.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from KeyLab_Essential.session import SceneComponent as SceneComponentBase, SessionComponent as SessionComponentBase 3 | from .clip_slot import ClipSlotComponent 4 | 5 | class SceneComponent(SceneComponentBase): 6 | clip_slot_component_type = ClipSlotComponent 7 | 8 | 9 | class SessionComponent(SessionComponentBase): 10 | scene_component_type = SceneComponent 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/KeyPad/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .KeyPad import KeyPad 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=9901, product_ids=[28149], model_name=u'Reloop KeyPad'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[NOTES_CC, SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return KeyPad(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Keystation_Pro_88/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Komplete_Kontrol_A/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .komplete_kontrol_a import Komplete_Kontrol_A 3 | from ableton.v2.control_surface.capabilities import SUGGESTED_PORT_NAMES_KEY 4 | 5 | def get_capabilities(): 6 | return {SUGGESTED_PORT_NAMES_KEY: [u'Komplete Kontrol A DAW', u'Komplete Kontrol M DAW']} 7 | 8 | 9 | def create_instance(c_instance): 10 | return Komplete_Kontrol_A(c_instance=c_instance) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Komplete_Kontrol_A/view_control_component.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.control_surface import Component 4 | from ableton.v2.control_surface.control import EncoderControl 5 | NavDirection = Live.Application.Application.View.NavDirection 6 | 7 | class ViewControlComponent(Component): 8 | vertical_encoder = EncoderControl() 9 | horizontal_encoder = EncoderControl() 10 | 11 | @vertical_encoder.value 12 | def vertical_encoder(self, value, _): 13 | direction = NavDirection.up if value < 0 else NavDirection.down 14 | self.application.view.scroll_view(direction, u'', False) 15 | 16 | @horizontal_encoder.value 17 | def horizontal_encoder(self, value, _): 18 | direction = NavDirection.left if value < 0 else NavDirection.right 19 | self.application.view.scroll_view(direction, u'', False) 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Komplete_Kontrol_S_Mk2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .komplete_kontrol_s_mk2 import Komplete_Kontrol_S_Mk2 3 | from ableton.v2.control_surface.capabilities import SUGGESTED_PORT_NAMES_KEY 4 | 5 | def get_capabilities(): 6 | return {SUGGESTED_PORT_NAMES_KEY: [u'Komplete Kontrol DAW - 1']} 7 | 8 | 9 | def create_instance(c_instance): 10 | return Komplete_Kontrol_S_Mk2(c_instance=c_instance) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/LPD8/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[117], model_name=u'LPD8'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/LV1_LX1/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .LV1_LX1 import LV1_LX1 3 | 4 | def create_instance(c_instance): 5 | return LV1_LX1(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/LV2_LX2_LC2_LD2/DevicesXY.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | XY_DEVICE_DICT = {u'AutoFilter': [[u'Frequency', u'Resonance']], 4 | u'BeatRepeat': [[u'Filter Freq', u'Filter Width']], 5 | u'Chorus': [[u'LFO Rate', u'LFO Amount']], 6 | u'Erosion': [[u'Frequency', u'Width']], 7 | u'FilterDelay': [[u'2 Filter Freq', u'2 Filter Width']], 8 | u'Flanger': [[u'Delay Time', u'Feedback']], 9 | u'GrainDelay': [[u'Pitch', u'Frequency']], 10 | u'Phaser': [[u'Frequency', u'Feedback']], 11 | u'Reverb': [[u'In Filter Freq', u'In Filter Width'], [u'ER Spin Rate', u'ER Spin Amount']], 12 | u'Vinyl': [[u'Tracing Freq.', u'Tracing Drive'], [u'Pinch Freq.', u'Pinch Drive']]} 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/LV2_LX2_LC2_LD2/LV2DeviceController.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from .FaderfoxDeviceController import FaderfoxDeviceController 4 | 5 | class LV2DeviceController(FaderfoxDeviceController): 6 | __module__ = __name__ 7 | 8 | def __init__(self, parent): 9 | LV2DeviceController.realinit(self, parent) 10 | 11 | def realinit(self, parent): 12 | FaderfoxDeviceController.realinit(self, parent) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/LV2_LX2_LC2_LD2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from .LV2_LX2_LC2_LD2 import LV2_LX2_LC2_LD2 4 | 5 | def create_instance(c_instance): 6 | return LV2_LX2_LC2_LD2(c_instance) 7 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/ButtonSysexControl.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.SysexValueControl import SysexValueControl 3 | 4 | class ButtonSysexControl(SysexValueControl): 5 | u""" 6 | A SysexValueControl that behaves like a button so it can be used as a mode button of 7 | the ModesComponent. 8 | """ 9 | 10 | def set_light(self, value): 11 | pass 12 | 13 | def is_momentary(self): 14 | return False 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/Colors.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | LED_OFF = 4 3 | LED_ON = 15 4 | RED_FULL = 7 5 | RED_HALF = 6 6 | RED_THIRD = 5 7 | RED_BLINK = 11 8 | GREEN_FULL = 52 9 | GREEN_HALF = 36 10 | GREEN_THIRD = 20 11 | GREEN_BLINK = 56 12 | YELLOW_FULL = 62 13 | AMBER_FULL = RED_FULL + GREEN_FULL - 4 14 | AMBER_HALF = RED_HALF + GREEN_HALF - 4 15 | AMBER_THIRD = RED_THIRD + GREEN_THIRD - 4 16 | AMBER_BLINK = AMBER_FULL - 4 + 8 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/ConfigurableButtonElement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from Launchpad.ConfigurableButtonElement import ConfigurableButtonElement as LaunchpadButtonElement 3 | from . import Colors 4 | 5 | class ConfigurableButtonElement(LaunchpadButtonElement): 6 | 7 | def set_light(self, value): 8 | if value is Colors.LED_OFF: 9 | self.send_value(value) 10 | else: 11 | super(ConfigurableButtonElement, self).set_light(value) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/SpecialSessionComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from itertools import izip_longest 3 | from _Framework.SessionComponent import SessionComponent 4 | 5 | class SpecialSessionComponent(SessionComponent): 6 | 7 | def set_clip_launch_buttons(self, buttons): 8 | for i, button in izip_longest(xrange(self._num_tracks), buttons or []): 9 | scene = self.selected_scene() 10 | slot = scene.clip_slot(i) 11 | slot.set_launch_button(button) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/Sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | MODE_CHANGE_PREFIX = (240, 0, 32, 41, 2, 10, 119) 3 | MIXER_MODE = (240, 0, 32, 41, 2, 10, 119, 8, 247) 4 | SESSION_MODE = (240, 0, 32, 41, 2, 10, 119, 9, 247) 5 | DEVICE_MODE = (240, 0, 32, 41, 2, 10, 119, 10, 247) 6 | 7 | def make_automatic_flashing_message(channel): 8 | return (176 + channel, 0, 40) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .LaunchControl import LaunchControl 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[52], model_name=u'Launch Control'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[NOTES_CC, SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return LaunchControl(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control_XL/ButtonElement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ButtonElement import ON_VALUE, OFF_VALUE, ButtonElement as ButtonElementBase 3 | 4 | class ButtonElement(ButtonElementBase): 5 | _on_value = None 6 | _off_value = None 7 | 8 | def reset(self): 9 | self._on_value = None 10 | self._off_value = None 11 | super(ButtonElement, self).reset() 12 | 13 | def set_on_off_values(self, on_value, off_value): 14 | self._on_value = on_value 15 | self._off_value = off_value 16 | 17 | def send_value(self, value, **k): 18 | if value is ON_VALUE and self._on_value is not None: 19 | self._skin[self._on_value].draw(self) 20 | elif value is OFF_VALUE and self._off_value is not None: 21 | self._skin[self._off_value].draw(self) 22 | else: 23 | super(ButtonElement, self).send_value(value, **k) 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control_XL/SkinDefault.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Skin import Skin 3 | from _Framework.ButtonElement import Color 4 | 5 | class Defaults: 6 | 7 | class DefaultButton: 8 | On = Color(127) 9 | Off = Color(0) 10 | Disabled = Color(0) 11 | 12 | 13 | class BiLedColors: 14 | 15 | class Mixer: 16 | SoloOn = Color(60) 17 | SoloOff = Color(28) 18 | MuteOn = Color(29) 19 | MuteOff = Color(47) 20 | ArmSelected = Color(15) 21 | ArmUnselected = Color(13) 22 | TrackSelected = Color(62) 23 | TrackUnselected = Color(29) 24 | NoTrack = Color(0) 25 | Sends = Color(47) 26 | Pans = Color(60) 27 | 28 | class Device: 29 | Parameters = Color(13) 30 | NoDevice = Color(0) 31 | BankSelected = Color(15) 32 | BankUnselected = Color(0) 33 | 34 | 35 | def make_default_skin(): 36 | return Skin(Defaults) 37 | 38 | 39 | def make_biled_skin(): 40 | return Skin(BiLedColors) 41 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launch_Control_XL/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .LaunchControlXL import LaunchControlXL 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, AUTO_LOAD_KEY 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[97], model_name=u'Launch Control XL'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[NOTES_CC, SCRIPT])], 8 | AUTO_LOAD_KEY: True} 9 | 10 | 11 | def create_instance(c_instance): 12 | return LaunchControlXL(c_instance) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Launchkey import Launchkey 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[48], model_name=u'Launchkey 25'), 7 | PORTS_KEY: [inport(props=[NOTES_CC]), 8 | inport(props=[NOTES_CC, SCRIPT]), 9 | outport(props=[NOTES_CC]), 10 | outport(props=[NOTES_CC, SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return Launchkey(c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey/consts.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | SIZE_QUERY = (240, 126, 127, 6, 1, 247) 3 | SIZE_RESPONSE = (240, 126, 127, 6, 2, 0, 32, 41, 0, 25, 0) 4 | LIVE_MODE_ON = (144, 12, 127) 5 | LIVE_MODE_OFF = (144, 12, 0) 6 | PAD_TRANSLATIONS = ((0, 0, 48, 9), 7 | (1, 0, 49, 9), 8 | (2, 0, 50, 9), 9 | (3, 0, 51, 9), 10 | (0, 1, 44, 9), 11 | (1, 1, 45, 9), 12 | (2, 1, 46, 9), 13 | (3, 1, 47, 9), 14 | (0, 2, 40, 9), 15 | (1, 2, 41, 9), 16 | (2, 2, 42, 9), 17 | (3, 2, 43, 9), 18 | (0, 3, 36, 9), 19 | (1, 3, 37, 9), 20 | (2, 3, 38, 9), 21 | (3, 3, 39, 9)) 22 | LED_FLASHING_ON = (176, 0, 40) 23 | LED_FLASHING_OFF = (176, 0, 32) 24 | LED_OFF = 4 25 | RED_FULL = 15 26 | RED_BLINK = 11 27 | GREEN_FULL = 60 28 | GREEN_BLINK = 56 29 | AMBER_FULL = 63 30 | AMBER_HALF = 29 31 | AMBER_BLINK = 59 32 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK2/BackgroundComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.BackgroundComponent import BackgroundComponent as BackgroundComponentBase 3 | 4 | class BackgroundComponent(BackgroundComponentBase): 5 | 6 | def _clear_control(self, name, control): 7 | super(BackgroundComponent, self)._clear_control(name, control) 8 | if control: 9 | control.add_value_listener(self._on_value_listener) 10 | 11 | def _on_value_listener(self, *a, **k): 12 | pass 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK2/InControlStatusComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.SubjectSlot import subject_slot 3 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 4 | 5 | class InControlStatusComponent(ControlSurfaceComponent): 6 | 7 | def __init__(self, set_is_in_control_on, *a, **k): 8 | super(InControlStatusComponent, self).__init__(*a, **k) 9 | self._set_is_in_control_on = set_is_in_control_on 10 | 11 | def set_in_control_status_button(self, button): 12 | self._on_in_control_value.subject = button 13 | 14 | @subject_slot(u'value') 15 | def _on_in_control_value(self, value): 16 | self._set_is_in_control_on(value >= 8) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK2/MixerComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.MixerComponent import MixerComponent as MixerComponentBase 3 | 4 | class MixerComponent(MixerComponentBase): 5 | 6 | def set_volume_control(self, control): 7 | self._selected_strip.set_volume_control(control) 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .Launchkey_MK2 import Launchkey_MK2 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=4661, product_ids=[31610, 7 | 31866, 8 | 32122, 9 | 123, 10 | 124, 11 | 125], model_name=[u'Launchkey MK2 25', u'Launchkey MK2 49', u'Launchkey MK2 61']), 12 | caps.PORTS_KEY: [caps.inport(props=[]), 13 | caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), 14 | caps.outport(props=[]), 15 | caps.outport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE])]} 16 | 17 | 18 | def create_instance(c_instance): 19 | return Launchkey_MK2(c_instance) 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK2/consts.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | PRODUCT_ID_BYTE_PREFIX = (0, 32, 41) 3 | LAUNCHKEY_25_ID_BYTE = 123 4 | LAUNCHKEY_49_ID_BYTE = 124 5 | LAUNCHKEY_61_ID_BYTE = 125 6 | PRODUCT_ID_BYTES = (LAUNCHKEY_25_ID_BYTE, LAUNCHKEY_49_ID_BYTE, LAUNCHKEY_61_ID_BYTE) 7 | IDENTITY_REQUEST = (240, 126, 127, 6, 1, 247) 8 | IN_CONTROL_QUERY = (159, 11, 0) 9 | DRUM_IN_CONTROL_ON_MESSAGE = (159, 15, 127) 10 | DRUM_IN_CONTROL_OFF_MESSAGE = (159, 15, 0) 11 | STANDARD_CHANNEL = 15 12 | PULSE_LED_CHANNEL = 2 13 | BLINK_LED_CHANNEL = 1 14 | MAX_SENDS = 6 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .launchkey_mk3 import Launchkey_MK3 3 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[308, 7 | 309, 8 | 310, 9 | 311], model_name=[u'Launchkey MK3 25', 10 | u'Launchkey MK3 37', 11 | u'Launchkey MK3 49', 12 | u'Launchkey MK3 61']), 13 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 14 | inport(props=[NOTES_CC, SCRIPT]), 15 | outport(props=[SYNC, REMOTE]), 16 | outport(props=[NOTES_CC, SCRIPT])]} 17 | 18 | 19 | def create_instance(c_instance): 20 | return Launchkey_MK3(c_instance=c_instance) 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/midi.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from novation import sysex 3 | MODEL_ID_BYTE_SUFFIX = (1, 0, 0) 4 | LK_MK3_25_ID_BYTE = 52 5 | LK_MK3_37_ID_BYTE = 53 6 | LK_MK3_49_ID_BYTE = 54 7 | LK_MK3_61_ID_BYTE = 55 8 | MODEL_ID_BYTES = (LK_MK3_25_ID_BYTE, 9 | LK_MK3_37_ID_BYTE, 10 | LK_MK3_49_ID_BYTE, 11 | LK_MK3_61_ID_BYTE) 12 | SMALL_MODEL_ID_BYTES = MODEL_ID_BYTES[:2] 13 | INCONTROL_ONLINE_VALUE = 127 14 | PAD_DRUM_LAYOUT = 1 15 | PAD_SESSION_LAYOUT = 2 16 | VOLUME_LAYOUT = 1 17 | PAN_LAYOUT = 3 18 | DISPLAY_HEADER = sysex.STD_MSG_HEADER + (15,) 19 | NOTIFICATION_DISPLAY_COMMAND_BYTES = ((4, 0), (4, 1)) 20 | PARAMETER_NAME_DISPLAY_COMMAND_BYTE = 7 21 | PARAMETER_VALUE_DISPLAY_COMMAND_BYTE = 8 22 | POT_PARAMETER_DISPLAY_START_INDEX = 56 23 | FADER_PARAMETER_DISPLAY_START_INDEX = 80 24 | MASTER_PARAMETER_DISPLAY_INDEX = FADER_PARAMETER_DISPLAY_START_INDEX + 8 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/notification.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import task 3 | from ableton.v2.control_surface import Component 4 | from ableton.v2.control_surface.control import control_list 5 | from .control import DisplayControl 6 | CLEAR_DELAY = 5 7 | 8 | class NotificationComponent(Component): 9 | display_lines = control_list(DisplayControl, control_count=2) 10 | 11 | def __init__(self, *a, **k): 12 | super(NotificationComponent, self).__init__(*a, **k) 13 | self._clear_notification_task = self._tasks.add(task.sequence(task.wait(CLEAR_DELAY), task.run(self._clear_notification))) 14 | self._clear_notification_task.kill() 15 | 16 | def show_notification(self, upper_line, lower_line): 17 | self._clear_notification_task.kill() 18 | self._clear_notification_task.restart() 19 | self.display_lines[0].message = upper_line 20 | self.display_lines[1].message = lower_line 21 | 22 | def _clear_notification(self): 23 | self.display_lines[0].message = u' ' 24 | self.display_lines[1].message = u' ' 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/rgb_button.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.elements import ButtonElement 3 | 4 | class RgbButtonElement(ButtonElement): 5 | u""" 6 | RGBButtonElement extends ButtonElement for use with buttons on a controller that 7 | have RGB LEDs that receive MIDI on a different channel than the channel used to 8 | send MIDI. 9 | 10 | Note that the Color class provides a means of doing the same thing we're doing here. 11 | However, that approach is impractical when RGB LEDs are used to reflect the color 12 | of objects in Live since it would involve nearly 200 Color objects and corresponding 13 | dicts for handling look up. 14 | """ 15 | 16 | def __init__(self, *a, **k): 17 | self._led_channel = k.pop(u'led_channel', 0) 18 | super(RgbButtonElement, self).__init__(*a, **k) 19 | 20 | def _do_send_value(self, value, channel = None): 21 | super(RgbButtonElement, self)._do_send_value(value, channel=self._led_channel) 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import merge_skins, Skin 3 | from novation.colors import Mono, Rgb 4 | from novation.skin import skin as base_skin 5 | 6 | class Colors: 7 | 8 | class DefaultButton: 9 | On = Mono.ON 10 | 11 | class TrackNavigation: 12 | On = Mono.HALF 13 | Pressed = Mono.ON 14 | 15 | class Device: 16 | Navigation = Rgb.PURPLE_HALF 17 | NavigationPressed = Rgb.PURPLE 18 | 19 | class DrumGroup: 20 | PadSelected = Rgb.WHITE 21 | PadSelectedNotSoloed = Rgb.WHITE 22 | PadMutedSelected = Rgb.WHITE 23 | PadSoloedSelected = Rgb.WHITE 24 | 25 | class Mode: 26 | 27 | class Device: 28 | 29 | class Bank: 30 | Selected = Rgb.PURPLE 31 | Available = Rgb.PURPLE_HALF 32 | 33 | 34 | skin = merge_skins(*(base_skin, Skin(Colors))) 35 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_MK3/transport.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import ButtonControl 3 | from novation.transport import TransportComponent as TransportComponentBase 4 | 5 | class TransportComponent(TransportComponentBase): 6 | alt_stop_button = ButtonControl() 7 | 8 | @alt_stop_button.pressed 9 | def alt_stop_button(self, _): 10 | self.song.is_playing = False 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .LaunchkeyMini import LaunchkeyMini 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[53], model_name=u'Launchkey Mini'), 7 | PORTS_KEY: [inport(props=[NOTES_CC]), 8 | inport(props=[SCRIPT]), 9 | outport(props=[NOTES_CC]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return LaunchkeyMini(c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini_MK3/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .launchkey_mini_mk3 import Launchkey_Mini_MK3 3 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[258], model_name=[u'Launchkey Mini MK3']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[NOTES_CC, SCRIPT]), 9 | outport(props=[SYNC, REMOTE]), 10 | outport(props=[NOTES_CC, SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return Launchkey_Mini_MK3(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini_MK3/elements.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.elements import ComboElement 3 | from novation.launchkey_elements import LaunchkeyElements 4 | 5 | class Elements(LaunchkeyElements): 6 | 7 | def __init__(self, *a, **k): 8 | super(Elements, self).__init__(*a, **k) 9 | 10 | def with_shift(button): 11 | return ComboElement(control=button, modifier=self.shift_button, name=u'{}_With_Shift'.format(button.name)) 12 | 13 | self.play_button_with_shift = with_shift(self.play_button) 14 | self.record_button_with_shift = with_shift(self.record_button) 15 | self.scene_launch_button_with_shift = with_shift(self.scene_launch_buttons_raw[0]) 16 | self.stop_solo_mute_button_with_shift = with_shift(self.scene_launch_buttons_raw[1]) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini_MK3/midi.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | INCONTROL_ONLINE_VALUE = 127 3 | PAD_DRUM_LAYOUT = 1 4 | PAD_SESSION_LAYOUT = 2 5 | POT_VOLUME_LAYOUT = 1 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini_MK3/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import merge_skins, Skin 3 | from novation.colors import Mono, Rgb 4 | from novation.skin import skin as base_skin 5 | 6 | class Colors: 7 | 8 | class Recording: 9 | On = Mono.ON 10 | Off = Mono.OFF 11 | 12 | class TrackNavigation: 13 | On = Mono.HALF 14 | Pressed = Mono.ON 15 | 16 | class SceneNavigation: 17 | On = Mono.HALF 18 | Pressed = Mono.ON 19 | 20 | class DrumGroup: 21 | PadSelected = Rgb.WHITE 22 | PadSelectedNotSoloed = Rgb.WHITE 23 | PadMutedSelected = Rgb.WHITE 24 | PadSoloedSelected = Rgb.WHITE 25 | Navigation = Rgb.WHITE_HALF 26 | NavigationPressed = Rgb.WHITE 27 | 28 | 29 | skin = merge_skins(*(base_skin, Skin(Colors))) 30 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchkey_Mini_MK3/sysex_ids.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | LK_MINI_MK3_FAMILY_CODE = (2, 1) 3 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad/SpecialSessionComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.SessionComponent import SessionComponent 3 | 4 | class SpecialSessionComponent(SessionComponent): 5 | u""" Special session subclass that handles ConfigurableButtons """ 6 | 7 | def _update_stop_clips_led(self, index): 8 | if self.is_enabled() and self._stop_track_clip_buttons != None and index < len(self._stop_track_clip_buttons): 9 | button = self._stop_track_clip_buttons[index] 10 | tracks_to_use = self.tracks_to_use() 11 | track_index = index + self.track_offset() 12 | if 0 <= track_index < len(tracks_to_use): 13 | track = tracks_to_use[track_index] 14 | if track.fired_slot_index == -2: 15 | button.send_value(self._stop_clip_triggered_value) 16 | elif track.playing_slot_index >= 0: 17 | button.send_value(self._stop_clip_value) 18 | else: 19 | button.turn_off() 20 | else: 21 | button.send_value(4) 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import * 3 | from .Launchpad import Launchpad 4 | 5 | def create_instance(c_instance): 6 | return Launchpad(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[14, 32, 54], model_name=[u'Launchpad', u'Launchpad S', u'Launchpad Mini']), 11 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), outport(props=[NOTES_CC, REMOTE, SCRIPT])]} 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_MK2/BackgroundComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.BackgroundComponent import BackgroundComponent as BackgroundComponentBase 3 | 4 | class BackgroundComponent(BackgroundComponentBase): 5 | 6 | def _clear_control(self, name, control): 7 | if control: 8 | control.add_value_listener(self._on_value_listener) 9 | super(BackgroundComponent, self)._clear_control(name, control) 10 | 11 | def _on_value_listener(self, *a, **k): 12 | pass 13 | 14 | 15 | class TranslatingBackgroundComponent(BackgroundComponent): 16 | 17 | def __init__(self, translation_channel = 0, *a, **k): 18 | super(TranslatingBackgroundComponent, self).__init__(*a, **k) 19 | self._translation_channel = translation_channel 20 | 21 | def _clear_control(self, name, control): 22 | if control: 23 | control.set_channel(self._translation_channel) 24 | super(TranslatingBackgroundComponent, self)._clear_control(name, control) 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_MK2/ComponentUtils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | 3 | def skin_scroll_component(component): 4 | for button in (component.scroll_up_button, component.scroll_down_button): 5 | button.color = u'Scrolling.Enabled' 6 | button.pressed_color = u'Scrolling.Pressed' 7 | button.disabled_color = u'Scrolling.Disabled' 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_MK2/consts.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | PRODUCT_ID_BYTES = (0, 32, 41, 105, 0, 0, 0) 3 | IDENTITY_REQUEST = (240, 126, 127, 6, 1, 247) 4 | STANDARD_SYSEX_PREFIX = (240, 0, 32, 41, 2, 24) 5 | CHALLENGE_RESPONSE_BYTE = (64,) 6 | LAYOUT_CHANGE_BYTE = (34,) 7 | FADER_SETUP_BYTE = (43,) 8 | QUIT_MESSAGE = (240, 0, 32, 41, 2, 24, 64, 247) 9 | BLINK_LED_CHANNEL = 1 10 | PULSE_LED_CHANNEL = 2 11 | USER_MODE_CHANNELS = (5, 6, 7, 13, 14, 15) 12 | VOLUME_MODE_CHANNEL = 3 13 | PAN_MODE_CHANNEL = 4 14 | SEND_A_MODE_CHANNEL = 8 15 | SEND_B_MODE_CHANNEL = 9 16 | FADER_STANDARD_TYPE = 0 17 | FADER_BIPOLAR_TYPE = 1 18 | SESSION_WIDTH = 8 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Mini_MK3/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .launchpad_mini_mk3 import Launchpad_Mini_MK3 3 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[275], model_name=[u'Launchpad Mini MK3']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), 8 | inport(props=[NOTES_CC, REMOTE]), 9 | outport(props=[NOTES_CC, SYNC, SCRIPT]), 10 | outport(props=[REMOTE])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return Launchpad_Mini_MK3(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Mini_MK3/notifying_background.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from functools import partial 3 | from ableton.v2.control_surface.components import BackgroundComponent 4 | 5 | class NotifyingBackgroundComponent(BackgroundComponent): 6 | __events__ = (u'value',) 7 | 8 | def register_slot(self, control, *a): 9 | super(BackgroundComponent, self).register_slot(control, partial(self.__on_control_value, control), u'value') 10 | 11 | def __on_control_value(self, control, value): 12 | self.notify_value(control, value) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Mini_MK3/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import merge_skins, Skin 3 | from ableton.v2.control_surface.elements import Color 4 | from novation.colors import Rgb 5 | from novation.skin import skin as base_skin 6 | 7 | class Colors: 8 | 9 | class Mode: 10 | 11 | class Session: 12 | Launch = Color((Rgb.PALE_GREEN_HALF.midi_value, Rgb.WHITE_HALF.midi_value)) 13 | Overview = Color((Rgb.BLUE.midi_value, Rgb.WHITE_HALF.midi_value)) 14 | 15 | 16 | skin = merge_skins(*(base_skin, Skin(Colors))) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Mini_MK3/sysex_ids.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | LP_MINI_MK3_FAMILY_CODE = (19, 1) 3 | LP_MINI_MK3_ID = 13 4 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro/LedLightingComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Control import ButtonControl 3 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 4 | 5 | class LedLightingComponent(ControlSurfaceComponent): 6 | button = ButtonControl(color=u'Misc.Shift', pressed_color=u'Misc.ShiftOn') 7 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro/SpecialDeviceComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.DeviceComponent import DeviceComponent 3 | from .consts import FADER_TYPE_STANDARD, DEVICE_MAP_CHANNEL 4 | 5 | class SpecialDeviceComponent(DeviceComponent): 6 | 7 | def set_parameter_controls(self, controls): 8 | if controls: 9 | for control in controls: 10 | control.set_channel(DEVICE_MAP_CHANNEL) 11 | control.set_light_and_type(u'Device.On', FADER_TYPE_STANDARD) 12 | 13 | super(SpecialDeviceComponent, self).set_parameter_controls(controls) 14 | 15 | def _update_parameter_controls(self): 16 | if self._parameter_controls is not None: 17 | for control in self._parameter_controls: 18 | control.update() 19 | 20 | def update(self): 21 | super(SpecialDeviceComponent, self).update() 22 | if self.is_enabled(): 23 | self._update_parameter_controls() 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro/UserMatrixComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ControlSurfaceComponent import ControlSurfaceComponent 3 | 4 | def _disable_control(control): 5 | for button in control: 6 | button.set_enabled(False) 7 | 8 | 9 | class UserMatrixComponent(ControlSurfaceComponent): 10 | u""" 11 | "Component" that expects ButtonMatrixElements that hold 12 | ConfigurableButtonElements, to then turn them off. This 13 | is done so the buttons' messages can be forwarded to Live's Tracks. 14 | """ 15 | 16 | def __getattr__(self, name): 17 | if len(name) > 4 and name[:4] == u'set_': 18 | return _disable_control 19 | raise AttributeError(name) 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.Capabilities import CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, SYNC, REMOTE, controller_id, inport, outport 3 | from .Launchpad_Pro import Launchpad_Pro 4 | 5 | def create_instance(c_instance): 6 | return Launchpad_Pro(c_instance) 7 | 8 | 9 | def get_capabilities(): 10 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[81], model_name=u'Launchpad Pro'), 11 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), 12 | inport(props=[]), 13 | outport(props=[NOTES_CC, 14 | SYNC, 15 | SCRIPT, 16 | REMOTE]), 17 | outport(props=[])]} 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro_MK3/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .launchpad_pro_mk3 import Launchpad_Pro_MK3 3 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[291], model_name=[u'Launchpad Pro MK3']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[]), 9 | inport(props=[NOTES_CC, SCRIPT]), 10 | outport(props=[REMOTE]), 11 | outport(props=[]), 12 | outport(props=[NOTES_CC, SYNC, SCRIPT])]} 13 | 14 | 15 | def create_instance(c_instance): 16 | return Launchpad_Pro_MK3(c_instance=c_instance) 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro_MK3/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from novation.channel_strip import ChannelStripComponent as ChannelStripComponentBase 4 | 5 | class ChannelStripComponent(ChannelStripComponentBase): 6 | 7 | def _track_color_changed(self): 8 | super(ChannelStripComponent, self)._track_color_changed() 9 | self._update_select_button() 10 | 11 | def _update_select_button(self): 12 | if liveobj_valid(self._track) or self.empty_color is None: 13 | if self.song.view.selected_track == self._track: 14 | self.select_button.color = self._track_color_value 15 | else: 16 | self.select_button.color = u'Mixer.TrackNotSelected' 17 | else: 18 | self.select_button.color = self.empty_color 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro_MK3/control.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import InputControl, SendValueMixin 3 | 4 | class SendReceiveValueControl(InputControl): 5 | 6 | class State(InputControl.State): 7 | 8 | def send_value(self, value): 9 | if self._control_element: 10 | self._control_element.send_value(value) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro_MK3/sysex_ids.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | LP_PRO_MK3_FAMILY_CODE = (35, 1) 3 | LP_PRO_MK3_ID = 14 4 | SESSION_LAYOUT_BYTES = (0, 0, 0) 5 | CHORD_LAYOUT_BYTES = (2, 0, 0) 6 | NOTE_LAYOUT_BYTES = (4, 0, 0) 7 | FADER_LAYOUT_BYTE = 1 8 | SCALE_LAYOUT_BYTES = (1,) 9 | DRUM_LAYOUT_BYTES = (2,) 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_Pro_MK3/transport.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from novation.blinking_button import BlinkingButtonControl 3 | from novation.transport import TransportComponent as TransportComponentBase 4 | 5 | class TransportComponent(TransportComponentBase): 6 | capture_midi_button = BlinkingButtonControl(color=u'Transport.CaptureOff', blink_on_color=u'Transport.CaptureOn', blink_off_color=u'Transport.CaptureOff') 7 | 8 | @capture_midi_button.pressed 9 | def capture_midi_button(self, _): 10 | try: 11 | if self.song.can_capture_midi: 12 | self.song.capture_midi() 13 | self.capture_midi_button.start_blinking() 14 | except RuntimeError: 15 | pass 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_X/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .launchpad_x import Launchpad_X 3 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, SYNC, controller_id, inport, outport 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[259], model_name=[u'Launchpad X']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), 8 | inport(props=[NOTES_CC, REMOTE]), 9 | outport(props=[NOTES_CC, SYNC, SCRIPT]), 10 | outport(props=[REMOTE])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return Launchpad_X(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_X/channel_strip.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from novation.channel_strip import ChannelStripComponent as ChannelStripComponentBase 4 | 5 | class ChannelStripComponent(ChannelStripComponentBase): 6 | 7 | def update(self): 8 | super(ChannelStripComponent, self).update() 9 | self._update_static_color_control() 10 | 11 | def _update_static_color_control(self): 12 | valid_track = liveobj_valid(self._track) 13 | color_value = self._static_color_value if valid_track else 0 14 | if valid_track and self._send_controls: 15 | send_index = next((i for i, x in enumerate(self._send_controls) if x), None) 16 | if send_index is not None and send_index >= len(self._track.mixer_device.sends): 17 | color_value = 0 18 | self.static_color_control.value = color_value 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_X/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import merge_skins, Skin 3 | from ableton.v2.control_surface.elements import Color 4 | from novation.colors import Rgb 5 | from novation.skin import skin as base_skin 6 | 7 | class Colors: 8 | 9 | class Mode: 10 | 11 | class Session: 12 | Launch = Color((Rgb.PALE_GREEN_HALF.midi_value, Rgb.WHITE_HALF.midi_value)) 13 | Mixer = Color((Rgb.CREAM.midi_value, Rgb.WHITE_HALF.midi_value)) 14 | Overview = Color((Rgb.BLUE.midi_value, Rgb.WHITE_HALF.midi_value)) 15 | 16 | 17 | skin = merge_skins(*(base_skin, Skin(Colors))) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Launchpad_X/sysex_ids.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | LP_X_FAMILY_CODE = (3, 1) 3 | LP_X_ID = 12 4 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MIDI_Mix/ControlElementUtils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.Dependency import depends 4 | from _Framework.InputControlElement import MIDI_CC_TYPE, MIDI_NOTE_TYPE 5 | from _Framework.ButtonMatrixElement import ButtonMatrixElement 6 | from _Framework.ButtonElement import ButtonElement 7 | from _Framework.SliderElement import SliderElement 8 | from _Framework.EncoderElement import EncoderElement 9 | 10 | @depends(skin=None) 11 | def make_button(identifier, name, skin = None): 12 | return ButtonElement(True, MIDI_NOTE_TYPE, 0, identifier, name=name, skin=skin) 13 | 14 | 15 | def make_slider(identifier, name): 16 | return SliderElement(MIDI_CC_TYPE, 0, identifier, name=name) 17 | 18 | 19 | def make_encoder(identifier, name): 20 | return EncoderElement(MIDI_CC_TYPE, 0, identifier, map_mode=Live.MidiMap.MapMode.absolute, name=name) 21 | 22 | 23 | def make_button_row(identifier_sequence, element_factory, name): 24 | return ButtonMatrixElement(rows=[ [element_factory(identifier, name + u'_%d' % index)] for index, identifier in enumerate(identifier_sequence) ]) 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MIDI_Mix/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .MIDI_Mix import MIDI_Mix 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=2536, product_ids=[49], model_name=u'MIDI Mix'), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MIDI_Mix(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD18/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD218/MPD218.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _MPDMkIIBase.MPDMkIIBase import MPDMkIIBase 3 | PAD_CHANNEL = 9 4 | PAD_IDS = [[48, 5 | 49, 6 | 50, 7 | 51], 8 | [44, 9 | 45, 10 | 46, 11 | 47], 12 | [40, 13 | 41, 14 | 42, 15 | 43], 16 | [36, 17 | 37, 18 | 38, 19 | 39]] 20 | 21 | class MPD218(MPDMkIIBase): 22 | 23 | def __init__(self, *a, **k): 24 | super(MPD218, self).__init__(PAD_IDS, PAD_CHANNEL, *a, **k) 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD218/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .MPD218 import MPD218 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=2536, product_ids=[52], model_name=u'MPD218'), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPD218(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD226/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .MPD226 import MPD226 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=2536, product_ids=[53], model_name=u'MPD226'), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPD226(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD232/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .MPD232 import MPD232 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=2536, product_ids=[54], model_name=u'MPD232'), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPD232(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD24/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[104], model_name=u'Akai MPD24'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), 16 | inport(props=[NOTES_CC]), 17 | inport(props=[NOTES_CC]), 18 | outport(props=[SCRIPT]), 19 | outport(props=[])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPD32/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[108], model_name=u'Akai MPD32'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), 16 | inport(props=[NOTES_CC]), 17 | inport(props=[NOTES_CC]), 18 | outport(props=[SCRIPT]), 19 | outport(props=[])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK225/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MPK225 import MPK225 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[35], model_name=u'MPK225'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPK225(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK249/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MPK249 import MPK249 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[36], model_name=u'MPK249'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPK249(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK25/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[114], model_name=u'Akai MPK25'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), 16 | inport(props=[NOTES_CC]), 17 | inport(props=[NOTES_CC]), 18 | outport(props=[SYNC, SCRIPT]), 19 | outport(props=[])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK261/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MPK261 import MPK261 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[37], model_name=u'MPK261'), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT, REMOTE])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MPK261(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK49/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[107], model_name=u'Akai MPK49'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), 16 | inport(props=[NOTES_CC]), 17 | inport(props=[PLAIN_OLD_MIDI]), 18 | outport(props=[SYNC, SCRIPT]), 19 | outport(props=[PLAIN_OLD_MIDI])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK61/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK88/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK_mini/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK_mini_mkI/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[124], model_name=u'MPK mini'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK_mini_mkII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=8209, product_ids=[1813], model_name=u'MPKmini2'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MPK_mini_mkIII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[73], model_name=u'MPK mini 3'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MackieControl/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MackieControl import MackieControl 3 | 4 | def create_instance(c_instance): 5 | return MackieControl(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2675, product_ids=[6], model_name=u'MCU Pro USB v3.1'), 12 | PORTS_KEY: [inport(props=[SCRIPT, REMOTE]), 13 | inport(props=[]), 14 | inport(props=[]), 15 | inport(props=[]), 16 | outport(props=[SCRIPT, REMOTE]), 17 | outport(props=[]), 18 | outport(props=[]), 19 | outport(props=[])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MackieControlXT/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MackieControlXT import MackieControlXT 3 | 4 | def create_instance(c_instance): 5 | return MackieControlXT(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MackieControl_Classic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MackieControl import MackieControl 3 | 4 | def create_instance(c_instance): 5 | return MackieControl(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MasterControl/MasterControl.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from MackieControl.MackieControl import MackieControl 3 | 4 | class MasterControl(MackieControl): 5 | u""" Main class derived from MackieControl """ 6 | 7 | def __init__(self, c_instance): 8 | MackieControl.__init__(self, c_instance) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MasterControl/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MasterControl import MasterControl 3 | 4 | def create_instance(c_instance): 5 | return MasterControl(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MaxForLive/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MaxForLive import MaxForLive 3 | from ableton.v2.control_surface.capabilities import GENERIC_SCRIPT_KEY 4 | 5 | def get_capabilities(): 6 | return {GENERIC_SCRIPT_KEY: True} 7 | 8 | 9 | def create_instance(c_instance): 10 | return MaxForLive(c_instance=c_instance) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MidAir25/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MidAir25/config.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .consts import * 3 | TRANSPORT_CONTROLS = {u'STOP': GENERIC_STOP, 4 | u'PLAY': GENERIC_PLAY, 5 | u'REC': GENERIC_REC, 6 | u'LOOP': GENERIC_LOOP, 7 | u'RWD': GENERIC_RWD, 8 | u'FFWD': GENERIC_FFWD} 9 | DEVICE_CONTROLS = (GENERIC_ENC1, 10 | GENERIC_ENC2, 11 | GENERIC_ENC3, 12 | GENERIC_ENC4, 13 | GENERIC_ENC5, 14 | GENERIC_ENC6, 15 | GENERIC_ENC7, 16 | GENERIC_ENC8) 17 | VOLUME_CONTROLS = GENERIC_SLIDERS 18 | TRACKARM_CONTROLS = (GENERIC_BUT1, 19 | GENERIC_BUT2, 20 | GENERIC_BUT3, 21 | GENERIC_BUT4, 22 | GENERIC_BUT5, 23 | GENERIC_BUT6, 24 | GENERIC_BUT7, 25 | GENERIC_BUT8) 26 | BANK_CONTROLS = {u'TOGGLELOCK': GENERIC_BUT9, 27 | u'BANKDIAL': -1, 28 | u'NEXTBANK': -1, 29 | u'PREVBANK': -1, 30 | u'BANK1': -1, 31 | u'BANK2': -1, 32 | u'BANK3': -1, 33 | u'BANK4': -1, 34 | u'BANK5': -1, 35 | u'BANK6': -1, 36 | u'BANK7': -1, 37 | u'BANK8': -1} 38 | CONTROLLER_DESCRIPTION = {u'INPUTPORT': u'MidAir', 39 | u'OUTPUTPORT': u'MidAir', 40 | u'CHANNEL': 0} 41 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MiniLab/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .MiniLab import MiniLab 3 | import _Framework.Capabilities as caps 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=7285, product_ids=[516], model_name=[u'Arturia MINILAB']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MiniLab(c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/MiniLab_mkII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .MiniLabMk2 import MiniLabMk2 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=7285, product_ids=[649], model_name=[u'Arturia MiniLab mkII']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.NOTES_CC, caps.SCRIPT, caps.REMOTE]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return MiniLabMk2(c_instance=c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Novation_Impulse/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Novation_Impulse import Novation_Impulse 3 | 4 | def create_instance(c_instance): 5 | return Novation_Impulse(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[25], model_name=u'Impulse 25'), 12 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE, SCRIPT]), inport(props=[NOTES_CC, REMOTE]), outport(props=[NOTES_CC, REMOTE, SCRIPT])]} 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/O2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/OpenLabs/SpecialDeviceComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.DeviceComponent import DeviceComponent 4 | 5 | class SpecialDeviceComponent(DeviceComponent): 6 | 7 | def __init__(self): 8 | DeviceComponent.__init__(self) 9 | 10 | def _device_parameters_to_map(self): 11 | assert self.is_enabled() 12 | assert self._device != None 13 | assert self._parameter_controls != None 14 | return self._device.parameters[1:] 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/OpenLabs/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from .OpenLabs import OpenLabs 4 | 5 | def create_instance(c_instance): 6 | u""" Creates and returns the OpenLabs script """ 7 | return OpenLabs(c_instance) 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen49_61/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen8/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[4117], model_name=u'Keystation'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen8v2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen_3rd_Gen/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Oxygen_3rd_Gen import Oxygen_3rd_Gen 3 | 4 | def create_instance(c_instance): 5 | return Oxygen_3rd_Gen(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen_4th_Gen/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from Oxygen_3rd_Gen import Oxygen_3rd_Gen 3 | 4 | def create_instance(c_instance): 5 | return Oxygen_3rd_Gen(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen_Pro/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, SCRIPT, controller_id, inport, outport 3 | from .oxygen_pro import Oxygen_Pro 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[56, 57, 58], model_name=[u'Oxygen Pro 25', u'Oxygen Pro 49', u'Oxygen Pro 61']), 7 | PORTS_KEY: [inport(props=[]), 8 | inport(props=[]), 9 | inport(props=[NOTES_CC, SCRIPT]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return Oxygen_Pro(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen_Pro/session.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionComponent as SessionComponentBase 3 | from ableton.v2.control_surface.control import EncoderControl 4 | 5 | class SessionComponent(SessionComponentBase): 6 | scene_encoder = EncoderControl() 7 | 8 | @scene_encoder.value 9 | def scene_encoder(self, value, _): 10 | factor = 1 if value < 0 else -1 11 | new_scene_index = factor + list(self.song.scenes).index(self.song.view.selected_scene) 12 | if new_scene_index in range(len(self.song.scenes)): 13 | self.song.view.selected_scene = self.song.scenes[new_scene_index] 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Oxygen_Pro/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Skin 3 | from ableton.v2.control_surface.elements import Color 4 | LED_ON = Color(127) 5 | LED_OFF = Color(0) 6 | 7 | class Colors: 8 | 9 | class DefaultButton: 10 | On = LED_ON 11 | Off = LED_OFF 12 | Disabled = LED_OFF 13 | 14 | class Transport: 15 | PlayOn = LED_ON 16 | PlayOff = LED_OFF 17 | 18 | class Recording: 19 | On = LED_ON 20 | Transition = LED_ON 21 | Off = LED_OFF 22 | 23 | class Mixer: 24 | ArmOn = LED_ON 25 | ArmOff = LED_OFF 26 | 27 | class Session: 28 | ClipEmpty = LED_OFF 29 | ClipTriggeredPlay = LED_ON 30 | ClipTriggeredRecord = LED_ON 31 | ClipStopped = LED_ON 32 | ClipStarted = LED_ON 33 | ClipRecording = LED_ON 34 | RecordButton = LED_ON 35 | Scene = LED_OFF 36 | NoScene = LED_OFF 37 | SceneTriggered = LED_ON 38 | 39 | 40 | skin = Skin(Colors) 41 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Ozone/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1891, product_ids=[8200], model_name=u'Ozone'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Ozonic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Photon_25/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Photon_X25/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ProjectMixIO/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .ProjectMixIO import ProjectMixIO 3 | 4 | def create_instance(c_instance): 5 | return ProjectMixIO(c_instance) 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import controller_id, inport, outport, AUTO_LOAD_KEY, CONTROLLER_ID_KEY, FIRMWARE_KEY, HIDDEN, NOTES_CC, PORTS_KEY, SCRIPT, SYNC, TYPE_KEY 3 | from .firmware_handling import get_provided_firmware_version 4 | from .push import Push 5 | 6 | def get_capabilities(): 7 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[21], model_name=u'Ableton Push'), 8 | PORTS_KEY: [inport(props=[HIDDEN, NOTES_CC, SCRIPT]), 9 | inport(props=[]), 10 | outport(props=[HIDDEN, 11 | NOTES_CC, 12 | SYNC, 13 | SCRIPT]), 14 | outport(props=[])], 15 | TYPE_KEY: u'push', 16 | FIRMWARE_KEY: get_provided_firmware_version(), 17 | AUTO_LOAD_KEY: True} 18 | 19 | 20 | def create_instance(c_instance): 21 | u""" Creates and returns the Push script """ 22 | return Push(c_instance=c_instance) 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push/drum_group_component.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from pushbase.drum_group_component import DrumGroupComponent as DrumGroupComponentBase 3 | 4 | class DrumGroupComponent(DrumGroupComponentBase): 5 | 6 | def __init__(self, selector = None, *a, **k): 7 | super(DrumGroupComponent, self).__init__(*a, **k) 8 | self._selector = selector 9 | 10 | def select_drum_pad(self, drum_pad): 11 | self._selector.on_select_drum_pad(drum_pad) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push/multi_entry_mode.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.mode import tomode, Mode 3 | 4 | class MultiEntryMode(Mode): 5 | u""" 6 | Mode wrapper that allows registration in multiple modes 7 | components. This wrapper can be entered multiple times and the 8 | enter method will be called only once. It will be left when the 9 | number of times leave_mode is called matches the number of calls 10 | to enter_mode. 11 | """ 12 | 13 | def __init__(self, mode = None, *a, **k): 14 | super(MultiEntryMode, self).__init__(*a, **k) 15 | self._mode = tomode(mode) 16 | self._entry_count = 0 17 | 18 | def enter_mode(self): 19 | if self._entry_count == 0: 20 | self._mode.enter_mode() 21 | self._entry_count += 1 22 | 23 | def leave_mode(self): 24 | assert self._entry_count > 0 25 | if self._entry_count == 1: 26 | self._mode.leave_mode() 27 | self._entry_count -= 1 28 | 29 | @property 30 | def is_entered(self): 31 | return self._entry_count > 0 32 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push/selected_track_parameter_provider.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import ParameterInfo 3 | from pushbase.selected_track_parameter_provider import SelectedTrackParameterProvider as SelectedTrackParameterProviderBase 4 | from .parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity 5 | 6 | class SelectedTrackParameterProvider(SelectedTrackParameterProviderBase): 7 | 8 | def _create_parameter_info(self, parameter, name): 9 | assert name is not None 10 | return ParameterInfo(name=name, parameter=parameter, default_encoder_sensitivity=parameter_mapping_sensitivity(parameter), fine_grain_encoder_sensitivity=fine_grain_parameter_mapping_sensitivity(parameter)) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push/with_priority.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import DEFAULT_PRIORITY 3 | from ableton.v2.control_surface.elements import WrapperElement 4 | 5 | class WithPriority(WrapperElement): 6 | 7 | def __init__(self, wrapped_priority = DEFAULT_PRIORITY, *a, **k): 8 | super(WithPriority, self).__init__(*a, **k) 9 | self.wrapped_priority = wrapped_priority 10 | self.register_control_element(self.wrapped_control) 11 | 12 | def get_control_element_priority(self, element, priority): 13 | return self.wrapped_priority 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | 3 | def get_capabilities(): 4 | from ableton.v2.control_surface import capabilities as caps 5 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=10626, product_ids=[6503], model_name=u'Ableton Push 2'), 6 | caps.PORTS_KEY: [caps.inport(props=[caps.HIDDEN, caps.NOTES_CC, caps.SCRIPT]), 7 | caps.inport(props=[]), 8 | caps.outport(props=[caps.HIDDEN, 9 | caps.NOTES_CC, 10 | caps.SYNC, 11 | caps.SCRIPT]), 12 | caps.outport(props=[])], 13 | caps.TYPE_KEY: u'push2', 14 | caps.AUTO_LOAD_KEY: True} 15 | 16 | 17 | def create_instance(c_instance): 18 | from .push2 import Push2 19 | from .push2_model import Root, Sender 20 | root = Root(sender=Sender(message_sink=c_instance.send_model_update, process_connected=c_instance.process_connected)) 21 | return Push2(c_instance=c_instance, model=root, decoupled_parameter_list_change_notifications=True) 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/mixable_utilities.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.control_surface import find_instrument_meeting_requirement 4 | 5 | def is_chain(track_or_chain): 6 | return isinstance(getattr(track_or_chain, u'proxied_object', track_or_chain), Live.Chain.Chain) 7 | 8 | 9 | def is_midi_track(track): 10 | return getattr(track, u'has_midi_input', False) and not is_chain(track) 11 | 12 | 13 | def is_audio_track(track): 14 | return getattr(track, u'has_audio_input', False) and not is_chain(track) 15 | 16 | 17 | def can_play_clips(mixable): 18 | return hasattr(mixable, u'fired_slot_index') 19 | 20 | 21 | def find_drum_rack_instrument(track): 22 | return find_instrument_meeting_requirement(lambda i: i.can_have_drum_pads, track) 23 | 24 | 25 | def find_simpler(track_or_chain): 26 | return find_instrument_meeting_requirement(lambda i: hasattr(i, u'playback_mode'), track_or_chain) 27 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/model/uniqueid.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from itertools import count 3 | 4 | class UniqueIdMixin(object): 5 | _idgen = count() 6 | 7 | def __init__(self, *a, **k): 8 | super(UniqueIdMixin, self).__init__(*a, **k) 9 | self.__id__ = self._idgen.next() 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/note_editor.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from pushbase.note_editor_component import NoteEditorComponent 3 | 4 | class Push2NoteEditorComponent(NoteEditorComponent): 5 | __events__ = (u'mute_solo_stop_cancel_action_performed',) 6 | 7 | def _on_pad_pressed(self, coordinate): 8 | super(Push2NoteEditorComponent, self)._on_pad_pressed(coordinate) 9 | self.notify_mute_solo_stop_cancel_action_performed() 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/selected_track_parameter_provider.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import ParameterInfo 3 | from pushbase.selected_track_parameter_provider import SelectedTrackParameterProvider as SelectedTrackParameterProviderBase 4 | from .parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity 5 | 6 | class SelectedTrackParameterProvider(SelectedTrackParameterProviderBase): 7 | 8 | def _create_parameter_info(self, parameter, name): 9 | assert name is not None 10 | return ParameterInfo(name=name, parameter=parameter, default_encoder_sensitivity=parameter_mapping_sensitivity(parameter), fine_grain_encoder_sensitivity=fine_grain_parameter_mapping_sensitivity(parameter)) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/session_ring_selection_linking.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import SessionRingSelectionLinking as SessionRingSelectionLinkingBase 3 | 4 | class SessionRingSelectionLinking(SessionRingSelectionLinkingBase): 5 | 6 | def _current_track(self): 7 | return self._session_ring.selected_item 8 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/settings.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from pushbase.setting import OnOffSetting 3 | 4 | def create_settings(preferences = None): 5 | preferences = preferences if preferences is not None else {} 6 | return {u'workflow': OnOffSetting(name=u'Workflow', value_labels=[u'Scene', u'Clip'], default_value=True, preferences=preferences)} 7 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/simple_mode_switcher.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import const 3 | from pushbase.note_layout_switcher import ModeSwitcherBase 4 | 5 | class SimpleModeSwitcher(ModeSwitcherBase): 6 | 7 | def __init__(self, session_modes = None, *a, **k): 8 | assert session_modes is not None 9 | super(SimpleModeSwitcher, self).__init__(*a, **k) 10 | self._session_modes = session_modes 11 | self._cycle_mode = session_modes.cycle_mode 12 | self._get_current_alternative_mode = const(session_modes) 13 | 14 | def _unlock_alternative_mode(self, locked_mode): 15 | super(SimpleModeSwitcher, self)._unlock_alternative_mode(locked_mode) 16 | self.locked_mode = None 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Push2/sliced_simpler.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from pushbase.colors import Pulse 3 | from pushbase.sliced_simpler_component import SlicedSimplerComponent 4 | from .colors import IndexedColor 5 | NEXT_SLICE_PULSE_SPEED = 48 6 | 7 | def next_slice_color(track_color_index): 8 | return Pulse(color1=IndexedColor.from_live_index(track_color_index, shade_level=2), color2=IndexedColor.from_live_index(track_color_index, shade_level=1), speed=NEXT_SLICE_PULSE_SPEED) 9 | 10 | 11 | class Push2SlicedSimplerComponent(SlicedSimplerComponent): 12 | 13 | def _next_slice_color(self): 14 | return next_slice_color(self.song.view.selected_track.color_index) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Radium49_61/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Radium49_61/config.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .consts import * 3 | TRANSPORT_CONTROLS = {u'STOP': GENERIC_STOP, 4 | u'PLAY': GENERIC_PLAY, 5 | u'REC': GENERIC_REC, 6 | u'LOOP': GENERIC_LOOP, 7 | u'RWD': GENERIC_RWD, 8 | u'FFWD': GENERIC_FFWD} 9 | DEVICE_CONTROLS = (GENERIC_ENC1, 10 | GENERIC_ENC2, 11 | GENERIC_ENC3, 12 | GENERIC_ENC4, 13 | GENERIC_ENC5, 14 | GENERIC_ENC6, 15 | GENERIC_ENC7, 16 | GENERIC_ENC8) 17 | VOLUME_CONTROLS = GENERIC_SLIDERS 18 | TRACKARM_CONTROLS = (GENERIC_BUT1, 19 | GENERIC_BUT2, 20 | GENERIC_BUT3, 21 | GENERIC_BUT4, 22 | GENERIC_BUT5, 23 | GENERIC_BUT6, 24 | GENERIC_BUT7, 25 | GENERIC_BUT8) 26 | BANK_CONTROLS = {u'TOGGLELOCK': GENERIC_BUT9, 27 | u'BANKDIAL': -1, 28 | u'NEXTBANK': -1, 29 | u'PREVBANK': -1, 30 | u'BANK1': -1, 31 | u'BANK2': -1, 32 | u'BANK3': -1, 33 | u'BANK4': -1, 34 | u'BANK5': -1, 35 | u'BANK6': -1, 36 | u'BANK7': -1, 37 | u'BANK8': -1} 38 | CONTROLLER_DESCRIPTION = {u'INPUTPORT': u'Keystation', 39 | u'OUTPUTPORT': u'Keystation', 40 | u'CHANNEL': 0} 41 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/RemoteSL/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .RemoteSL import RemoteSL 3 | 4 | def create_instance(c_instance): 5 | return RemoteSL(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[11], model_name=u'SL MkII'), 12 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 13 | inport(props=[NOTES_CC, REMOTE, SCRIPT]), 14 | outport(props=[NOTES_CC, SYNC]), 15 | outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/RemoteSL_Classic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .RemoteSL import RemoteSL 3 | 4 | def create_instance(c_instance): 5 | return RemoteSL(c_instance) 6 | 7 | 8 | from _Framework.Capabilities import * 9 | 10 | def get_capabilities(): 11 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[3], model_name=u'ReMOTE ZeRO SL'), 12 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 13 | inport(props=[NOTES_CC, REMOTE, SCRIPT]), 14 | inport(props=[NOTES_CC]), 15 | outport(props=[NOTES_CC, SYNC]), 16 | outport(props=[SCRIPT]), 17 | outport(props=[])]} 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_A_PRO/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Roland_A_PRO import Roland_A_PRO 3 | from _Framework.Capabilities import controller_id, inport, outport, CONTROLLER_ID_KEY, PORTS_KEY, NOTES_CC, SCRIPT, REMOTE 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1410, product_ids=[271], model_name=u'A-PRO'), 7 | PORTS_KEY: [inport(props=[]), 8 | inport(props=[NOTES_CC, REMOTE]), 9 | inport(props=[NOTES_CC, SCRIPT, REMOTE]), 10 | outport(props=[]), 11 | outport(props=[SCRIPT])]} 12 | 13 | 14 | def create_instance(c_instance): 15 | return Roland_A_PRO(c_instance) 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_FA/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .fa import FA 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=1410, product_ids=[372], model_name=u'FA-06 08'), 7 | PORTS_KEY: [inport(props=[]), 8 | inport(props=[NOTES_CC, SCRIPT, REMOTE]), 9 | outport(props=[]), 10 | outport(props=[SCRIPT])]} 11 | 12 | 13 | def create_instance(c_instance): 14 | return FA(c_instance=c_instance) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_FA/control_element_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.base import depends 4 | from ableton.v2.control_surface import MIDI_CC_TYPE 5 | from ableton.v2.control_surface.elements import ButtonElement, EncoderElement 6 | 7 | @depends(skin=None) 8 | def make_button(identifier, name, msg_type = MIDI_CC_TYPE, skin = None): 9 | return ButtonElement(True, msg_type, 0, identifier, name=name, skin=skin) 10 | 11 | 12 | def make_encoder(identifier, name): 13 | return EncoderElement(MIDI_CC_TYPE, 0, identifier, Live.MidiMap.MapMode.absolute, name=name) 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_FA/navigation.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionNavigationComponent as SessionNavigationComponentBase 3 | from .scroll import ScrollComponent 4 | 5 | class SessionNavigationComponent(SessionNavigationComponentBase): 6 | 7 | def __init__(self, *a, **k): 8 | super(SessionNavigationComponent, self).__init__(*a, **k) 9 | self._horizontal_paginator = ScrollComponent(self.track_pager_type(self._session_ring), parent=self) 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_FA/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.elements import Color 3 | from ableton.v2.control_surface import Skin 4 | 5 | class Colors: 6 | 7 | class DefaultButton: 8 | On = Color(127) 9 | Off = Color(0) 10 | Disabled = Color(0) 11 | 12 | class Transport: 13 | PlayOn = Color(127) 14 | PlayOff = Color(0) 15 | 16 | class Recording: 17 | On = Color(127) 18 | Off = Color(0) 19 | 20 | 21 | def make_default_skin(): 22 | return Skin(Colors) 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Roland_FA/transport.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import ButtonControl 3 | from ableton.v2.control_surface.components import TransportComponent as TransportComponentBase 4 | 5 | class TransportComponent(TransportComponentBase): 6 | jump_to_start_button = ButtonControl() 7 | 8 | @jump_to_start_button.pressed 9 | def jump_to_start_button(self, _): 10 | self.song.current_song_time = 0.0 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .sl_mkiii import SLMkIII 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=4661, product_ids=[257], model_name=[u'Novation SL MkIII']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, REMOTE]), 8 | inport(props=[NOTES_CC, SCRIPT, REMOTE]), 9 | inport(props=[NOTES_CC, REMOTE]), 10 | outport(props=[]), 11 | outport(props=[SCRIPT]), 12 | outport(props=[]), 13 | outport(props=[])]} 14 | 15 | 16 | def create_instance(c_instance): 17 | return SLMkIII(c_instance=c_instance) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/caching_control_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import depends 3 | from ableton.v2.control_surface import ControlElement 4 | from .sysex import SET_PROPERTY_MSG_HEADER 5 | 6 | class CachingControlElement(ControlElement): 7 | 8 | @depends(message_cache=None) 9 | def __init__(self, message_cache = None, *a, **k): 10 | super(CachingControlElement, self).__init__(*a, **k) 11 | self._message_cache = message_cache 12 | 13 | def send_midi(self, midi_event_bytes, **k): 14 | self._message_cache(midi_event_bytes[len(SET_PROPERTY_MSG_HEADER):-1]) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/color_sysex_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import nop 3 | from ableton.v2.control_surface.elements import ColorSysexElement as ColorSysexElementBase 4 | 5 | class ColorSysexElement(ColorSysexElementBase): 6 | 7 | class ProxiedInterface(ColorSysexElementBase.ProxiedInterface): 8 | set_light = nop 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/message.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from itertools import izip 3 | from ableton.v2.control_surface import Component 4 | from .control import TextDisplayControl 5 | NUM_MESSAGE_SEGMENTS = 2 6 | 7 | class MessageComponent(Component): 8 | display = TextDisplayControl(segments=(u'',) * NUM_MESSAGE_SEGMENTS) 9 | 10 | def __call__(self, *messages): 11 | for index, message in izip(xrange(NUM_MESSAGE_SEGMENTS), messages): 12 | self.display[index] = message if message else u'' 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/messenger.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import const, nop 3 | from ableton.v2.base.dependency import dependency 4 | 5 | class Messenger(object): 6 | message = dependency(message=const(nop)) 7 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/midi_message_cache.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .sysex import NUM_SET_PROPERTY_HEADER_BYTES 3 | 4 | class MidiMessageCache(object): 5 | 6 | def __init__(self, *a, **k): 7 | super(MidiMessageCache, self).__init__(*a, **k) 8 | self._messages = [] 9 | 10 | def __call__(self, message): 11 | self._messages = filter(lambda m: m[:NUM_SET_PROPERTY_HEADER_BYTES] != message[:NUM_SET_PROPERTY_HEADER_BYTES], self._messages) 12 | self._messages.append(message) 13 | 14 | @property 15 | def messages(self): 16 | return self._messages 17 | 18 | def clear(self): 19 | self._messages = [] 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/session.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import find_if 3 | from ableton.v2.control_surface.components import SessionComponent as SessionComponentBase 4 | 5 | class SessionComponent(SessionComponentBase): 6 | 7 | def _update_stop_clips_led(self, index): 8 | super(SessionComponent, self)._update_stop_clips_led(index) 9 | self._update_stop_all_clips_button() 10 | 11 | def _update_stop_all_clips_button(self): 12 | button = self._stop_all_button 13 | if button: 14 | value_to_send = self._stop_clip_disabled_value 15 | tracks = self.song.tracks 16 | if find_if(lambda x: x.playing_slot_index >= 0 and x.fired_slot_index != -2, tracks): 17 | value_to_send = self._stop_clip_value 18 | elif find_if(lambda x: x.fired_slot_index == -2, tracks): 19 | value_to_send = self._stop_clip_triggered_value 20 | button.set_light(value_to_send) 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/session_navigation.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionNavigationComponent as SessionNavigationComponentBase 3 | 4 | class SessionNavigationComponent(SessionNavigationComponentBase): 5 | 6 | def __init__(self, *a, **k): 7 | super(SessionNavigationComponent, self).__init__(*a, **k) 8 | self._vertical_banking.scroll_up_button.color = u'Session.Navigation' 9 | self._vertical_banking.scroll_down_button.color = u'Session.Navigation' 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/SL_MkIII/util.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import clamp, liveobj_valid 3 | from ableton.v2.control_surface.components import find_nearest_color 4 | from ableton.v2.control_surface.elements import Color 5 | from novation.colors import CLIP_COLOR_TABLE, RGB_COLOR_TABLE 6 | 7 | def normalized_parameter_value(param): 8 | value = 0.0 9 | if liveobj_valid(param): 10 | param_range = param.max - param.min 11 | value = float(param.value - param.min) / param_range 12 | return clamp(value, 0.0, 1.0) 13 | 14 | 15 | def convert_parameter_value_to_midi_value(param): 16 | return int(normalized_parameter_value(param) * 127) 17 | 18 | 19 | def is_song_recording(song): 20 | return song.session_record or song.record_mode 21 | 22 | 23 | def color_for_track(track): 24 | color_value = 0 25 | if liveobj_valid(track): 26 | try: 27 | color_value = CLIP_COLOR_TABLE[track.color] 28 | except (KeyError, IndexError): 29 | color_value = find_nearest_color(RGB_COLOR_TABLE, track.color) 30 | 31 | return Color(color_value) 32 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/Tranzport/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .Tranzport import Tranzport 3 | 4 | def create_instance(c_instance): 5 | return Tranzport(c_instance) 6 | 7 | 8 | def exit_instance(): 9 | pass 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/TriggerFinger/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/UC33e/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2637, product_ids=[245], model_name=u'UC-33 USB MIDI Controller'), 15 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT]), inport(props=[NOTES_CC]), outport(props=[SCRIPT])]} 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/VCM600/TransportComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.TransportComponent import TransportComponent as TransportComponentBase 3 | 4 | class TransportComponent(TransportComponentBase): 5 | 6 | def __init__(self, *a, **k): 7 | super(TransportComponent, self).__init__(*a, **k) 8 | self._punch_in_toggle.is_momentary = False 9 | self._punch_out_toggle.is_momentary = False 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/VCM600/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import _Framework.Capabilities as caps 3 | from .VCM600 import VCM600 4 | 5 | def get_capabilities(): 6 | return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=6817, product_ids=[64], model_name=[u'VCM-600']), 7 | caps.PORTS_KEY: [caps.inport(props=[caps.SCRIPT]), caps.outport(props=[caps.SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | u""" Creates and returns the ADA1 script """ 12 | return VCM600(c_instance) 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ZERO8/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTION, MIXER_OPTIONS) 9 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_APC/DeviceBankButtonElement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ComboElement import ComboElement 3 | 4 | class DeviceBankButtonElement(ComboElement): 5 | u""" 6 | ComboElement that will change the channel, while the control is grabbed 7 | """ 8 | 9 | def on_nested_control_element_received(self, control): 10 | super(DeviceBankButtonElement, self).on_nested_control_element_received(control) 11 | if control == self.wrapped_control: 12 | self.wrapped_control.set_channel(1) 13 | 14 | def on_nested_control_element_lost(self, control): 15 | super(DeviceBankButtonElement, self).on_nested_control_element_lost(control) 16 | if control == self.wrapped_control: 17 | self.wrapped_control.set_channel(0) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_APC/SessionComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.SessionComponent import SessionComponent as SessionComponentBase 3 | 4 | class SessionComponent(SessionComponentBase): 5 | u""" Special SessionComponent for the APC controllers' combination mode """ 6 | 7 | def link_with_track_offset(self, track_offset): 8 | assert track_offset >= 0 9 | if self._is_linked(): 10 | self._unlink() 11 | self.set_offsets(track_offset, self.scene_offset()) 12 | self._link() 13 | 14 | def unlink(self): 15 | if self._is_linked(): 16 | self._unlink() 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_APC/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Arturia/ScrollComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ScrollComponent import ScrollComponent as ScrollComponentBase 3 | from _Framework.Control import EncoderControl 4 | 5 | class ScrollComponent(ScrollComponentBase): 6 | scroll_encoder = EncoderControl() 7 | 8 | def set_scroll_encoder(self, encoder): 9 | self.scroll_encoder.set_control_element(encoder) 10 | self.update() 11 | 12 | @scroll_encoder.value 13 | def scroll_encoder(self, value, encoder): 14 | scroll_step = None 15 | if value > 0 and self.can_scroll_down(): 16 | scroll_step = self._do_scroll_down 17 | elif value < 0 and self.can_scroll_up(): 18 | scroll_step = self._do_scroll_up 19 | if scroll_step is not None: 20 | scroll_step() 21 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Arturia/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Axiom/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/ClipCreator.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | _Q = Live.Song.Quantization 4 | 5 | class ClipCreator(object): 6 | u""" 7 | Manages clip creation over all components. 8 | """ 9 | grid_quantization = None 10 | is_grid_triplet = False 11 | fixed_length = 8 12 | 13 | def create(self, slot, length = None): 14 | assert slot.clip == None 15 | if length is None: 16 | length = self.fixed_length 17 | slot.create_clip(length) 18 | if self.grid_quantization != None: 19 | slot.clip.view.grid_quantization = self.grid_quantization 20 | slot.clip.view.grid_is_triplet = self.is_grid_triplet 21 | slot.fire(force_legato=True, launch_quantization=_Q.q_no_q) 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/Defaults.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | TIMER_DELAY = 0.1 3 | MOMENTARY_DELAY = 0.3 4 | MOMENTARY_DELAY_TICKS = int(MOMENTARY_DELAY / TIMER_DELAY) 5 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/NotifyingControlElement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .SubjectSlot import Subject, SubjectEvent 3 | from .ControlElement import ControlElement 4 | 5 | class NotifyingControlElement(Subject, ControlElement): 6 | u""" 7 | Class representing control elements that can send values 8 | """ 9 | __subject_events__ = (SubjectEvent(name=u'value', doc=u' Called when the control element receives a MIDI value\n from the hardware '),) 10 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/SliderElement.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from .EncoderElement import EncoderElement 4 | from .InputControlElement import MIDI_NOTE_TYPE 5 | 6 | class SliderElement(EncoderElement): 7 | u""" Class representing a slider on the controller """ 8 | 9 | def __init__(self, msg_type, channel, identifier, *a, **k): 10 | assert msg_type is not MIDI_NOTE_TYPE 11 | super(SliderElement, self).__init__(msg_type, channel, identifier, map_mode=Live.MidiMap.MapMode.absolute, *a, **k) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/SysexValueControl.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .InputControlElement import InputControlElement, MIDI_SYSEX_TYPE 3 | 4 | class SysexValueControl(InputControlElement): 5 | u""" 6 | Sysex value control receives a sysex message, identified by a 7 | prefix. The value can be requested with a value_enquiry MIDI 8 | message to the controller. 9 | """ 10 | 11 | def __init__(self, message_prefix = None, value_enquiry = None, default_value = None, *a, **k): 12 | super(SysexValueControl, self).__init__(msg_type=MIDI_SYSEX_TYPE, sysex_identifier=message_prefix, *a, **k) 13 | self._value_enquiry = value_enquiry 14 | self._default_value = default_value 15 | 16 | def send_value(self, value_bytes): 17 | self.send_midi(self.message_sysex_identifier() + value_bytes + (247,)) 18 | 19 | def enquire_value(self): 20 | assert self._value_enquiry != None 21 | self.send_midi(self._value_enquiry) 22 | 23 | def reset(self): 24 | if self._default_value != None: 25 | self.send_value(self._default_value) 26 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Framework/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Generic/SelectChanStripComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.ChannelStripComponent import ChannelStripComponent 3 | 4 | class SelectChanStripComponent(ChannelStripComponent): 5 | u""" Subclass of channel strip component that selects tracks that it arms """ 6 | 7 | def __init__(self): 8 | ChannelStripComponent.__init__(self) 9 | 10 | def _arm_value(self, value): 11 | assert self._arm_button != None 12 | assert value in range(128) 13 | if self.is_enabled(): 14 | track_was_armed = False 15 | if self._track != None and self._track.can_be_armed: 16 | track_was_armed = self._track.arm 17 | ChannelStripComponent._arm_value(self, value) 18 | if self._track != None and self._track.can_be_armed: 19 | if self._track.arm and not track_was_armed: 20 | if self._track.view.select_instrument(): 21 | self.song().view.selected_track = self._track 22 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Generic/SpecialMixerComponent.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Framework.MixerComponent import MixerComponent 3 | from .SelectChanStripComponent import SelectChanStripComponent 4 | 5 | class SpecialMixerComponent(MixerComponent): 6 | u""" Class encompassing several selecting channel strips to form a mixer """ 7 | 8 | def _create_strip(self): 9 | return SelectChanStripComponent() 10 | 11 | def set_bank_up_button(self, button): 12 | self.set_bank_buttons(button, self._bank_down_button) 13 | 14 | def set_bank_down_button(self, button): 15 | self.set_bank_buttons(self._bank_up_button, button) 16 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Generic/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Generic/testing/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Generic/testing/util.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.base import const, nop 4 | from ableton.v2.testing import count_calls 5 | 6 | class MockControlSurface(object): 7 | instance_identifier = const(0) 8 | request_rebuild_midi_map = count_calls() 9 | show_message = nop 10 | send_midi = nop 11 | 12 | def __init__(self, *a, **k): 13 | super(MockControlSurface, self).__init__(*a, **k) 14 | self._song = Live.Song.Song(num_tracks=4, num_returns=2) 15 | 16 | def song(self): 17 | return self._song 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/clip_launch_component.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.component import Component 4 | from ableton.v2.control_surface.control import ButtonControl 5 | 6 | class ClipLaunchComponent(Component): 7 | clip_launch_button = ButtonControl() 8 | track_stop_button = ButtonControl() 9 | 10 | @clip_launch_button.pressed 11 | def clip_launch_button(self, _): 12 | song_view = self.song.view 13 | slot_or_scene = song_view.selected_scene if self.song.view.selected_track == self.song.master_track else song_view.highlighted_clip_slot 14 | if liveobj_valid(slot_or_scene): 15 | slot_or_scene.fire() 16 | 17 | @track_stop_button.pressed 18 | def track_stop_button(self, _): 19 | track = self.song.view.selected_track 20 | if track == self.song.master_track: 21 | self.song.stop_all_clips() 22 | elif track in self.song.tracks: 23 | track.stop_all_clips() 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/physical_display_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from itertools import chain, imap 3 | from ableton.v2.control_surface.elements import PhysicalDisplayElement as PhysicalDisplayElementBase 4 | 5 | class PhysicalDisplayElement(PhysicalDisplayElementBase): 6 | 7 | def _build_display_message(self, display): 8 | return chain(*imap(lambda x: self._translate_string(unicode(x).strip()), display._logical_segments)) 9 | 10 | def _request_send_message(self): 11 | self._send_message() 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/selection_linked_session_ring_component.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import listens 3 | from ableton.v2.control_surface.components import SessionRingComponent 4 | 5 | class SelectionLinkedSessionRingComponent(SessionRingComponent): 6 | 7 | def __init__(self, *a, **k): 8 | super(SelectionLinkedSessionRingComponent, self).__init__(*a, **k) 9 | self.__on_selected_track_changed.subject = self.song.view 10 | self.__on_selected_track_changed() 11 | 12 | @listens(u'selected_track') 13 | def __on_selected_track_changed(self): 14 | selected_track = self.song.view.selected_track 15 | if selected_track not in self.controlled_tracks(): 16 | all_tracks = list(self.tracks_to_use()) 17 | self.track_offset = all_tracks.index(selected_track) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Skin 3 | from ableton.v2.control_surface.elements import Color 4 | 5 | class Colors: 6 | 7 | class DefaultButton: 8 | On = Color(127) 9 | Off = Color(0) 10 | Disabled = Color(0) 11 | 12 | class Transport: 13 | PlayOn = Color(127) 14 | PlayOff = Color(0) 15 | 16 | class Automation: 17 | On = Color(127) 18 | Off = Color(0) 19 | 20 | class Mixer: 21 | MuteOn = Color(0) 22 | MuteOff = Color(1) 23 | SoloOn = Color(1) 24 | SoloOff = Color(0) 25 | 26 | 27 | skin = Skin(Colors) 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Komplete_Kontrol/sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import midi 3 | HEADER = (midi.SYSEX_START, 4 | 0, 5 | 33, 6 | 9, 7 | 0, 8 | 0, 9 | 68, 10 | 67, 11 | 1, 12 | 0) 13 | TRACK_TYPE_DISPLAY_HEADER = HEADER + (64,) 14 | TRACK_CHANGED_DISPLAY_HEADER = HEADER + (65, 0, 0) 15 | TRACK_SELECT_DISPLAY_HEADER = HEADER + (66,) 16 | TRACK_MUTE_DISPLAY_HEADER = HEADER + (67,) 17 | TRACK_SOLO_DISPLAY_HEADER = HEADER + (68,) 18 | TRACK_ARM_DISPLAY_HEADER = HEADER + (69,) 19 | TRACK_VOLUME_DISPLAY_HEADER = HEADER + (70, 0) 20 | TRACK_PANNING_DISPLAY_HEADER = HEADER + (71, 0) 21 | TRACK_NAME_DISPLAY_HEADER = HEADER + (72, 0) 22 | TRACK_METER_DISPLAY_HEADER = HEADER + (73, 2, 0) 23 | TRACK_MUTED_VIA_SOLO_DISPLAY_HEADER = HEADER + (74,) 24 | EMPTY_TRACK_TYPE_VALUE = 0 25 | DEFAULT_TRACK_TYPE_VALUE = 1 26 | MASTER_TRACK_TYPE_VALUE = 6 27 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_MPDMkIIBase/ControlElementUtils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from _Framework.InputControlElement import MIDI_CC_TYPE 4 | from _Framework.EncoderElement import EncoderElement 5 | from _Framework.SliderElement import SliderElement 6 | from _Framework.ButtonElement import ButtonElement 7 | 8 | def make_encoder(identifier, channel, name): 9 | return EncoderElement(MIDI_CC_TYPE, channel, identifier, Live.MidiMap.MapMode.absolute, name=name) 10 | 11 | 12 | def make_slider(identifier, channel, name): 13 | return SliderElement(MIDI_CC_TYPE, channel, identifier, name=name) 14 | 15 | 16 | def make_button(identifier, channel, name): 17 | return ButtonElement(True, MIDI_CC_TYPE, channel, identifier, name=name) 18 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_MPDMkIIBase/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | HIDE_SCRIPT = True 3 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/_Tools/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/base/collection/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .indexed_dict import IndexedDict 3 | __all__ = (u'IndexedDict',) 4 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/base/live_api_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | 3 | def liveobj_changed(obj, other): 4 | u""" 5 | Check whether obj and other are not equal, properly handling lost weakrefs. 6 | 7 | Use this whenever you cache a Live API object in some variable, and want to check 8 | whether you need to update the cached object. 9 | """ 10 | return obj != other or type(obj) != type(other) 11 | 12 | 13 | def liveobj_valid(obj): 14 | u""" 15 | Check whether obj represents a valid Live API obj. 16 | 17 | This will return False both if obj represents a lost weakref or is None. 18 | It's important that Live API objects are not checked using "is None", since this 19 | would treat lost weakrefs as valid. 20 | """ 21 | return obj != None 22 | 23 | 24 | def is_parameter_bipolar(param): 25 | return param.min == -1 * param.max 26 | 27 | 28 | def duplicate_clip_loop(clip): 29 | if liveobj_valid(clip) and clip.is_midi_clip: 30 | try: 31 | clip.duplicate_loop() 32 | except RuntimeError: 33 | pass 34 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/clip_creator.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | _Q = Live.Song.Quantization 4 | 5 | class ClipCreator(object): 6 | u""" 7 | Manages clip creation over all components. 8 | """ 9 | grid_quantization = None 10 | is_grid_triplet = False 11 | fixed_length = 8 12 | legato_launch = True 13 | 14 | def create(self, slot, length = None, launch_quantization = None, legato_launch = None): 15 | assert slot.clip == None 16 | if length is None: 17 | length = self.fixed_length 18 | slot.create_clip(length) 19 | should_legato_launch = self.legato_launch if legato_launch is None else legato_launch 20 | if self.grid_quantization is not None: 21 | slot.clip.view.grid_quantization = self.grid_quantization 22 | slot.clip.view.grid_is_triplet = self.is_grid_triplet 23 | if launch_quantization is None or should_legato_launch: 24 | launch_quantization = _Q.q_no_q 25 | slot.fire(force_legato=should_legato_launch, launch_quantization=launch_quantization) 26 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/components/undo_redo.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .. import Component 3 | from ..control import ButtonControl 4 | 5 | class UndoRedoComponent(Component): 6 | undo_button = ButtonControl() 7 | redo_button = ButtonControl() 8 | 9 | @undo_button.pressed 10 | def undo_button(self, button): 11 | self._undo() 12 | 13 | @redo_button.pressed 14 | def redo_button(self, button): 15 | self._redo() 16 | 17 | def _redo(self): 18 | if self.song.can_redo: 19 | self.song.redo() 20 | 21 | def _undo(self): 22 | if self.song.can_undo: 23 | self.song.undo() 24 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/control/sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .control import Control, control_color 3 | 4 | class ColorSysexControl(Control): 5 | 6 | class State(Control.State): 7 | color = control_color(u'DefaultButton.Disabled') 8 | 9 | def __init__(self, color = None, *a, **k): 10 | super(ColorSysexControl.State, self).__init__(*a, **k) 11 | if color is not None: 12 | self.color = color 13 | 14 | def set_control_element(self, control_element): 15 | super(ColorSysexControl.State, self).set_control_element(control_element) 16 | self._send_current_color() 17 | 18 | def update(self): 19 | super(ColorSysexControl.State, self).update() 20 | self._send_current_color() 21 | 22 | def _send_current_color(self): 23 | if self._control_element: 24 | self._control_element.set_light(self.color) 25 | 26 | def __init__(self, *a, **k): 27 | super(ColorSysexControl, self).__init__(extra_args=a, extra_kws=k) 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/defaults.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | TIMER_DELAY = 0.1 3 | MOMENTARY_DELAY = 0.3 4 | MOMENTARY_DELAY_TICKS = int(MOMENTARY_DELAY / TIMER_DELAY) 5 | DOUBLE_CLICK_DELAY = 0.5 6 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/elements/full_velocity_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from .proxy_element import ProxyElement 3 | 4 | class NullFullVelocity(object): 5 | enabled = False 6 | 7 | 8 | class FullVelocityElement(ProxyElement): 9 | 10 | def __init__(self, full_velocity = None, *a, **k): 11 | super(FullVelocityElement, self).__init__(proxied_object=full_velocity, proxied_interface=NullFullVelocity()) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/elements/playhead_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ...base import nop 3 | from .proxy_element import ProxyElement 4 | 5 | class NullPlayhead(object): 6 | notes = [] 7 | start_time = 0.0 8 | step_length = 1.0 9 | velocity = 0.0 10 | wrap_around = False 11 | track = None 12 | clip = None 13 | set_feedback_channels = nop 14 | 15 | 16 | class PlayheadElement(ProxyElement): 17 | 18 | def __init__(self, playhead = None, *a, **k): 19 | super(PlayheadElement, self).__init__(proxied_object=playhead, proxied_interface=NullPlayhead()) 20 | 21 | def reset(self): 22 | self.track = None 23 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/elements/proxy_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ...base import Proxy 3 | from ..control_element import ControlElement 4 | 5 | class ProxyElement(Proxy, ControlElement): 6 | 7 | def reset(self): 8 | try: 9 | super(ProxyElement, self).__getattr__(u'reset')() 10 | except AttributeError: 11 | pass 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/elements/slider.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ..input_control_element import MIDI_NOTE_TYPE 4 | from .encoder import EncoderElement 5 | 6 | class SliderElement(EncoderElement): 7 | 8 | def __init__(self, msg_type, channel, identifier, *a, **k): 9 | assert msg_type is not MIDI_NOTE_TYPE 10 | super(SliderElement, self).__init__(msg_type, channel, identifier, map_mode=Live.MidiMap.MapMode.absolute, *a, **k) 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/ableton/v2/control_surface/elements/velocity_levels_element.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ...base import EventObject, listenable_property 3 | from .proxy_element import ProxyElement 4 | 5 | class NullVelocityLevels(EventObject): 6 | enabled = False 7 | target_note = -1 8 | target_channel = -1 9 | source_channel = -1 10 | notes = [] 11 | 12 | @property 13 | def levels(self): 14 | return [] 15 | 16 | @listenable_property 17 | def last_played_level(self): 18 | return -1.0 19 | 20 | 21 | class VelocityLevelsElement(ProxyElement): 22 | 23 | def __init__(self, velocity_levels = None, *a, **k): 24 | super(VelocityLevelsElement, self).__init__(proxied_object=velocity_levels, proxied_interface=NullVelocityLevels()) 25 | 26 | def reset(self): 27 | self.notes = [] 28 | self.source_channel = -1 29 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/iRig_Keys_IO/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.capabilities import CONTROLLER_ID_KEY, NOTES_CC, PORTS_KEY, REMOTE, SCRIPT, controller_id, inport, outport 3 | from .irig_keys_io import IRigKeysIO 4 | 5 | def get_capabilities(): 6 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=6499, product_ids=[46, 45], model_name=[u'iRig Keys IO 25', u'iRig Keys IO 49']), 7 | PORTS_KEY: [inport(props=[NOTES_CC, SCRIPT, REMOTE]), outport(props=[SCRIPT])]} 8 | 9 | 10 | def create_instance(c_instance): 11 | return IRigKeysIO(c_instance=c_instance) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/iRig_Keys_IO/scroll.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import nop 3 | from ableton.v2.control_surface.components import ScrollComponent as ScrollComponentBase 4 | from ableton.v2.control_surface.control import EncoderControl 5 | 6 | class ScrollComponent(ScrollComponentBase): 7 | scroll_encoder = EncoderControl() 8 | 9 | @scroll_encoder.value 10 | def scroll_encoder(self, value, _): 11 | scroll_step = nop 12 | if value > 0 and self.can_scroll_down(): 13 | scroll_step = self._do_scroll_down 14 | elif value < 0 and self.can_scroll_up(): 15 | scroll_step = self._do_scroll_up 16 | scroll_step() 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/iRig_Keys_IO/session_recording.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionRecordingComponent as SessionRecordingComponentBase 3 | from ableton.v2.control_surface.control import ButtonControl 4 | 5 | class SessionRecordingComponent(SessionRecordingComponentBase): 6 | record_stop_button = ButtonControl() 7 | 8 | @record_stop_button.pressed 9 | def record_stop_button(self, _): 10 | self.song.session_record = False 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/iRig_Keys_IO/session_ring.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import listens 3 | from ableton.v2.control_surface.components import SessionRingComponent 4 | 5 | class SelectedTrackFollowingSessionRingComponent(SessionRingComponent): 6 | 7 | def __init__(self, *a, **k): 8 | super(SelectedTrackFollowingSessionRingComponent, self).__init__(*a, **k) 9 | self.__on_selected_track_changed.subject = self.song.view 10 | self.__on_selected_track_changed() 11 | 12 | @listens(u'selected_track') 13 | def __on_selected_track_changed(self): 14 | tracks_to_use = self.tracks_to_use() 15 | selected_track = self.song.view.selected_track 16 | if selected_track in tracks_to_use: 17 | track_index = list(tracks_to_use).index(selected_track) 18 | new_offset = track_index - track_index % self.num_tracks 19 | self.track_offset = new_offset 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/iRig_Keys_IO/skin.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import Skin 3 | from ableton.v2.control_surface.elements import Color 4 | 5 | class Colors: 6 | 7 | class DefaultButton: 8 | On = Color(0) 9 | Off = Color(0) 10 | Disabled = Color(0) 11 | 12 | class Transport: 13 | PlayOn = Color(0) 14 | PlayOff = Color(0) 15 | 16 | class Recording: 17 | On = Color(0) 18 | Off = Color(0) 19 | 20 | class Mixer: 21 | MuteOff = Color(127) 22 | MuteOn = Color(0) 23 | SoloOn = Color(127) 24 | SoloOff = Color(0) 25 | 26 | 27 | skin = Skin(Colors) 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/microKONTROL/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2372, product_ids=[256], model_name=u'microKONTROL'), 15 | PORTS_KEY: [inport(props=[NOTES_CC]), 16 | inport(props=[NOTES_CC, SCRIPT]), 17 | inport(props=[NOTES_CC]), 18 | outport(props=[PLAIN_OLD_MIDI]), 19 | outport(props=[SCRIPT])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/clip_slot.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import const, depends 3 | from ableton.v2.control_surface.components import ClipSlotComponent as ClipSlotComponentBase 4 | 5 | class FixedLengthClipSlotComponent(ClipSlotComponentBase): 6 | 7 | @depends(fixed_length_recording=const(None)) 8 | def __init__(self, fixed_length_recording, *a, **k): 9 | assert fixed_length_recording is not None 10 | super(FixedLengthClipSlotComponent, self).__init__(*a, **k) 11 | self._fixed_length_recording = fixed_length_recording 12 | 13 | def _do_launch_clip(self, fire_state): 14 | slot = self._clip_slot 15 | if self._fixed_length_recording.should_start_recording_in_slot(slot): 16 | self._fixed_length_recording.start_recording_in_slot(slot) 17 | else: 18 | super(FixedLengthClipSlotComponent, self)._do_launch_clip(fire_state) 19 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/configurable_playable.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import PlayableComponent 3 | 4 | class ConfigurablePlayableComponent(PlayableComponent): 5 | 6 | def __init__(self, translation_channel, *a, **k): 7 | self._translation_channel = translation_channel 8 | super(ConfigurablePlayableComponent, self).__init__(*a, **k) 9 | 10 | def _note_translation_for_button(self, button): 11 | return (button.identifier, self._translation_channel) 12 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/drum_group.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import DrumGroupComponent as DrumGroupComponentBase 3 | from .util import skin_scroll_buttons 4 | 5 | class DrumGroupComponent(DrumGroupComponentBase): 6 | 7 | def __init__(self, *a, **k): 8 | super(DrumGroupComponent, self).__init__(*a, **k) 9 | skin_scroll_buttons(self._position_scroll, u'DrumGroup.Navigation', u'DrumGroup.NavigationPressed') 10 | skin_scroll_buttons(self._page_scroll, u'DrumGroup.Navigation', u'DrumGroup.NavigationPressed') 11 | 12 | def set_parent_track(self, track): 13 | pass 14 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/mode.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.control import InputControl 3 | from ableton.v2.control_surface.mode import ModesComponent as ModesComponentBase 4 | 5 | class ModesComponent(ModesComponentBase): 6 | __events__ = (u'mode_byte',) 7 | mode_selection_control = InputControl() 8 | 9 | @mode_selection_control.value 10 | def mode_selection_control(self, value, _): 11 | modes = self.modes 12 | if value < len(modes): 13 | self.selected_mode = modes[value] 14 | self.notify_mode_byte(value) 15 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/session_navigation.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface.components import SessionNavigationComponent as SessionNavigationComponentBase 3 | from .util import skin_scroll_buttons 4 | 5 | class SessionNavigationComponent(SessionNavigationComponentBase): 6 | 7 | def __init__(self, *a, **k): 8 | super(SessionNavigationComponent, self).__init__(*a, **k) 9 | skin_scroll_buttons(self._vertical_banking, u'Session.Navigation', u'Session.NavigationPressed') 10 | skin_scroll_buttons(self._horizontal_banking, u'Session.Navigation', u'Session.NavigationPressed') 11 | skin_scroll_buttons(self._vertical_paginator, u'Session.Navigation', u'Session.NavigationPressed') 12 | skin_scroll_buttons(self._horizontal_paginator, u'Session.Navigation', u'Session.NavigationPressed') 13 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | SYSEX_START_BYTE = 240 3 | SYSEX_END_BYTE = 247 4 | NOVATION_MANUFACTURER_ID = (0, 32, 41) 5 | DEVICE_FAMILY_MEMBER_CODE = (0, 0) 6 | STD_MSG_HEADER = (SYSEX_START_BYTE,) + NOVATION_MANUFACTURER_ID + (2,) 7 | LAYOUT_COMMAND_BYTE = 0 8 | FADER_COMMAND_BYTE = 1 9 | PRINT_COMMAND_BYTE = 3 10 | NOTE_LAYOUT_COMMAND_BYTE = 15 11 | FIRMWARE_MODE_COMMAND_BYTE = 16 12 | SCALE_FEEDBACK_COMMAND_BYTE = 23 13 | PRINT_ENABLE_COMMAND_BYTE = 24 14 | STOP_FADER_COMMAND_BYTE = 25 15 | STANDALONE_MODE_BYTE = 0 16 | DAW_MODE_BYTE = 1 17 | SESSION_LAYOUT_BYTE = 0 18 | NOTE_LAYOUT_BYTE = 1 19 | KEYS_LAYOUT_BYTE = 5 20 | FADERS_LAYOUT_BYTE = 13 21 | SCALE_LAYOUT_BYTE = 0 22 | DRUM_LAYOUT_BYTE = 1 23 | FADER_VERTICAL_ORIENTATION = 0 24 | FADER_HORIZONTAL_ORIENTATION = 1 25 | FADER_UNIPOLAR = 0 26 | FADER_BIPOLAR = 1 27 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/testing/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/novation/util.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.base import liveobj_valid 3 | from ableton.v2.control_surface.components import find_nearest_color 4 | from .colors import CLIP_COLOR_TABLE, RGB_COLOR_TABLE, Rgb 5 | 6 | def skin_scroll_buttons(scoll_component, color, pressed_color): 7 | scoll_component.scroll_up_button.color = color 8 | scoll_component.scroll_down_button.color = color 9 | scoll_component.scroll_up_button.pressed_color = pressed_color 10 | scoll_component.scroll_down_button.pressed_color = pressed_color 11 | 12 | 13 | def is_song_recording(song): 14 | return song.session_record or song.record_mode 15 | 16 | 17 | def get_midi_color_value_for_track(track): 18 | u""" 19 | Returns midi value corresponding to track color for a valid track, 20 | otherwise return Rgb.BLACK (the off color) 21 | """ 22 | if liveobj_valid(track): 23 | color = CLIP_COLOR_TABLE.get(track.color, None) 24 | if color is None: 25 | color = find_nearest_color(RGB_COLOR_TABLE, track.color) 26 | return color 27 | return Rgb.BLACK.midi_value 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/padKONTROL/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from _Generic.GenericScript import GenericScript 3 | import Live 4 | from .config import * 5 | 6 | def create_instance(c_instance): 7 | u""" The generic script can be customised by using parameters (see config.py). """ 8 | return GenericScript(c_instance, Live.MidiMap.MapMode.absolute, Live.MidiMap.MapMode.absolute, DEVICE_CONTROLS, TRANSPORT_CONTROLS, VOLUME_CONTROLS, TRACKARM_CONTROLS, BANK_CONTROLS, CONTROLLER_DESCRIPTIONS, MIXER_OPTIONS) 9 | 10 | 11 | from _Framework.Capabilities import * 12 | 13 | def get_capabilities(): 14 | return {CONTROLLER_ID_KEY: controller_id(vendor_id=2372, product_ids=[261], model_name=u'padKONTROL'), 15 | PORTS_KEY: [inport(props=[PLAIN_OLD_MIDI]), 16 | inport(props=[NOTES_CC, SCRIPT]), 17 | inport(props=[]), 18 | outport(props=[PLAIN_OLD_MIDI]), 19 | outport(props=[SCRIPT])]} 20 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/device_chain_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from itertools import imap, chain 4 | from functools import partial 5 | from ableton.v2.base import find_if, liveobj_valid 6 | 7 | def is_empty_drum_pad(drum_pad): 8 | return isinstance(drum_pad, Live.DrumPad.DrumPad) and (not drum_pad.chains or not drum_pad.chains[0].devices) 9 | 10 | 11 | def is_first_device_on_pad(device, drum_pad): 12 | return find_if(lambda pad: pad.chains and pad.chains[0].devices and pad.chains[0].devices[0] == device, drum_pad.canonical_parent.drum_pads) 13 | 14 | 15 | def is_simpler(device): 16 | return device and device.class_name == u'OriginalSimpler' 17 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/matrix_maps.py: -------------------------------------------------------------------------------- 1 | u""" 2 | Pad Translations for Drum Rack (pad_x, pad_y, note, channel) 3 | """ 4 | from __future__ import absolute_import, print_function, unicode_literals 5 | PAD_TRANSLATIONS = ((0, 0, 60, 13), 6 | (1, 0, 61, 13), 7 | (2, 0, 62, 13), 8 | (3, 0, 63, 13), 9 | (0, 1, 52, 13), 10 | (1, 1, 53, 13), 11 | (2, 1, 54, 13), 12 | (3, 1, 55, 13), 13 | (0, 2, 44, 13), 14 | (1, 2, 45, 13), 15 | (2, 2, 46, 13), 16 | (3, 2, 47, 13), 17 | (0, 3, 36, 13), 18 | (1, 3, 37, 13), 19 | (2, 3, 38, 13), 20 | (3, 3, 39, 13)) 21 | NON_FEEDBACK_CHANNEL = 0 22 | FEEDBACK_CHANNELS = range(9, 16) 23 | PAD_FEEDBACK_CHANNEL = FEEDBACK_CHANNELS[-1] 24 | PLAYHEAD_FEEDBACK_CHANNELS = range(1, 9) 25 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/mixer_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | 4 | def is_set_to_split_stereo(mixer): 5 | modes = Live.MixerDevice.MixerDevice.panning_modes 6 | return modes.stereo_split == getattr(mixer, u'panning_mode', modes.stereo) 7 | 8 | 9 | def has_pan_mode(mixer): 10 | return hasattr(mixer, u'panning_mode') 11 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/song_utils.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | import Live 3 | from ableton.v2.base import liveobj_valid 4 | 5 | def is_return_track(song, track): 6 | return track in list(song.return_tracks) 7 | 8 | 9 | def delete_track_or_return_track(song, track): 10 | tracks = list(song.tracks) 11 | if track in tracks: 12 | track_index = tracks.index(track) 13 | song.delete_track(track_index) 14 | else: 15 | track_index = list(song.return_tracks).index(track) 16 | song.delete_return_track(track_index) 17 | 18 | 19 | def find_parent_track(live_object): 20 | u""" 21 | Returns either the parent track of a live object or None if one is not found. 22 | """ 23 | track = live_object 24 | while liveobj_valid(track) and not isinstance(track, Live.Track.Track): 25 | track = getattr(track, u'canonical_parent', None) 26 | 27 | return track 28 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/sysex.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | USER_MODE = 1 3 | LIVE_MODE = 0 4 | -------------------------------------------------------------------------------- /MIDI Remote Scripts/pushbase/transport_component.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, print_function, unicode_literals 2 | from ableton.v2.control_surface import components 3 | 4 | class TransportComponent(components.TransportComponent): 5 | 6 | def __init__(self, *a, **k): 7 | super(TransportComponent, self).__init__(*a, **k) 8 | self._metronome_toggle.view_transform = lambda v: (u'Metronome.On' if v else u'Metronome.Off') 9 | --------------------------------------------------------------------------------