def __init__(self, selection=None, browser_component=None, browser_mode=None, browser_hotswap_mode=None, insert_left=False, *a, **k): super(CreateDeviceComponent, self).__init__(*a, **k) self._selection = selection self._add_effect_mode = BrowserAddEffectMode( selection=selection, browser=self.application.browser, application_view=self.application.view, insert_left=insert_left) self._create_device_modes = ModesComponent(parent=self) self._create_device_modes.add_mode(u'create', [ SetAttributeMode(browser_component, u'do_load_item', self._do_browser_load_item), self._add_effect_mode, browser_mode, browser_component.reset_load_memory ]) self._create_device_modes.add_mode( u'hotswap', [browser_hotswap_mode, browser_mode]) self._go_to_hotswap_task = self._tasks.add( task.sequence(task.delay(1), task.run(self._go_to_hotswap))) self._go_to_hotswap_task.kill()
def __init__(self, *a, **k): super(MidiClipControllerComponent, self).__init__(*a, **k) self._configure_vis_task = self._tasks.add( task.sequence(task.delay(1), task.run(self._configure_visualisation))).kill() self._clip = None self._matrix_mode_watcher = None self._most_recent_base_note = DEFAULT_START_NOTE self._most_recent_max_note = DEFAULT_START_NOTE self._loose_follow_base_note = DEFAULT_START_NOTE self._most_recent_editable_pitches = (DEFAULT_START_NOTE, DEFAULT_START_NOTE) self._most_recent_row_start_times = [] self._most_recent_step_length = 1.0 self._most_recent_page_index = 0 self._most_recent_page_length = 1.0 self._most_recent_editing_note_regions = [] self._visualisation_real_time_data = RealTimeDataComponent( channel_type='visualisation', parent=self) self.__on_visualisation_channel_changed.subject = self._visualisation_real_time_data self.__on_visualisation_attached.subject = self._visualisation_real_time_data self._instruments = [] self._sequencers = [] self._mute_during_track_change_components = [] self._note_settings_component = None self._note_editor_settings_component = None self._real_time_data_attached = False self._drum_rack_finder = None self._drum_pad_color_notifier = self.register_disconnectable( DrumPadColorNotifier()) self.__on_note_colors_changed.subject = self._drum_pad_color_notifier return
def __init__(self, scrollable_list = None, data_sources = tuple(), *a, **k): super(ListComponent, self).__init__(*a, **k) self._data_sources = data_sources self._activation_task = task.Task() self._action_on_scroll_task = task.Task() self._scrollable_list = None self._scroller = self.register_component(ScrollComponent()) self._pager = self.register_component(ScrollComponent()) self.last_action_item = lambda : self._last_action_item self.item_formatter = DefaultItemFormatter() for c in (self._scroller, self._pager): for button in (c.scroll_up_button, c.scroll_down_button): button.color = 'List.ScrollerOn' button.pressed_color = None button.disabled_color = 'List.ScrollerOff' if scrollable_list == None: self.scrollable_list = ActionList(num_visible_items=len(data_sources)) else: self.scrollable_list = scrollable_list self._scrollable_list.num_visible_items = len(data_sources) self._delay_activation = BooleanContext() self._selected_index_float = 0.0 self._in_encoder_selection = BooleanContext(False) self._execute_action_task = self._tasks.add(task.sequence(task.delay(1), task.run(self._execute_action))) self._execute_action_task.kill()
def __init__(self, scrollable_list=None, data_sources=tuple(), *a, **k): super(ListComponent, self).__init__(*a, **k) self._data_sources = data_sources self._activation_task = task.Task() self._action_on_scroll_task = task.Task() self._scrollable_list = None self._scroller = ScrollComponent(parent=self) self._pager = ScrollComponent(parent=self) self.last_action_item = lambda: self._last_action_item self.item_formatter = DefaultItemFormatter() for c in (self._scroller, self._pager): for button in (c.scroll_up_button, c.scroll_down_button): button.color = b'List.ScrollerOn' button.pressed_color = None button.disabled_color = b'List.ScrollerOff' if scrollable_list == None: self.scrollable_list = ActionList( num_visible_items=len(data_sources)) else: self.scrollable_list = scrollable_list self._scrollable_list.num_visible_items = len(data_sources) self._delay_activation = BooleanContext() self._selected_index_float = 0.0 self._in_encoder_selection = BooleanContext(False) self._execute_action_task = self._tasks.add( task.sequence(task.delay(1), task.run(self._execute_action))) self._execute_action_task.kill() return
def __init__( self, selection=None, browser_component=None, browser_mode=None, browser_hotswap_mode=None, insert_left=False, *a, **k ): super(CreateDeviceComponent, self).__init__(*a, **k) self._selection = selection self._add_effect_mode = BrowserAddEffectMode( selection=selection, browser=self.application().browser, application_view=self.application().view, insert_left=insert_left, ) self._create_device_modes = self.register_component(ModesComponent()) self._create_device_modes.add_mode( "create", [ SetAttributeMode(browser_component, "do_load_item", self._do_browser_load_item), self._add_effect_mode, browser_mode, browser_component.reset_load_memory, ], ) self._create_device_modes.add_mode("hotswap", [browser_hotswap_mode, browser_mode]) self._go_to_hotswap_task = self._tasks.add(task.sequence(task.delay(1), task.run(self._go_to_hotswap))) self._go_to_hotswap_task.kill()
def _set_loop(self): song = self.song slot = song.view.highlighted_clip_slot if slot is None: return clip = slot.clip loop_set = False if self._length_press_state is not None: press_slot, press_position = self._length_press_state if press_slot == slot and slot.is_recording and not clip.is_overdubbing: length, _ = self._fixed_length_setting.get_selected_length( song) one_bar = 4.0 * song.signature_numerator / song.signature_denominator loop_end = int(press_position / one_bar) * one_bar loop_start = loop_end - length if loop_start >= 0.0: clip.loop_end = loop_end clip.end_marker = loop_end clip.loop_start = loop_start clip.start_marker = loop_start self._tasks.add( task.sequence( task.delay(0), task.run( partial( slot.fire, force_legato=True, launch_quantization=Quantization.q_no_q)))) self.song.overdub = False loop_set = True self._length_press_state = None return loop_set
def _on_scroll(self): if self._trigger_action_on_scrolling: trigger_selected = partial(self._trigger_action, self.selected_item) self._action_on_scroll_task.kill() self._action_on_scroll_task = self._tasks.add( task.sequence(task.wait(defaults.MOMENTARY_DELAY), task.delay(1), task.run(trigger_selected)))
def _do_apply_mode(self, mode): self.notify_before_mode_sent(mode) if self.defer_sysex_sending: self._tasks.add( task.sequence(task.delay(1), task.run(lambda: self._send_mode_change(mode)))) else: self._send_mode_change(mode)
def _do_conversion(self, action_index): self._update_possible_conversions() if action_index < len(self._available_conversions): action = self._available_conversions[action_index] if action.needs_deferred_invocation: self._tasks.add(task.sequence(task.delay(1), task.run(lambda : self._do_conversion_deferred(action)))) return False self._invoke_conversion(action) return True
def _do_conversion(self, action_index): self._update_possible_conversions() if action_index < len(self._category.actions): action = self._category.actions[action_index] if action.needs_deferred_invocation: self._tasks.add(task.sequence(task.delay(1), task.run(lambda : self._do_conversion_deferred(action)))) return False self._invoke_conversion(action) return True
def __init__(self, playing_clip_above_layer = None, playing_clip_below_layer = None, *a, **k): super(SelectPlayingClipComponent, self).__init__(*a, **k) self._update_mode_task = self._tasks.add(task.sequence(task.delay(1), task.run(self._update_mode))) self._update_mode_task.kill() self.add_mode('default', None) self.add_mode('above', [AddLayerMode(self, playing_clip_above_layer), partial(self._show_notification, MessageBoxText.PLAYING_CLIP_ABOVE_SELECTED_CLIP)]) self.add_mode('below', [AddLayerMode(self, playing_clip_below_layer), partial(self._show_notification, MessageBoxText.PLAYING_CLIP_BELOW_SELECTED_CLIP)]) self.selected_mode = 'default' self._on_detail_clip_changed.subject = self.song.view self._on_playing_slot_index_changed.subject = self.song.view.selected_track self._notification_reference = partial(nop, None)
def __init__(self, selection = None, browser_mode = None, browser_component = None, browser_hotswap_mode = None, *a, **k): super(CreateInstrumentTrackComponent, self).__init__(*a, **k) self._selection = selection self._with_browser_modes = self.register_component(ModesComponent()) self._with_browser_modes.add_mode('create', [self._prepare_browser, SetAttributeMode(self.application.browser, 'filter_type', Live.Browser.FilterType.instrument_hotswap), SetAttributeMode(browser_component, 'do_load_item', self._do_browser_load_item), browser_mode, browser_component.reset_load_memory]) self._with_browser_modes.add_mode('hotswap', [browser_hotswap_mode, browser_mode]) self._go_to_hotswap_task = self._tasks.add(task.sequence(task.delay(1), task.run(self._go_to_hotswap))) self._go_to_hotswap_task.kill()
def _set_loop(self): song = self.song slot = song.view.highlighted_clip_slot if slot is None: return clip = slot.clip loop_set = False if self._length_press_state is not None: press_slot, press_position = self._length_press_state if press_slot == slot and slot.is_recording and not clip.is_overdubbing: length, _ = self._fixed_length_setting.get_selected_length( song) one_bar = 4.0 * song.signature_numerator / song.signature_denominator loop_start = int(press_position / length) * length loop_end = loop_start + length clip.loop_end = loop_end clip.end_marker = loop_end clip.loop_start = loop_start clip.start_marker = loop_start progress = (press_position - loop_start) / (loop_end - loop_start) if progress < 0.5 and loop_start - length >= 0: launch_quantization = Quantization.q_no_q self.song.overdub = False else: duration_needed_to_finish_recording_bar = ( loop_end - press_position) / one_bar launch_quantization = Quantization.q_no_q if duration_needed_to_finish_recording_bar < 0.5: launch_quantization = Quantization.q_half else: if duration_needed_to_finish_recording_bar < 1: launch_quantization = Quantization.q_bar else: if duration_needed_to_finish_recording_bar < 2: launch_quantization = Quantization.q_2_bars else: if duration_needed_to_finish_recording_bar < 4: launch_quantization = Quantization.q_4_bars else: if duration_needed_to_finish_recording_bar < 8: launch_quantization = Quantization.q_8_bars self._tasks.add( task.sequence( task.delay(0), task.run( partial(slot.fire, force_legato=True, launch_quantization=launch_quantization)))) loop_set = True self._length_press_state = None return loop_set
def __init__(self, note_editor_component = None, *a, **k): assert note_editor_component is not None super(SelectedNotesInstrumentComponent, self).__init__(*a, **k) self.selected_notes_provider = self.register_disconnectable(SelectedNotesProvider()) with self._updating_selected_notes_model(): self.selected_notes_provider.selected_notes = self.song.view.selected_track.get_data(u'push-instrument-selected-notes', [DEFAULT_START_NOTE]) self._note_editor_component = note_editor_component self.__on_pressed_step_changed.subject = self._note_editor_component self._pitches = [] self._chord_task = self._tasks.add(task.sequence(task.delay(1), task.run(self._commit_pressed_notes))).kill() self._show_notes_in_selected_step_task = self._tasks.add(task.sequence(task.wait(defaults.MOMENTARY_DELAY), task.run(self._show_notes_in_selected_step))).kill() self.__on_position_changed.subject = self self.__on_selected_track_changed.subject = self.song.view
def _set_loop(self): song = self.song slot = song.view.highlighted_clip_slot if slot is None: return clip = slot.clip loop_set = False if self._length_press_state is not None: press_slot, press_position = self._length_press_state if press_slot == slot and slot.is_recording and not clip.is_overdubbing: length, _ = self._fixed_length_setting.get_selected_length(song) one_bar = 4.0 * song.signature_numerator / song.signature_denominator loop_end = int(press_position / one_bar) * one_bar loop_start = loop_end - length if loop_start >= 0.0: clip.loop_end = loop_end clip.end_marker = loop_end clip.loop_start = loop_start clip.start_marker = loop_start self._tasks.add(task.sequence(task.delay(0), task.run(partial(slot.fire, force_legato=True, launch_quantization=Quantization.q_no_q)))) self.song.overdub = False loop_set = True self._length_press_state = None return loop_set
def __on_slicing_style_changed(self): def set_pad_slicing(): self._simpler.pad_slicing = self._simpler.sample.slicing_style == Live.Sample.SlicingStyle.manual self._tasks.add(task.sequence(task.delay(1), task.run(set_pad_slicing)))
def _do_apply_mode(self, mode): self.notify_before_mode_sent(mode) if self.defer_sysex_sending: self._tasks.add(task.sequence(task.delay(1), task.run(lambda : self._send_mode_change(mode)))) else: self._send_mode_change(mode)
def _on_scroll(self): if self._trigger_action_on_scrolling: trigger_selected = partial(self._trigger_action, self.selected_item) self._action_on_scroll_task.kill() self._action_on_scroll_task = self._tasks.add(task.sequence(task.wait(defaults.MOMENTARY_DELAY), task.delay(1), task.run(trigger_selected)))
def _toggle_pitch_in_note_editor(self, pitch): self._note_editor_component.toggle_pitch_for_all_modified_steps(pitch) self._tasks.add( task.sequence(task.delay(1), task.run(self._show_notes_in_selected_step)))