diff --git a/abletonosc/device.py b/abletonosc/device.py index c53f1c2..fd7d5a8 100644 --- a/abletonosc/device.py +++ b/abletonosc/device.py @@ -10,7 +10,8 @@ def init_api(self): def create_device_callback(func, *args): def device_callback(params: Tuple[Any]): track_index, device_index = int(params[0]), int(params[1]) - device = self.song.tracks[track_index].devices[device_index] + tracks = list(self.song.tracks + [ self.song.master_track]) + device = tracks[track_index].devices[device_index] rv = func(device, *args, params[2:]) if rv is not None: return (track_index, device_index, *rv) diff --git a/abletonosc/song.py b/abletonosc/song.py index 4894c6a..4951030 100644 --- a/abletonosc/song.py +++ b/abletonosc/song.py @@ -60,6 +60,7 @@ def init_api(self): "punch_out", "record_mode", "session_record", + "session_automation_record", "signature_denominator", "signature_numerator", "tempo" @@ -87,13 +88,14 @@ def init_api(self): self.osc_server.add_handler("/live/song/get/num_tracks", lambda _: (len(self.song.tracks),)) def song_get_track_names(params): + tracks = list(self.song.tracks + [ self.song.master_track ]) if len(params) == 0: - track_index_min, track_index_max = 0, len(self.song.tracks) + track_index_min, track_index_max = 0, len(tracks) else: track_index_min, track_index_max = params if track_index_max == -1: - track_index_max = len(self.song.tracks) - return tuple(self.song.tracks[index].name for index in range(track_index_min, track_index_max)) + track_index_max = len(tracks) + return tuple(tracks[index].name for index in range(track_index_min, track_index_max)) self.osc_server.add_handler("/live/song/get/track_names", song_get_track_names) def song_get_track_data(params): @@ -113,11 +115,12 @@ def song_get_track_data(params): track_index_min, track_index_max, *properties = params self.logger.info("Getting track data: %s (tracks %d..%d)" % (properties, track_index_min, track_index_max)) + tracks = list(self.song.tracks + [ self.song.master_track]) if track_index_max == -1: - track_index_max = len(self.song.tracks) + track_index_max = len(tracks) rv = [] for track_index in range(track_index_min, track_index_max): - track = self.song.tracks[track_index] + track = tracks[track_index] for prop in properties: obj, property_name = prop.split(".") if obj == "track": @@ -129,7 +132,7 @@ def song_get_track_data(params): #-------------------------------------------------------------------------------- # Map Track objects to their track_index to return via OSC #-------------------------------------------------------------------------------- - value = list(self.song.tracks).index(value) + value = list(tracks).index(value) rv.append(value) elif obj == "clip": for clip_slot in track.clip_slots: diff --git a/abletonosc/track.py b/abletonosc/track.py index 8e6e670..3ef95c0 100644 --- a/abletonosc/track.py +++ b/abletonosc/track.py @@ -13,7 +13,8 @@ def create_track_callback(func: Callable, include_track_id: bool = False): def track_callback(params: Tuple[Any]): track_index = int(params[0]) - track = self.song.tracks[track_index] + tracks = list(self.song.tracks + [ self.song.master_track]) + track = tracks[track_index] if include_track_id: rv = func(track, *args, tuple(params[0:])) else: diff --git a/abletonosc/view.py b/abletonosc/view.py index 329f0c1..c3e0274 100644 --- a/abletonosc/view.py +++ b/abletonosc/view.py @@ -12,11 +12,33 @@ def get_selected_scene(params: Optional[Tuple] = ()): return (list(self.song.scenes).index(self.song.view.selected_scene),) def get_selected_track(params: Optional[Tuple] = ()): - return (list(self.song.tracks).index(self.song.view.selected_track),) + tracks = list(self.song.tracks + [self.song.master_track]) + return (tracks.index(self.song.view.selected_track),) def get_selected_clip(params: Optional[Tuple] = ()): return (get_selected_track()[0], get_selected_scene()[0]) + def set_selected_scene(params: Optional[Tuple] = ()): + index = params[0] + if(index >= 0 and index < len(self.song.scenes)): + scene = self.song.scenes[index] + self.song.view.selected_scene = scene + + def set_selected_track(params: Optional[Tuple] = ()): + index = params[0] + tracks = list(self.song.tracks + [ self.song.master_track ]) + if(index >= 0 and index < len(tracks)): + track = tracks[index] + self.song.view.selected_track = track + + def set_selected_clip(params: Optional[Tuple] = ()): + set_selected_track((params[0],)) + set_selected_scene((params[1],)) + self.osc_server.add_handler("/live/view/get/selected_scene", get_selected_scene) self.osc_server.add_handler("/live/view/get/selected_track", get_selected_track) - self.osc_server.add_handler("/live/view/get/selected_clip", get_selected_clip) \ No newline at end of file + self.osc_server.add_handler("/live/view/get/selected_clip", get_selected_clip) + + self.osc_server.add_handler("/live/view/set/selected_scene", set_selected_scene) + self.osc_server.add_handler("/live/view/set/selected_track", set_selected_track) + self.osc_server.add_handler("/live/view/set/selected_clip", set_selected_clip) \ No newline at end of file