class StepSeqComponent(StepSeqComponent, APCMessenger):
    """ Step sequencer for APC40 MkII """
    def __init__(self, *a, **k):
        super(StepSeqComponent,
              self).__init__(clip_creator=ClipCreator(),
                             note_editor_settings=self._note_editor_setting(),
                             is_enabled=False,
                             skin=make_default_skin(),
                             *a,
                             **k)
        self._drum_group.__class__ = APCDrumGroupComponent
        self._note_editor.__class__ = APCNoteEditorComponent
        self._setup_drum_group_finder()
        self._configure_playhead()

    def _note_editor_setting(self):
        return NoteEditorSettingsComponent(
            self.control_surface._grid_resolution,
            Layer(initial_encoders=self.control_surface._mixer_encoders),
            Layer(encoders=self.control_surface._mixer_encoders))

    def set_velocity_slider(self, button_slider):
        self._note_editor.set_velocity_slider(button_slider)

    def _configure_playhead(self):
        self._playhead_component._notes = tuple(
            chain(*starmap(range, ((28, 32), (20, 24), (12, 16), (4, 8)))))
        self._playhead_component._triplet_notes = tuple(
            chain(*starmap(range, ((28, 31), (20, 23), (12, 15), (4, 7)))))

    def _setup_drum_group_finder(self):
        self._drum_group_finder = DrumGroupFinderComponent()
        self._on_drum_group_changed.subject = self._drum_group_finder
        self._drum_group_finder.update()

    @subject_slot('drum_group')
    def _on_drum_group_changed(self):
        self.set_drum_group_device(self._drum_group_finder.drum_group)

    def on_selected_track_changed(self):
        self.set_drum_group_device(self._drum_group_finder.drum_group)

    def set_button_matrix(self, matrix):
        """ This method, as with most set_* methods, is called every time
    This component is enabled """
        self._note_editor_matrix = matrix
        self._update_note_editor_matrix()
        if matrix:
            for button, _ in ifilter(first, matrix.iterbuttons()):
                button.set_channel(PAD_FEEDBACK_CHANNEL)

    def set_loop_selector_matrix(self, matrix):
        self._loop_selector.set_loop_selector_matrix(matrix)
        if matrix:
            for button, _ in ifilter(first, matrix.iterbuttons()):
                button.set_channel(PAD_FEEDBACK_CHANNEL)
class BaseSequencerComponent(StepSeqComponent, BaseMessenger):
  """ Custom step-sequencer for Drum Pads. Keys are handled via Melodic Step Sequencer. """

  def __init__(self, *a, **k):
    super(BaseSequencerComponent, self).__init__(clip_creator = ClipCreator(),
        grid_resolution = self.control_surface.grid,
        is_enabled = False,
        skin = pad_skin(),
        *a, **k)
    self._setup_drum_group_finder()
    self.on_selected_track_changed()
    self.patch_note_editor()
    self.configure_playhead()
    self.update()

  # Set the playhead to use our notes
  # Feedback channel must also be set on ControlSurface
  # Can't be zero, so we're just using 14
  # TODO refactor to pull from Map.py
  def configure_playhead(self):
    self._playhead_component._notes=tuple(chain(*starmap(range, (
         (64, 68),
         (56, 60),
         (48, 52),
         (40, 44)))))
    self._playhead_component._triplet_notes=tuple(chain(*starmap(range, (
         (64, 67),
         (56, 59),
         (48, 51),
         (40, 43)))))

  def set_button_matrix(self, matrix):
    """ This method, as with most set_* methods, is called every time
    This component is enabled """
    self._note_editor_matrix = matrix
    self._update_note_editor_matrix()
    if matrix:
      for button, _ in ifilter(first, matrix.iterbuttons()):
        button.set_channel(PAD_FEEDBACK_CHANNEL)

  def _setup_drum_group_finder(self):
    self._drum_group_finder = DrumGroupFinderComponent()
    self._on_drum_group_changed.subject = self._drum_group_finder
    self._drum_group_finder.update()

  @subject_slot('drum_group')
  def _on_drum_group_changed(self):
    self.set_drum_group_device(self._drum_group_finder.drum_group)

  def on_selected_track_changed(self):
    self.set_drum_group_device(self._drum_group_finder.drum_group)
    self.update()

  def patch_note_editor(self):
    self._note_editor.__class__ = BaseNoteEditorComponent
