START: bright red guide, no transposing unpitched stems, consolidate + warp off in Live
Per the Location Setup worksheet (2026-10-26): - a song saved twice holds two guides; START takes the bright red one (Live clip color 14), not the newer light pink one - drums, percussion, aux drums and other unpitched stems are never transposed (by stem name; sub bass and FX are) - every transposed clip is consolidated in Live (Edit > Consolidate) and its warp turned off, then the set is saved; a hold of START does it for this week's existing sets too. New AbletonOSC commands: clip, select_clip, set_clip - the START key's CONSOLIDATE comes from the saved set (clips still transposed), not the last build's log Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,9 +4,20 @@
|
||||
Moves the note of `pitch` that starts at arrangement `beat` on the arrangement MIDI clip of the track
|
||||
called `track name` so it starts at `new beat`, keeping where it ends (the next cue is not touched).
|
||||
Answers (<track name>, <beat>, <pitch>, <moved: 0 or 1>). Undo in Live (Cmd+Z) puts it back.
|
||||
|
||||
START's consolidating (ableton_start.py) finds an arrangement clip by <track index> (Live's, no returns),
|
||||
<track name> (any track of that name when the index has moved) and the <beat> it starts at:
|
||||
/live/statuspanel/clip <index> <name> <beat>
|
||||
Answers (<index>, <name>, <beat>, <found>, <pitch_coarse>, <warping>, <file path>).
|
||||
/live/statuspanel/select_clip <index> <name> <beat>
|
||||
Selects the clip in the arrangement (Edit > Consolidate then works on it). Answers (..., <found>).
|
||||
/live/statuspanel/set_clip <index> <name> <beat> <pitch_coarse> <warping>
|
||||
Sets the clip's transposition, then its warp. Answers (..., <found>, <pitch_coarse>, <warping>).
|
||||
"""
|
||||
import logging
|
||||
|
||||
import Live
|
||||
|
||||
logger = logging.getLogger("abletonosc")
|
||||
|
||||
|
||||
@@ -34,3 +45,53 @@ def register(handler):
|
||||
return name, beat, pitch, moved
|
||||
|
||||
handler.osc_server.add_handler("/live/statuspanel/move_note", move_note)
|
||||
|
||||
def find(params):
|
||||
song = handler.song
|
||||
i, name, beat = int(params[0]), str(params[1]).strip().upper(), float(params[2])
|
||||
ts = list(song.tracks)
|
||||
order = ([ts[i]] if 0 <= i < len(ts) and ts[i].name.strip().upper() == name else []) + \
|
||||
[t for t in ts if t.name.strip().upper() == name]
|
||||
for t in order:
|
||||
try:
|
||||
arr = t.arrangement_clips
|
||||
except Exception:
|
||||
continue
|
||||
for c in arr:
|
||||
if abs(c.start_time - beat) < 0.01:
|
||||
return t, c
|
||||
return None, None
|
||||
|
||||
def info(c):
|
||||
if c is None:
|
||||
return 0, 0, 0, ""
|
||||
return 1, int(c.pitch_coarse), int(c.warping), str(c.file_path)
|
||||
|
||||
def clip(params):
|
||||
_, c = find(params)
|
||||
return (int(params[0]), str(params[1]), float(params[2])) + info(c)
|
||||
|
||||
def select_clip(params):
|
||||
t, c = find(params)
|
||||
if c is not None:
|
||||
song = handler.song
|
||||
view = Live.Application.get_application().view
|
||||
view.show_view("Arranger")
|
||||
view.focus_view("Arranger")
|
||||
song.view.selected_track = t
|
||||
song.view.detail_clip = c
|
||||
view.focus_view("Arranger")
|
||||
logger.info("statuspanel: select %s at %s: %s", params[1], params[2], c is not None)
|
||||
return int(params[0]), str(params[1]), float(params[2]), int(c is not None)
|
||||
|
||||
def set_clip(params):
|
||||
_, c = find(params)
|
||||
if c is not None:
|
||||
c.pitch_coarse = int(params[3])
|
||||
c.warping = bool(int(params[4]))
|
||||
logger.info("statuspanel: %s at %s: pitch %s warp %s", params[1], params[2], params[3], params[4])
|
||||
return (int(params[0]), str(params[1]), float(params[2])) + info(c)[:3]
|
||||
|
||||
handler.osc_server.add_handler("/live/statuspanel/clip", clip)
|
||||
handler.osc_server.add_handler("/live/statuspanel/select_clip", select_clip)
|
||||
handler.osc_server.add_handler("/live/statuspanel/set_clip", set_clip)
|
||||
|
||||
Reference in New Issue
Block a user