class AumPush2(Push2): device_component_class = AumPush2DeviceComponent device_provider_class = ModDeviceProvider def __init__(self, c_instance, model): self._monomod_version = 'b996' self._cntrlr_version = 'b996' self._host_name = 'AumPush2' self._color_type = 'Push' self._auto_arm_calls = 0 self.log_message = logger.warning super(AumPush2, self).__init__(c_instance, model) with self.component_guard(): self._hack_stuff() #self._on_selected_track_changed.subject = self.song.view #self._on_main_mode_changed.subject = self._main_modes self.log_message('<<<<<<<<<<<<<<<<<<<<<<<< AumPush2 ' + str(self._monomod_version) + ' log opened >>>>>>>>>>>>>>>>>>>>>>>>') def _create_components(self): self._remove_pedal() super(AumPush2, self)._create_components() #no idea why this is messing up the stock colors? def _create_skin(self): return self.register_disconnectable(make_default_skin()) def _setup_mod(self): def get_monomodular(host): if isinstance(__builtins__, dict): if not 'monomodular' in __builtins__.keys() or not isinstance(__builtins__['monomodular'], ModRouter): __builtins__['monomodular'] = ModRouter(song = self.song, register_component = self._register_component) else: if not hasattr(__builtins__, 'monomodular') or not isinstance(__builtins__['monomodular'], ModRouter): setattr(__builtins__, 'monomodular', ModRouter(song = self.song, register_component = self._register_component)) monomodular = __builtins__['monomodular'] if not monomodular.has_host(): monomodular.set_host(host) return monomodular self.monomodular = get_monomodular(self) self.monomodular.name = 'monomodular_switcher' with inject(register_component = const(self._register_component), song = const(self.song)).everywhere(): self.modhandler = PushModHandler(self) ## song = self.song, register_component = self._register_component) #debug('mod task group:', self.modhandler.parent_task_group) self.modhandler.name = 'ModHandler' self.modhandler.layer = Layer( priority = 6, lock_button = self.elements.note_mode_button, grid = self.elements.matrix, shift_button = self.elements.shift_button, alt_button = self.elements.select_button, nav_up_button = self.elements.octave_up_button, nav_down_button = self.elements.octave_down_button, nav_left_button = self.elements.in_button, nav_right_button = self.elements.out_button, key_buttons = self.elements.side_buttons, ) #self.modhandler.layer.priority = 0 self.modhandler.legacy_shift_layer = AddLayerMode( self.modhandler, Layer(priority = 7, device_selector_matrix = self.elements.matrix.submatrix[:, :1], channel_buttons = self.elements.matrix.submatrix[:, 1:2], nav_matrix = self.elements.matrix.submatrix[4:8, 2:6], )) self.modhandler.shift_layer = AddLayerMode( self.modhandler, Layer( priority = 7, device_selector_matrix = self.elements.matrix.submatrix[:, :1], )) #lock_button = self.elements.master_select_button, #)) self.modhandler.alt_layer = AddLayerMode( self.modhandler, Layer( priority = 7, )) #key_buttons = self.elements.select_buttons)) #key_buttons = self.elements.track_state_buttons)) self._device_provider.restart_mod() def _init_matrix_modes(self): super(AumPush2, self)._init_matrix_modes() #self._setup_monoinstrument() self._setup_mod() self._note_modes.add_mode('mod', [self.modhandler]) self._note_modes.add_mode('looperhack', [self._audio_loop]) def _create_device_component(self): return self.device_component_class(script = self, device_decorator_factory=self._device_decorator_factory, device_bank_registry=self._device_bank_registry, banking_info=self._banking_info, name='DeviceComponent', is_enabled=True, is_root=True) """ def _create_main_mixer_modes(self): self._mixer_control = MixerControlComponent(name='Global_Mix_Component', view_model=self._model.mixerView, tracks_provider=self._session_ring, is_enabled=False, layer=Layer(controls='fine_grain_param_controls', volume_button='track_state_buttons_raw[0]', panning_button='track_state_buttons_raw[1]', send_slot_one_button='track_state_buttons_raw[2]', send_slot_two_button='track_state_buttons_raw[3]', send_slot_three_button='track_state_buttons_raw[4]', send_slot_four_button='track_state_buttons_raw[5]', send_slot_five_button='track_state_buttons_raw[6]', cycle_sends_button='track_state_buttons_raw[7]')) self._model.mixerView.realtimeMeterData = self._mixer_control.real_time_meter_handlers track_mixer_control = TrollMixerControlComponent(script = self, name='Track_Mix_Component', is_enabled=False, tracks_provider=self._session_ring, layer=Layer(controls='fine_grain_param_controls', scroll_left_button='track_state_buttons_raw[6]', scroll_right_button='track_state_buttons_raw[7]')) self._track_mixer_control = track_mixer_control self._model.mixerView.trackControlView = track_mixer_control self._mix_modes = ModesComponent(is_enabled=False) self._mix_modes.add_mode('global', self._mixer_control) self._mix_modes.add_mode('track', track_mixer_control) self._mix_modes.selected_mode = 'global' self._model.mixerSelectView = self._mixer_control self._model.trackMixerSelectView = track_mixer_control class MixModeBehaviour(ReenterBehaviour): def press_immediate(behaviour_self, component, mode): if self._is_on_master() and self._mix_modes.selected_mode != 'track': self._mix_modes.selected_mode = 'track' super(MixModeBehaviour, behaviour_self).press_immediate(component, mode) def on_reenter(behaviour_self): if not self._is_on_master(): self._mix_modes.cycle_mode() self._main_modes.add_mode('mix', [self._mix_modes, tuple([self._check_track_mixer_entry, self._check_track_mixer_exit]), SetAttributeMode(obj=self._note_editor_settings_component, attribute='parameter_provider', value=self._track_parameter_provider)], behaviour=MixModeBehaviour()) """ def _create_main_mixer_modes(self): self._mixer_control = MixerControlComponent(name='Global_Mix_Component', view_model=self._model.mixerView, tracks_provider=self._session_ring, is_enabled=False, layer=Layer(controls='fine_grain_param_controls', volume_button='track_state_buttons_raw[0]', panning_button='track_state_buttons_raw[1]', send_slot_one_button='track_state_buttons_raw[2]', send_slot_two_button='track_state_buttons_raw[3]', send_slot_three_button='track_state_buttons_raw[4]', send_slot_four_button='track_state_buttons_raw[5]', send_slot_five_button='track_state_buttons_raw[6]', cycle_sends_button='track_state_buttons_raw[7]')) self._model.mixerView.realtimeMeterData = self._mixer_control.real_time_meter_handlers track_mixer_control = TrollMixerControlComponent(script = self, name='Track_Mix_Component', is_enabled=False, tracks_provider=self._session_ring, layer=Layer(controls='fine_grain_param_controls', scroll_left_button='track_state_buttons_raw[6]', scroll_right_button='track_state_buttons_raw[7]')) self._track_mixer_control = track_mixer_control #track_mixer_control = TrackMixerControlComponent(name='Track_Mix_Component', is_enabled=False, tracks_provider=self._session_ring, layer=Layer(controls='fine_grain_param_controls', scroll_left_button='track_state_buttons_raw[6]', scroll_right_button='track_state_buttons_raw[7]')) routing_control = RoutingControlComponent(is_enabled=False, layer=Layer(monitor_state_encoder='parameter_controls_raw[0]')) track_mix_or_routing_chooser = TrackOrRoutingControlChooserComponent(tracks_provider=self._session_ring, track_mixer_component=track_mixer_control, routing_control_component=routing_control, is_enabled=False, layer=Layer(mix_button='track_state_buttons_raw[0]', routing_button='track_state_buttons_raw[1]')) self._model.mixerView.trackControlView = track_mix_or_routing_chooser self._mix_modes = ModesComponent(is_enabled=False) self._mix_modes.add_mode('global', self._mixer_control) self._mix_modes.add_mode('track', track_mix_or_routing_chooser) self._mix_modes.selected_mode = 'global' self._model.mixerSelectView = self._mixer_control self._model.trackMixerSelectView = track_mixer_control class MixModeBehaviour(ReenterBehaviour): def press_immediate(behaviour_self, component, mode): if self._is_on_master() and self._mix_modes.selected_mode != 'track': self._mix_modes.selected_mode = 'track' super(MixModeBehaviour, behaviour_self).press_immediate(component, mode) def on_reenter(behaviour_self): if not self._is_on_master(): self._mix_modes.cycle_mode() self._main_modes.add_mode('mix', [self._mix_modes, SetAttributeMode(obj=self._note_editor_settings_component, attribute='parameter_provider', value=self._track_parameter_provider)], behaviour=MixModeBehaviour()) def _with_select(self, button): return ComboElement(button, [self.elements.select_button]) def _hack_stuff(self): self._crossfader_strip = TouchStripControllerComponent() self._crossfader_strip.layer = Layer(touch_strip = self.elements.touch_strip_control) self._crossfader_strip.set_enabled(False) self._device_selector = DeviceSelectorComponent(self) self._device_selector._off_value = 64 self._device_selector.layer = Layer(priority = 9, matrix = self.elements.matrix.submatrix[:, :4]) self._device_selector.set_enabled(False) self._send_reset = AumPushResetSendsComponent(self) self._send_reset.layer = Layer(priority = 9, send_a_button = self._with_select(self.elements.track_state_buttons_raw[4]), send_b_button = self._with_select(self.elements.track_state_buttons_raw[5]), send_c_button = self._with_select(self.elements.track_state_buttons_raw[6]), send_d_button = self._with_select(self.elements.track_state_buttons_raw[7])) self._send_reset.set_enabled(False) static_modes = CompoundMode(tuple([self._grab_crossfader, self._release_crossfader]), self._crossfader_strip, self._device_selector, self._send_reset) self._troll_modes = ModesComponent() self._troll_modes.add_mode('disabled', [], cycle_mode_button_color = 'DefaultButton.Off') self._troll_modes.add_mode('enabled', [static_modes, tuple([self._grab_track_mode, self._release_track_mode, ])], cycle_mode_button_color = 'DefaultButton.Alert') self._troll_modes.layer = Layer(priority = 6, cycle_mode_button = 'master_select_button') self._troll_modes.selected_mode = 'disabled' #self.schedule_message(5, self._remove_pedal) @listens('selected_mode') def _on_main_mode_changed(self, mode): debug('main_mode selected mode is now:', mode) #if self._troll_modes.selected_mode is 'enabled' and not mode is 'device': # self._troll_modes.selected_mode = 'disabled' def _init_main_modes(self): super(AumPush2, self)._init_main_modes() self._on_main_mode_changed.subject = self._main_modes def _grab_track_mode(self): debug('grab device mode') """self._main_modes.pop_unselected_modes() if not self._main_modes.selected_mode is 'device': self._main_modes.push_mode('device') self._device_component._update_parameters()""" self._track_mixer_control._mode_on_troll_entrance = self._mix_modes.selected_mode self._track_mixer_control._main_offset = self._track_mixer_control.scroll_offset self._track_mixer_control._scroll_offset = self._track_mixer_control._troll_offset if self._main_modes.selected_mode is 'mix': self._check_track_mixer_entry() def _release_track_mode(self): debug('release device mode') """if self._troll_modes.selected_mode is 'enabled': self._troll_modes.selected_mode = 'disabled' if len(self._main_modes.active_modes) > 1: self._main_modes.pop_mode('device') self._device_component._update_parameters()""" self._track_mixer_control._troll_offset = self._track_mixer_control.scroll_offset self._track_mixer_control._scroll_offset = self._track_mixer_control._main_offset if self._main_modes.selected_mode is 'mix': self._mix_modes.selected_mode = self._track_mixer_control._mode_on_troll_entrance if self._track_mixer_control._mode_on_troll_entrance is 'track': self._track_mixer_control.notify_scroll_offset() self._track_mixer_control.update() def _check_track_mixer_entry(self): debug('_check_track_mixer_entry') if self._troll_modes.selected_mode is 'enabled': if not self._mix_modes.selected_mode is 'track': self._mix_modes.push_mode('track') self._track_mixer_control.notify_scroll_offset() self._track_mixer_control.update() def _check_track_mixer_exit(self): debug('_check_track_mixer_exit') def _disable_troll(self): #self._troll_modes.selected_mode = 'disabled' debug('disable troll') def _init_mute_solo_stop(self): super(AumPush2, self)._init_mute_solo_stop() self._master_selector.layer = Layer(toggle_button=self._with_select('master_select_button')) def _grab_crossfader(self): self._crossfader_strip.set_parameter(self.song.master_track.mixer_device.crossfader) def _release_crossfader(self): self._crossfader_strip.set_parameter(None) def _remove_pedal(self): #self.real_foot_pedal_button = self.elements.foot_pedal_button self.elements.foot_pedal_button = DoublePressElement(create_button(127, name = 'Foot_Pedal', skin = self._skin, is_rgb=True)) for control in self.controls: if isinstance(control, ConfigurableButtonElement) and control._original_identifier is 69: self.log_message('found control: ' + str(control)) self.controls.remove(control) break self.request_rebuild_midi_map() """ @listens('device') def _on_device_changed(self): debug('_on_device_changed') #self.schedule_message(1, self._select_note_mode) #self._select_note_mode() @listens('selected_track') def _on_selected_track_changed(self): #if self._troll_modes.selected_mode is 'enabled': # self._device_component._update_parameters() pass """ def _select_note_mode(self, mod_device = None): track = self.song.view.selected_track drum_device, sliced_simpler = self._percussion_instruments_for_track(track) self._drum_component.set_drum_group_device(drum_device) self._slicing_component.set_simpler(sliced_simpler) debug('select_note_mode: ', self.modhandler.is_locked(), self.modhandler.active_mod(), len(track.devices)) if not (self._note_modes.selected_mode is 'mod' and self.modhandler.is_locked()): if track == None or track.is_foldable or track in self.song.return_tracks or track == self.song.master_track or track.is_frozen: self._note_modes.selected_mode = 'disabled' elif self.modhandler.active_mod(): self._note_modes.selected_mode = 'mod' elif track and track.has_audio_input: self._note_modes.selected_mode = 'looperhack' elif drum_device: self._note_modes.selected_mode = 'drums' elif sliced_simpler: self._note_modes.selected_mode = 'slicing' else: self._note_modes.selected_mode = 'instrument' self.reset_controlled_track() def disconnect(self): self.log_message('<<<<<<<<<<<<<<<<<<<<<<<< AumPush2 ' + str(self._monomod_version) + ' log closed >>>>>>>>>>>>>>>>>>>>>>>>') super(AumPush2, self).disconnect() def _can_auto_arm_track(self, track): routing = track.current_input_routing return routing == 'Ext: All Ins' or routing == 'All Ins' or routing.startswith('AumPush2')