Exemplo n.º 1
0
 def _init_mixer(self):
   self._master_fader = BaseFaderElement(BASE_MASTER)
   self.mixer = BaseMixerComponent(len(BASE_TOUCHSTRIPS), auto_name = True, is_enabled = True, invert_mute_feedback = True)
   self.mixer.master_strip().layer = Layer(volume_control=self._master_fader)
Exemplo n.º 2
0
class BaseControl(OptimizedControlSurface, LCDDisplay):
  __module__ = __name__
  __doc__ = " Better Base controller script by Will Marshall"
  def __init__(self, c_instance):
    super(BaseControl, self).__init__(c_instance)
    self.log_message('BaseControl script open')
    self._utility_buttons = []
    with self.component_guard():
      self._create_shared_controls()
      self._init_mixer()
      self._init_selects()
      self._init_faders()
      self._init_utility()
      self._init_auto_arm()
      self._init_ppm()
      self._init_modes()
      self.set_pad_translations(PAD_TRANSLATIONS)
      self.set_feedback_channels(FEEDBACK_CHANNELS)
      self._device_selection_follows_track_selection = FOLLOW 
      self._suggested_input_port = 'Controls'
      self._suggested_output_port = 'Controls'
      self._on_session_record_changed.subject = self.song()
      self._on_session_record_changed()
      self._send_midi(FADER_FEEDBACK_ON)

  # CREATE stuff 
  def _create_shared_controls(self):
      self._create_modifier_buttons()
      self._create_pads()
      self._create_matrix()
      self._create_grid()

  def _init_mixer(self):
    self._master_fader = BaseFaderElement(BASE_MASTER)
    self.mixer = BaseMixerComponent(len(BASE_TOUCHSTRIPS), auto_name = True, is_enabled = True, invert_mute_feedback = True)
    self.mixer.master_strip().layer = Layer(volume_control=self._master_fader)

  def _init_selects(self):
    selects = [BaseTouchpadElement(pad) for pad in BASE_TOUCHPADS]
    selects_with_session = [self.with_session(pad) for pad in selects]
    self.selects = wrap_matrix(selects) 
    self.selects_with_session = wrap_matrix(selects_with_session)

  def _create_grid(self):
    self.grid = self.register_disconnectable(GridResolution())

  def reset_controlled_track(self):
    self.set_controlled_track(self.song().view.selected_track)

  def update(self):
    super(BaseControl, self).update()
    self.reset_controlled_track()
    self.set_feedback_channels(FEEDBACK_CHANNELS)

  @property
  def utility_buttons(self):
    return self._utility_buttons

  def _create_pads(self):
    self._pads = [ [BasePadElement(pad) for pad in row] for row in BASE_PADS ]
    self._shifted_pads = [ [self.with_sequencer((pad)) for pad in row] for row in self._pads ]

  def _create_matrix(self):
    self.matrix = ButtonMatrixElement(name='Button_Matrix', rows = self._pads)
    self.shifted_matrix = ButtonMatrixElement(name='Button_Matrix', rows = self._shifted_pads)

  def _create_modifier_buttons(self):
    self.utility_button_lights = []
    for index in range(8):
      self.utility_buttons.append(
        create_modifier_button(BASE_BUTTONS[index], 
          "BUTTON_" + str(index + 1),
          skin = button_skin(index)))
      self.utility_button_lights.append(
        create_button(BASE_BUTTON_LIGHTS[index], 
          "BUTTON_LIGHT_" + str(index + 1),
          skin = white_button_skin()))
    self._session_button = self.utility_buttons[0]
    self._note_button = self.utility_buttons[1] 
    self._device_button = self.utility_buttons[2] 
    self._sequence_button = self.utility_buttons[3] 

  def _init_faders(self):
    self.fader_elements = [BaseFaderElement(fader) for fader in BASE_TOUCHSTRIPS]
    self._faders = ButtonMatrixElement(rows = [self.fader_elements])

  def _init_modes(self):
    self._init_fader_modes()
    self._init_pad_modes()

  def _init_fader_modes(self):
    self._fader_modes = FaderModes()
    self._fader_modes.layer = Layer(
        session_button = self._session_button,
        note_button = self._note_button,
        track_button = self._sequence_button,
        sequencer_button = self._device_button)

  def _init_pad_modes(self):
    self._pad_modes = PadModes()
    self._pad_modes.layer = Layer(session_button = self._session_button, 
        note_button = self._note_button,
        track_button = self._device_button,
        sequencer_button = self._sequence_button)

  def _init_utility(self):
    self._utility_modes = UtilityModes(self)
    self._utility_modes.layer = Layer(session_button = self._session_button, 
        note_button = self._note_button,
        track_button = self._device_button,
        sequencer_button = self._sequence_button)

  def _init_auto_arm(self):
    self._auto_arm = AutoArmComponent(is_enabled = True)

  def _init_ppm(self):
    self._ppm = PPMeter(self, self.song().master_track, self._master_fader)

  # Events and callbacks
  def _on_selected_track_changed(self):
    super(BaseControl, self)._on_selected_track_changed()
    self.reset_controlled_track()
    if self._auto_arm.needs_restore_auto_arm:
      self.schedule_message(1, self._auto_arm.restore_auto_arm)

  @subject_slot('session_record')
  def _on_session_record_changed(self):
    status = self.song().session_record
    feedback_color = int(pad_skin()['Instrument.FeedbackRecord'] if status else pad_skin()['Instrument.Feedback'])
    self._c_instance.set_feedback_velocity(feedback_color)

  def with_note(self, button):
    return ComboElement(button, modifiers=[self._note_button])

  def with_session(self, button):
    return ComboElement(button, modifiers=[self._session_button])

  def with_sequencer(self, button):
    return ComboElement(button, modifiers=[self._sequence_button])

  @contextmanager
  def component_guard(self):
    """ Customized to inject additional things """
    with super(BaseControl, self).component_guard():
      with self.make_injector().everywhere():
        yield

  def make_injector(self):
    """ Adds some additional stuff to the injector, used in BaseMessenger """
    return inject(
      control_surface = const(self),
      log_message = const(self.log_message),
      reset_controlled_track = const(self.reset_controlled_track),
      with_note = const(self.with_note),
      with_session = const(self.with_session),
      with_sequencer = const(self.with_sequencer),
      display_num = const(self.display_num),
    )