class SessionManager(AbstractControlSurfaceComponent):
    def __init__(self, *a, **k):
        # type: (Any, Any) -> None
        super(SessionManager, self).__init__(*a, **k)
        self.session = None  # type: Optional[SessionComponent]
        # self.register_slot(self.parent.songManager, self.display_session_ring, "selected_track")

    def toggle_session_ring(self):
        # type: () -> None
        self._display_session_ring()
        self._hide_session_ring()

    def _display_session_ring(self):
        # type: () -> None
        if self.session:
            self._hide_session_ring()

        try:
            if not self.song.selected_track.IS_ACTIVE:
                return
        except IndexError:
            return

        def get_all_sub_tracks_inclusive(parent_track):
            # type: (SimpleTrack) -> List[SimpleTrack]
            sub_tracks = [parent_track]
            for sub_track in parent_track.sub_tracks:
                sub_tracks.extend(get_all_sub_tracks_inclusive(sub_track))
            return sub_tracks

        total_tracks = get_all_sub_tracks_inclusive(self.song.current_track.base_track)
        num_tracks = len([track for track in total_tracks if track.is_visible])
        track_offset = self.session_track_offset

        with self.parent.component_guard():
            self.session = SessionComponent(num_tracks=num_tracks, num_scenes=len(self.song.scenes))
        self.session.set_offsets(track_offset=track_offset, scene_offset=0)
        if track_offset != len(list(self.song.visible_tracks)) - 1:
            self.parent.set_highlighting_session_component(self.session)

    def _hide_session_ring(self):
        # type: () -> None
        if self.session:
            self.session.set_show_highlight(False)
            self.session.disconnect()

    @property
    def session_track_offset(self):
        # type: () -> int
        try:
            return list(self.song.visible_tracks).index(self.song.current_track.base_track)
        except ValueError:
            return self.session.track_offset() if self.session else 0
Пример #2
0
	def _setup_session_control(self):
		global session
		is_momentary = True
		num_tracks = 7
		num_scenes = 5
		session = SessionComponent(num_tracks, num_scenes)
		session.name = 'Session'
		self._session = session
		session.set_offsets(0, 0)
		self._scene = [ None for index in range(6) ]
		for row in range(num_scenes):
			self._scene[row] = session.scene(row)
			self._scene[row].name = 'Scene_' + str(row)
			for column in range(num_tracks):
				clip_slot = self._scene[row].clip_slot(column)
				clip_slot.name = str(column) + '_Clip_Slot_' + str(row)

		session.set_mixer(self._mixer)
		session.set_show_highlight(True)
		self._session_zoom = SessionZoomingComponent(session)
		self._session_zoom.name = 'Session_Overview'
		self.set_highlighting_session_component(self._session)
