def nameClipCB(self, msg): """Called when a /live/name/clip message is received. Messages: /live/name/clip Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name) /live/name/clip (int track, int clip) Returns a single clip's name in the form /live/name/clip (int clip, string name) /live/name/clip (int track, int clip, string name)Sets clip number clip in track number track's name to name """ #Requesting all clip names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 clipNumber = 0 for track in LiveUtils.getTracks(): for clipSlot in track.clip_slots: if clipSlot.clip != None: self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), str(clipSlot.clip.color_index))) clipNumber = clipNumber + 1 clipNumber = 0 trackNumber = trackNumber + 1 return #Requesting a single clip name if len(msg) == 4: trackNumber = msg[2] clipNumber = msg[3] self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(LiveUtils.getClip(trackNumber, clipNumber).name), str(LiveUtils.getClip(trackNumber, clipNumber).color_index))) return #renaming a clip if len(msg) == 5: trackNumber = msg[2] clipNumber = msg[3] name = msg[4] LiveUtils.getClip(trackNumber, clipNumber).name = name
def nameTrackCB(self, msg, source): """Called when a /live/name/track message is received. Messages: /live/name/track Returns a a series of all the track names in the form /live/name/track (int track, string name) /live/name/track (int track) Returns a single track's name in the form /live/name/track (int track, string name) /live/name/track (int track, string name)Sets track number track's name to name """ #Requesting all track names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 bundle = OSC.OSCBundle() for track in LiveUtils.getTracks(): bundle.append("/live/name/track", (trackNumber, str(track.name),int(track.has_midi_input))) trackNumber = trackNumber + 1 self.oscEndpoint.sendMessage(bundle) return #Requesting a single track name if len(msg) == 3: trackNumber = msg[2] self.oscEndpoint.send("/live/name/track", (trackNumber, str(LiveUtils.getTrack(trackNumber).name),int(LiveUtils.getTrack(trackNumber).has_midi_input))) return #renaming a track if len(msg) == 4: trackNumber = msg[2] name = msg[3] LiveUtils.getTrack(trackNumber).name = name
def nameTrackCB(self, msg): """Called when a /live/name/track message is received. Messages: /live/name/track Rerurns a a series of all the track names in the form /live/name/track (int track, string name) /live/name/track (int track) Returns a single track's name in the form /live/name/track (int track, string name) /live/name/track (int track, string name)Sets track number track's name to name """ #Requesting all track names if len(msg) == 2: trackNumber = 0 for track in LiveUtils.getTracks(): self.oscServer.sendOSC("/live/name/track", (trackNumber, track.name)) trackNumber = trackNumber + 1 return #Requesting a single track name if len(msg) == 3: trackNumber = msg[2] self.oscServer.sendOSC("/live/name/track", (trackNumber, LiveUtils.getTrack(trackNumber).name)) return #renaming a track if len(msg) == 4: trackNumber = msg[2] name = msg[3] LiveUtils.getTrack(trackNumber).name = name
def trname_changestate(self, tid, track, r = 0): if r == 1: self.oscEndpoint.send('/live/name/return', (tid, str(track.name))) else: # self.oscEndpoint.send('/live/name/track', (tid, str(track.name), track.color)) self.oscEndpoint.send("/live/name/track", (tid, str(track.name), track.color, int(track.has_midi_input))) self.trBlock(0, len(LiveUtils.getTracks()))
def trname_changestate(self, tid, track, r = 0): if r == 1: self.oscServer.sendOSC('/live/name/return', (tid, str(track.name))) else: self.oscServer.sendOSC('/live/name/track', (tid, str(track.name))) self.trBlock(0, len(LiveUtils.getTracks()))
def nameTrackCB(self, msg, source): """Called when a /live/name/track message is received. Messages: /live/name/track Returns a a series of all the track names in the form /live/name/track (int track, string name) /live/name/track (int track) Returns a single track's name in the form /live/name/track (int track, string name) /live/name/track (int track, string name)Sets track number track's name to name """ #Requesting all track names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 bundle = OSC.OSCBundle() for track in LiveUtils.getTracks(): bundle.append("/live/name/track", (trackNumber, str(track.name))) trackNumber = trackNumber + 1 self.oscEndpoint.sendMessage(bundle) return #Requesting a single track name if len(msg) == 3: trackNumber = msg[2] self.oscEndpoint.send( "/live/name/track", (trackNumber, str(LiveUtils.getTrack(trackNumber).name))) return #renaming a track if len(msg) == 4: trackNumber = msg[2] name = msg[3] LiveUtils.getTrack(trackNumber).name = name
def refresh_state(self): self.add_clip_listeners() self.add_mixer_listeners() self.add_scene_listeners() self.add_tempo_listener() self.add_overdub_listener() self.add_tracks_listener() trackNumber = 0 clipNumber = 0 for track in self.song().tracks: self.oscServer.sendOSC("/live/name/track", (trackNumber, str(track.name))) for clipSlot in track.clip_slots: if clipSlot.clip != None: self.oscServer.sendOSC( "/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), str(clipSlot.clip.color_index))) clipNumber = clipNumber + 1 clipNumber = 0 trackNumber = trackNumber + 1 self.trBlock(0, len(LiveUtils.getTracks()))
def nameClipCB(self, msg): """Called when a /live/name/clip message is received. Messages: /live/name/clip Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name) /live/name/clip (int track, int clip) Returns a single clip's name in the form /live/name/clip (int clip, string name) /live/name/clip (int track, int clip, string name)Sets clip number clip in track number track's name to name """ #Requesting all clip names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 clipNumber = 0 for track in LiveUtils.getTracks(): for clipSlot in track.clip_slots: if clipSlot.clip != None: self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), clipSlot.clip.color)) clipNumber = clipNumber + 1 clipNumber = 0 trackNumber = trackNumber + 1 return #Requesting a single clip name if len(msg) == 4: trackNumber = msg[2] clipNumber = msg[3] self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(LiveUtils.getClip(trackNumber, clipNumber).name), LiveUtils.getClip(trackNumber, clipNumber).color)) return #renaming a clip if len(msg) == 5: trackNumber = msg[2] clipNumber = msg[3] name = msg[4] LiveUtils.getClip(trackNumber, clipNumber).name = name
def nameTrackCB(self, msg): """Called when a /live/name/track message is received. Messages: /live/name/track Returns a a series of all the track names in the form /live/name/track (int track, string name) /live/name/track (int track) Returns a single track's name in the form /live/name/track (int track, string name) /live/name/track (int track, string name)Sets track number track's name to name """ #Requesting all track names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 for track in LiveUtils.getTracks(): self.oscServer.sendOSC("/live/name/track", (trackNumber, str(track.name))) trackNumber = trackNumber + 1 return #Requesting a single track name if len(msg) == 3: trackNumber = msg[2] self.oscServer.sendOSC("/live/name/track", (trackNumber, str(LiveUtils.getTrack(trackNumber).name))) return #renaming a track if len(msg) == 4: trackNumber = msg[2] name = msg[3] LiveUtils.getTrack(trackNumber).name = name
def filterClipsCacheCB(self, msg = None, source = None): self.clip_notes_cache = {} self.clip_tone_row_cache = {} log("making clip filter cache") t0 = time.time() try: for track_index, track in enumerate(LiveUtils.getTracks()): self.clip_notes_cache[track_index] = {} for clip_index, slot in enumerate(track.clip_slots): if slot.clip is not None: # match = re.search("(^|[_-])([A-G][A-G#b1-9-]*)$", slot.clip.name) match = re.search("([_-])([A-G][A-G#b1-9-]*)$", slot.clip.name) if match: notes_found_str = match.group(2) notes_found_str = re.sub("[1-9]", "", notes_found_str) notes_found = notes_found_str.split("-") notes = [ nametomidi(note) for note in notes_found ] # in case we have spurious/nonsense notes, filter them out notes = filter(lambda n: n is not None, notes) # log(" - %s: found notes: %s" % (slot.clip.name, notes)) self.clip_notes_cache[track_index][clip_index] = notes else: self.clip_notes_cache[track_index][clip_index] = None slot.clip.muted = False log("filtered clips (took %.3fs)" % (time.time() - t0)) except Exception, e: log("Exception: %s" % e)
def deactivateCB(self, msg, source): log("deactivating") for track in LiveUtils.getTracks(): for slot in track.clip_slots: if slot.clip != None: slot.clip.muted = True log("deactivated")
def trname_changestate(self, tid, track, r=0): if r == 1: self.oscEndpoint.send('/live/name/return', (tid, str(track.name))) else: # self.oscEndpoint.send('/live/name/track', (tid, str(track.name), track.color)) self.oscEndpoint.send( "/live/name/track", (tid, str(track.name), track.color, int(track.has_midi_input))) self.trBlock(0, len(LiveUtils.getTracks()))
def tracksCB(self, msg, source): """Called when a /live/tracks message is received. Messages: /live/tracks no argument or 'query' Returns the total number of scenes """ if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackTotal = len(LiveUtils.getTracks()) self.oscEndpoint.send("/live/tracks", (trackTotal)) return
def tracksCB(self, msg, source): """Called when a /live/tracks message is received. Messages: /live/tracks no argument or 'query' Returns the total number of tracks """ if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackTotal = len(LiveUtils.getTracks()) self.oscEndpoint.send("/live/tracks", (trackTotal)) return
def distributeGroupsCB(self, msg, source): log("distributeGroupsCB2") outputs = range(1, 66) index = 0 for track in LiveUtils.getTracks(): log("track %s" % track) if track.is_foldable: log(" - group track %s, sub routing = %s" % (track, track.current_output_sub_routing)) output = outputs[index] index = (index + 1) % len(outputs) track.current_output_routing = "Ext. Out" track.current_output_sub_routing = str(output) track.mixer_device.sends[0].value = 1.0
def nameClipCB(self, msg, source): """Called when a /live/name/clip message is received. Messages: /live/name/clip Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name) /live/name/clip (int track, int clip) Returns a single clip's name in the form /live/name/clip (int clip, string name) /live/name/clip (int track, int clip, string name)Sets clip number clip in track number track's name to name """ #Requesting all clip names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 clipNumber = 0 for track in LiveUtils.getTracks(): bundle = OSC.OSCBundle() for clipSlot in track.clip_slots: if clipSlot.clip != None: bundle.append( "/live/name/clip", (trackNumber, clipNumber, str( clipSlot.clip.name), clipSlot.clip.color)) clipNumber = clipNumber + 1 self.oscEndpoint.sendMessage(bundle) clipNumber = 0 trackNumber = trackNumber + 1 self.oscEndpoint.send("/live/name/clip/done", "bundle sended") return #Requesting a single clip name if len(msg) == 4: trackNumber = msg[2] clipNumber = msg[3] self.oscEndpoint.send( "/live/name/clip", (trackNumber, clipNumber, str(LiveUtils.getClip(trackNumber, clipNumber).name), LiveUtils.getClip(trackNumber, clipNumber).color)) return #renaming a clip if len(msg) >= 5: trackNumber = msg[2] clipNumber = msg[3] name = msg[4] LiveUtils.getClip(trackNumber, clipNumber).name = name if len(msg) >= 6: trackNumber = msg[2] clipNumber = msg[3] color = msg[5] LiveUtils.getClip(trackNumber, clipNumber).color = color
def scanSongTracks(self, songID): trackNumber = 0 bundle = OSC.OSCBundle() bundle.append(OSC.OSCMessage("/song/" + songID + "/layout/start")) for track in LiveUtils.getTracks(): trackType = 'MIDI' if track.has_midi_input else 'Audio' bundle.append( OSC.OSCMessage("/song/" + songID + "/track/", (trackNumber, str(track.name), str(trackType)))) trackNumber = trackNumber + 1 bundle.append(OSC.OSCMessage("/song/" + songID + "/layout/end")) self.oscEndpoint.sendMessage(bundle) return
def scanTracks(self, msg, source): #/tracks Returns a a series of all the track names in the form /track/name (int track, string name) trackNumber = 0 bundle = OSC.OSCBundle() layoutID = self.makeID() bundle.append(OSC.OSCMessage("/layout/" + layoutID + "/start")) for track in LiveUtils.getTracks(): trackType = 'MIDI' if track.has_midi_input else 'Audio' bundle.append( OSC.OSCMessage("/track/" + layoutID, (trackNumber, str(track.name), str(trackType)))) trackNumber = trackNumber + 1 bundle.append(OSC.OSCMessage("/layout/" + layoutID + "/end")) self.oscEndpoint.sendMessage(bundle) return
def trname_changestate(self, tid, track, r = 0): if r == 1: col = 0 try: col = track.color except: pass self.oscEndpoint.send('/live/name/return', (tid, str(track.name), col)) else: col = 0 try: col = track.color except: pass ndevices=len(track.devices) self.oscEndpoint.send('/live/name/track', (tid, str(track.name), col)) self.trBlock(0, len(LiveUtils.getTracks()))
def trname_changestate(self, tid, track, r=0): if r == 1: col = 0 try: col = track.color except: pass self.oscEndpoint.send('/live/name/return', (tid, str(track.name), col)) else: col = 0 try: col = track.color except: pass ndevices = len(track.devices) self.oscEndpoint.send('/live/name/track', (tid, str(track.name), col)) self.trBlock(0, len(LiveUtils.getTracks()))
def nameClipCB(self, msg, source): """Called when a /live/name/clip message is received. Messages: /live/name/clip Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name) /live/name/clip (int track, int clip) Returns a single clip's name in the form /live/name/clip (int clip, string name) /live/name/clip (int track, int clip, string name)Sets clip number clip in track number track's name to name """ #Requesting all clip names if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"): trackNumber = 0 clipNumber = 0 for track in LiveUtils.getTracks(): bundle = OSC.OSCBundle() for clipSlot in track.clip_slots: if clipSlot.clip != None: bundle.append("/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), clipSlot.clip.color)) clipNumber = clipNumber + 1 self.oscEndpoint.sendMessage(bundle) clipNumber = 0 trackNumber = trackNumber + 1 self.oscEndpoint.send("/live/name/clip/done", "bundle sended") return #Requesting a single clip name if len(msg) == 4: trackNumber = msg[2] clipNumber = msg[3] self.oscEndpoint.send("/live/name/clip", (trackNumber, clipNumber, str(LiveUtils.getClip(trackNumber, clipNumber).name), LiveUtils.getClip(trackNumber, clipNumber).color)) return #renaming a clip if len(msg) >= 5: trackNumber = msg[2] clipNumber = msg[3] name = msg[4] LiveUtils.getClip(trackNumber, clipNumber).name = name if len(msg) >= 6: trackNumber = msg[2] clipNumber = msg[3] color = msg[5] LiveUtils.getClip(trackNumber, clipNumber).color = color
def refresh_state(self): self.add_clip_listeners() self.add_mixer_listeners() self.add_scene_listeners() self.add_tempo_listener() self.add_overdub_listener() self.add_tracks_listener() trackNumber = 0 clipNumber = 0 for track in self.song().tracks: self.oscServer.sendOSC("/live/name/track", (trackNumber, str(track.name))) for clipSlot in track.clip_slots: if clipSlot.clip != None: self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), str(clipSlot.clip.color_index))) clipNumber = clipNumber + 1 clipNumber = 0 trackNumber = trackNumber + 1 self.trBlock(0, len(LiveUtils.getTracks()))
def update(self): if self.track_index >= len(LiveUtils.getTracks()): return track = LiveUtils.getTrack(self.track_index) colorIndex = track.color_index colorHue = ColorMap.hue[colorIndex] colorSatu = ColorMap.saturation[colorIndex] colorLight = ColorMap.light[colorIndex] valLeft = round(track.output_meter_left, 3) if track.has_audio_output else 0 valRight = round(track.output_meter_right, 3) if track.has_audio_output else 0 level = (valLeft + valRight) / 2 if (level > CHANNEL_SCALE_MAX): level = CHANNEL_SCALE_MAX elif (level < CHANNEL_SCALE_MIN): level = CHANNEL_SCALE_MIN level = level - CHANNEL_SCALE_MIN level = (level / (CHANNEL_SCALE_MAX - CHANNEL_SCALE_MIN)) * self.resolution for index in range(self.resolution): max_value = index + 1 min_value = index if (level <= min_value): colorLight = 0 elif (level < max_value): colorLight = (level - min_value) * colorLight if colorHue != self.previousHue[index]: self.sliderHue[index].send_value(colorHue, True) self.previousHue[index] = colorHue if colorSatu != self.previousSatu[index]: self.sliderSatu[index].send_value(colorSatu, True) self.previousSatu[index] = colorSatu if colorLight != self.previousLight[index]: self.sliderLight[index].send_value(colorLight, True) self.previousLight[index] = colorLight
def filterClipsCB_old(self, msg, source): try: t0 = time.time() note_names = msg[2:] log("filtering clips according to %s" % note_names) log("nametomidi is %s" % nametomidi) target = [ nametomidi(note) for note in note_names ] log("target: %s" % target) for track in LiveUtils.getTracks(): for slot in track.clip_slots: if slot.clip != None: log(" - clip: %s" % slot.clip.name) match = re.search("(^|[_-])([A-G][A-G#b12-]*)$", slot.clip.name) if match: notes_found_str = match.group(2) notes_found_str = re.sub("[12]", "", notes_found_str) log(" - match: %s" % notes_found_str) notes_found = notes_found_str.split("-") notes = [ nametomidi(note) for note in notes_found ] # in case we have spurious/nonsense notes, filter them out notes = filter(lambda n: n is not None, notes) # log(" - found notes: %s" % notes) # don't transpose for now acceptable, bend = filter_tone_row(notes, target, 0) if acceptable: slot.clip.muted = False # slot.clip.pitch_coarse = bend log("[%s] notes %s; acceptable %s, bend %d" % (slot.clip, notes, acceptable, bend)) else: slot.clip.muted = True else: slot.clip.muted = False log("filtered clips (took %.3fs)" % (time.time() - t0)) except Exception, e: log("Exception: %s" % e)
def filterClipsCB(self, msg, source): if not self.clip_notes_cache: log("no cache found, creating") self.filterClipsCacheCB() try: t0 = time.time() note_names = msg[2:] log("filtering clips according to %s" % note_names) log("nametomidi is %s" % nametomidi) target = tuple(nametomidi(note) for note in note_names) # log("target: %s" % target) clip_states = {} if target in self.clip_tone_row_cache: log(" - found cached") clip_states = self.clip_tone_row_cache[target] else: log(" - not found in cache, calculating") for track_index, track in enumerate(LiveUtils.getTracks()): for clip_index, slot in enumerate(track.clip_slots): if slot.clip != None: notes = self.clip_notes_cache[track_index][clip_index] # log(" - found notes: %s" % notes) if notes: # don't transpose for now acceptable, bend = filter_tone_row(notes, target, 0) clip_states[slot.clip] = acceptable self.clip_tone_row_cache[target] = clip_states for clip, acceptable in clip_states.items(): clip.muted = not acceptable except Exception, e: log("filtering failed (%s); rebuilding cache" % e) self.filterClipsCacheCB()
def clearInactiveCB(self, msg, source): log("clearing inactive") for track in LiveUtils.getTracks(): for slot in track.clip_slots: if slot.clip != None and slot.clip.muted: slot.delete_clip()
def trname_changestate(self, tid, track, r = 0): if r == 1: self.oscEndpoint.send('/live/name/return', (tid, str(track.name))) else: self.oscEndpoint.send('/live/name/track', (tid, str(track.name))) self.trBlock(0, len(LiveUtils.getTracks()))