def release_parameter(self): """ Overrides standard to update mapping type on parameter disconnect and clear out observers. """ self._on_parameter_changed.subject = None self._on_property_value_changed.subject = None SliderElement.release_parameter(self) self._smoother.set_parameter(None) self._parameter_to_map_to = None self._update_mapping_type() return
class HyperionChan(CompoundComponent): def __init__(self, hyperion, mod_num, *a, **kw): super(HyperionChan, self).__init__(*a, **kw) self.hyperion = hyperion self.mod_num = mod_num self._track_selector_encoder = EncoderElement(MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 0x15, Live.MidiMap.MapMode.relative_smooth_binary_offset) # Right encoder on Hyperion self._track_selector_encoder.add_value_listener(self._on_track_selector_encoder) self._fader = SliderElement(MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 0x25) self._pots = [ EncoderElement(MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 0x1E + num, Live.MidiMap.MapMode.absolute, name='Pot{}'.format(num)) for num in range(8) ] self._btns = [ ButtonElement(True, MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 1 + num, name='Btn{}'.format(num)) for num in range(8) ] self._enc_right_btn = ButtonElement(True, MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 10, name='EncRightBtn') self._enc_right_btn.add_value_listener(self._on_enc_right_btn) #self._cs = ChannelStripComponent() #self._cs.set_volume_control(self._fader) self._vu_slider = SliderElement(MIDI_CC_TYPE, MIDI_MASTER_CH + 1 + mod_num, 60) self._vu = VUMeter(self) self._track = None tracks = self._get_all_tracks(self.hyperion.song().tracks) if len(tracks) > self.mod_num: self._bind_to_track(tracks[self.mod_num]) else: self._bind_to_track(None) def log(self, msg, *args): self.hyperion.log_message(('HyperionChan({}): ' + msg).format(self.mod_num, *args)) def disconnect(self): super(HyperionChan, self).disconnect() self._enc_right_btn.remove_value_listener(self._on_enc_right_btn) def _get_parent_by_type(self, obj, parent_type): if not obj.canonical_parent: return if isinstance(obj.canonical_parent, parent_type): return obj.canonical_parent return self._get_parent_by_type(obj.canonical_parent, parent_type) def _on_enc_right_btn(self, value): if value and self._track: self.log('type {}',type(self._track)) song = self.hyperion.song() if isinstance(self._track, Live.Track.Track): song.view.selected_track = self._track elif isinstance(self._track, Live.DrumChain.DrumChain): parent_track = self._get_parent_by_type(self._track, Live.Track.Track) song.view.selected_track = parent_track try: song.view.selected_chain = self._track except: try: song.view.selected_track = parent_track song.view.selected_chain = self._track.canonical_parent.canonical_parent self._track.canonical_parent.view.selected_chain = self._track except: pass def _get_track_mapper_device(self, track): for device in track.devices: if device.name == 'MultiMapper16 V2.0': return device def _get_all_tracks(self, all_tracks): got_tracks = [] for cur_track in all_tracks: if isinstance(cur_track, (Live.Track.Track, Live.DrumChain.DrumChain)): got_tracks.append(cur_track) devices = list(cur_track.devices) if len(devices) and isinstance(devices[0], Live.RackDevice.RackDevice): got_tracks.extend(self._get_all_tracks(devices[0].chains)) return [track for track in got_tracks if self._get_track_mapper_device(track)] def _on_track_selector_encoder(self, value): direction = 1 if value > 64 else -1 tracks = self._get_all_tracks(self.hyperion.song().tracks) # for t in tracks: # self.log('AAAAA {}', t.name) try: cur_track_idx = tracks.index(self._track) except ValueError: self.log('track disappeared :(') self._bind_to_track(tracks[0]) else: cur_track_idx += direction if cur_track_idx == len(tracks): cur_track_idx = 0 if cur_track_idx == -1: cur_track_idx = len(tracks) - 1 self._bind_to_track(tracks[cur_track_idx]) def _bind_to_track(self, track): if self._track: #self._cs.set_track(None) self._fader.release_parameter() [pot.release_parameter() for pot in self._pots] [btn.release_parameter() for btn in self._btns] self._track.remove_name_listener(self._on_name_changed) self._track = None if not track: return self.log('binding to {}', track.name) self._track = track self._fader.connect_to(track.mixer_device.volume) mapper_dev = self._get_track_mapper_device(track) for num in range(8): self._pots[num].connect_to(mapper_dev.parameters[3 + num]) # MacroA0 MacroA1 etc self._btns[num].connect_to(mapper_dev.parameters[11 + num]) # MacroB0 MacroB1 etc # self._cs.set_track(track) if getattr(self._track, 'has_audio_output', False) and hasattr(self._track, 'add_output_meter_left_listener'): self._vu.set_vu_meter(track, self._vu_slider) else: self._vu.set_vu_meter(None, None) self._track.add_name_listener(self._on_name_changed) self._on_name_changed() def _on_name_changed(self): self.hyperion.sysex.set_title(self.mod_num, self._track.name if self._track else '-')
def release_parameter(self): SliderElement.release_parameter(self) self._send_param_val(True)
def release_parameter(self): SliderElement.release_parameter(self) self._send_param_val(True)