Пример #3
0
class Faderfox(OptimizedControlSurface):
    __module__ = __name__
    __doc__ = " Monomodular controller script for PO10 "

    def __init__(self, *a, **k):
        super(Faderfox, self).__init__(*a, **k)
        self._version_check = '1.0'
        self._host_name = 'Faderfox'
        self._color_type = 'Monochrome'
        self._rgb = 0
        self._timer = 0
        self._touched = 0
        self.flash_status = 1
        self._skin = Skin(FaderfoxColors)
        self._main_modes = None
        with self.component_guard():
            self._setup_monobridge()
            self._setup_controls()
            self._setup_session()
            self._setup_device_control()
            self._setup_device_selector()
            self._setup_modes()
        self._device_selector.select_device(DEFAULT_DEVICE_INDEX)
        self._on_device_changed.subject = self.song()
        self.set_feedback_channels(range(14, 15))
        #self._main_modes.selected_mode = 'MixMode'
        self.schedule_message(1, self._open_log)
        self._session.set_enabled(True)

    def _open_log(self):
        self.log_message("<<<<<<<<<<<<<<<<<<<<= " + str(self._host_name) +
                         " " + str(self._version_check) +
                         " log opened =>>>>>>>>>>>>>>>>>>>")
        self.show_message(str(self._host_name) + ' Control Surface Loaded')

    def _setup_monobridge(self):
        self._monobridge = MonoBridgeElement(self)
        self._monobridge.name = 'MonoBridge'

    def _setup_controls(self):
        is_momentary = True
        self._button = [
            MonoButtonElement(is_momentary,
                              MIDI_NOTE_TYPE,
                              CHANNEL,
                              FADERFOX_BUTTONS[index],
                              name='Button_' + str(index),
                              script=self,
                              skin=self._skin,
                              color_map=COLOR_MAP) for index in range(4)
        ]
        self._encoder = [
            CodecEncoderElement(MIDI_CC_TYPE, CHANNEL,
                                FADERFOX_ENCODERS[index],
                                Live.MidiMap.MapMode.absolute,
                                'Encoder_' + str(index),
                                FADERFOX_ENCODERS[index], self)
            for index in range(4)
        ]

        self._encoder_matrix = ButtonMatrixElement(name='Encoder_Matrix',
                                                   rows=[self._encoder])
        self._button_matrix = ButtonMatrixElement(name='Button_Matrix',
                                                  rows=[self._button[2:]])

    def _setup_session(self):
        self._session = SessionComponent(name='Session_Component',
                                         num_tracks=20,
                                         num_scenes=1)
        self._session._scenes[0].layer = Layer(priority=6,
                                               launch_button=self._button[0])
        self._session.layer = Layer(priority=6,
                                    scene_bank_down_button=self._button[1])
        self.set_highlighting_session_component(self._session)
        self._session.set_show_highlight(True)
        self._session.set_enabled(False)
        self._session._link()

    def _setup_device_control(self):
        self._device = BaseDeviceComponent()
        self._device.layer = Layer(priority=6,
                                   parameter_controls=self._encoder_matrix)
        self._device.set_enabled(True)

    def _setup_device_selector(self):
        self._device_selector = FaderfoxDeviceSelectorComponent(self,
                                                                self._device,
                                                                prefix='@d')
        self._device_selector.layer = Layer(priority=6,
                                            matrix=self._button_matrix)
        self._device_selector.set_enabled(True)

    def _setup_modes(self):
        pass

    def update_display(self):
        super(Faderfox, self).update_display()
        self._timer = (self._timer + 1) % 256
        self.flash()

    def flash(self):
        if (self.flash_status > 0):
            for control in self.controls:
                if isinstance(control, MonoButtonElement):
                    control.flash(self._timer)

    @subject_slot('appointed_device')
    def _on_device_changed(self):
        debug('appointed device changed, script')

    def generate_strip_string(self, display_string):
        NUM_CHARS_PER_DISPLAY_STRIP = 12
        if (not display_string):
            return (' ' * NUM_CHARS_PER_DISPLAY_STRIP)
        if ((len(display_string.strip()) > (NUM_CHARS_PER_DISPLAY_STRIP - 1))
                and (display_string.endswith('dB') and
                     (display_string.find('.') != -1))):
            display_string = display_string[:-2]
        if (len(display_string) > (NUM_CHARS_PER_DISPLAY_STRIP - 1)):
            for um in [' ', 'i', 'o', 'u', 'e', 'a']:
                while ((len(display_string) >
                        (NUM_CHARS_PER_DISPLAY_STRIP - 1))
                       and (display_string.rfind(um, 1) != -1)):
                    um_pos = display_string.rfind(um, 1)
                    display_string = (display_string[:um_pos] +
                                      display_string[(um_pos + 1):])
        else:
            display_string = display_string.center(
                (NUM_CHARS_PER_DISPLAY_STRIP - 1))
        ret = u''
        for i in range((NUM_CHARS_PER_DISPLAY_STRIP - 1)):
            if ((ord(display_string[i]) > 127)
                    or (ord(display_string[i]) < 0)):
                ret += ' '
            else:
                ret += display_string[i]

        ret += ' '
        ret = ret.replace(' ', '_')
        assert (len(ret) == NUM_CHARS_PER_DISPLAY_STRIP)
        return ret

    def notification_to_bridge(self, name, value, sender):
        if (isinstance(sender, (MonoEncoderElement, CodecEncoderElement))):
            pn = str(self.generate_strip_string(name))
            pv = str(self.generate_strip_string(value))
            self._monobridge._send(sender.name, 'lcd_name', pn)
            self._monobridge._send(sender.name, 'lcd_value', pv)

    def touched(self):
        if self._touched is 0:
            self._monobridge._send('touch', 'on')
            self.schedule_message(2, self.check_touch)
        self._touched += 1

    def check_touch(self):
        if self._touched > 5:
            self._touched = 5
        elif self._touched > 0:
            self._touched -= 1
        if self._touched is 0:
            self._monobridge._send('touch', 'off')
        else:
            self.schedule_message(2, self.check_touch)

    def disconnect(self):
        self._session._unlink()
        self.log_message("<<<<<<<<<<<<<<<<<<<<<<<<< " + str(self._host_name) +
                         " log closed >>>>>>>>>>>>>>>>>>>>>>>>>")
        super(Faderfox, self).disconnect()


#	a