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
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)
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