Example #3
0
class BaseSequencerComponent(StepSeqComponent, BaseMessenger):
    """ Custom step-sequencer for Drum Pads. Keys are handled via Melodic Step Sequencer. """
    def __init__(self, *a, **k):
        super(BaseSequencerComponent,
              self).__init__(clip_creator=ClipCreator(),
                             grid_resolution=self.control_surface.grid,
                             is_enabled=False,
                             skin=pad_skin(),
                             *a,
                             **k)
        self._setup_drum_group_finder()
        self.on_selected_track_changed()
        self.patch_note_editor()
        self.configure_playhead()
        self.update()

    # Set the playhead to use our notes
    # Feedback channel must also be set on ControlSurface
    # Can't be zero, so we're just using 14
    # TODO refactor to pull from Map.py
    def configure_playhead(self):
        self._playhead_component._notes = tuple(
            chain(*starmap(range, ((64, 68), (56, 60), (48, 52), (40, 44)))))
        self._playhead_component._triplet_notes = tuple(
            chain(*starmap(range, ((64, 67), (56, 59), (48, 51), (40, 43)))))

    def set_button_matrix(self, matrix):
        """ This method, as with most set_* methods, is called every time
    This component is enabled """
        self._note_editor_matrix = matrix
        self._update_note_editor_matrix()
        if matrix:
            for button, _ in ifilter(first, matrix.iterbuttons()):
                button.set_channel(PAD_FEEDBACK_CHANNEL)

    def _setup_drum_group_finder(self):
        self._drum_group_finder = DrumGroupFinderComponent()
        self._on_drum_group_changed.subject = self._drum_group_finder
        self._drum_group_finder.update()

    @subject_slot('drum_group')
    def _on_drum_group_changed(self):
        self.set_drum_group_device(self._drum_group_finder.drum_group)

    def on_selected_track_changed(self):
        self.set_drum_group_device(self._drum_group_finder.drum_group)
        self.update()

    def patch_note_editor(self):
        self._note_editor.__class__ = BaseNoteEditorComponent
 def _setup_drum_group_finder(self):
   self._drum_group_finder = DrumGroupFinderComponent()
   self._on_drum_group_changed.subject = self._drum_group_finder
   self._drum_group_finder.update()
 def _setup_drum_group_finder(self):
     self._drum_group_finder = DrumGroupFinderComponent()
     self._on_drum_group_changed.subject = self._drum_group_finder
     self._drum_group_finder.update()
class StepSeqComponent(StepSeqComponent, APCMessenger):
  """ Step sequencer for APC40 MkII """

  def __init__(self, *a, **k):
    super(StepSeqComponent, self).__init__(
        clip_creator = ClipCreator(),
        note_editor_settings = self._note_editor_setting(),
        is_enabled = False,
        skin = make_default_skin(),
        *a, **k)
    self._drum_group.__class__ = APCDrumGroupComponent
    self._note_editor.__class__ = APCNoteEditorComponent
    self._setup_drum_group_finder()
    self._configure_playhead()

  def _note_editor_setting(self):
    return NoteEditorSettingsComponent(self.control_surface._grid_resolution,
        Layer(initial_encoders = self.control_surface._mixer_encoders),
        Layer(encoders = self.control_surface._mixer_encoders))

  def set_velocity_slider(self, button_slider):
    self._note_editor.set_velocity_slider(button_slider)

  def _configure_playhead(self):
    self._playhead_component._notes=tuple(chain(*starmap(range, (
         (28, 32),
         (20, 24),
         (12, 16),
         (4, 8)))))
    self._playhead_component._triplet_notes=tuple(chain(*starmap(range, (
         (28, 31),
         (20, 23),
         (12, 15),
         (4, 7)))))

  def _setup_drum_group_finder(self):
    self._drum_group_finder = DrumGroupFinderComponent()
    self._on_drum_group_changed.subject = self._drum_group_finder
    self._drum_group_finder.update()

  @subject_slot('drum_group')
  def _on_drum_group_changed(self):
    self.set_drum_group_device(self._drum_group_finder.drum_group)

  def on_selected_track_changed(self):
    self.set_drum_group_device(self._drum_group_finder.drum_group)

  def set_button_matrix(self, matrix):
    """ This method, as with most set_* methods, is called every time
    This component is enabled """
    self._note_editor_matrix = matrix
    self._update_note_editor_matrix()
    if matrix:
      for button, _ in ifilter(first, matrix.iterbuttons()):
        button.set_channel(PAD_FEEDBACK_CHANNEL)

  def set_loop_selector_matrix(self, matrix):
    self._loop_selector.set_loop_selector_matrix(matrix)
    if matrix:
      for button, _ in ifilter(first, matrix.iterbuttons()):
        button.set_channel(PAD_FEEDBACK_CHANNEL)