MIDI: STUDIO B KEY - the Waves Tune key the tracks send really arrives in Studio B

User 2026-10-26: make sure the key Ableton sends changes Waves Tune at FOH and in Studio B. Studio B's Pro
Tools can't report the plugin's key, so midi_witness.py (LaunchAgent there) logs every program change on
'Network Tracks Midi' and the watchdog checks it against the song ProPresenter shows (the program that
song's Waves Tune clip sends, from the READY look): wrong program, or none after 45 s of a running song,
is red. FOH's LiveBox has no network interface: a witness on NA Ingest logs whether it sends anything back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 12:49:06 -04:00
co-authored by Claude Opus 5.5
parent aa90f7e03c
commit 1f98af4bab
8 changed files with 296 additions and 5 deletions
+6 -2
View File
@@ -1208,7 +1208,7 @@ def same_tune(clip_key, want):
return bool(kc and kw) and kw[1] and not kc[1] and (kw[0] + 3) % 12 == kc[0]
def eval_tune(rc, plan, look):
def eval_tune(rc, plan, look, sent=None):
"""The Waves Tune clip at each song's start is the song's PCO key (and the program it sends is that
key's program in the clip library, so a renamed clip is caught)."""
line = Line()
@@ -1240,6 +1240,8 @@ def eval_tune(rc, plan, look):
line.fault(ERR, "NO TUNE " + name, "no %s clip at or before %s, where %s starts" % (track, bar, gname))
continue
clip = at[-1]
if sent is not None: # the key the tracks send for this song (the witness checks)
sent[norm(title)] = {"clip": clip[2], "program": clip[3], "title": title}
have = tune_key(clip[2])
lib = next((n for n in library if tune_key(n) and same_tune(tune_key(n), want) and same_key(tune_key(n), have or "")), None)
right = next((n for n in library if tune_key(n) and same_tune(tune_key(n), want)), "%smaj" % want)
@@ -1809,7 +1811,9 @@ def look(cfg, now=None, data_dir=None, sources=None):
al = src["ableton"](plan)
lines.update(eval_ableton(rc, plan, al))
lines["keys"] = eval_keys(rc, plan, al)
lines["tune"] = eval_tune(rc, plan, al)
sent = {}
lines["tune"] = eval_tune(rc, plan, al, sent)
LAST["tune_sent"] = sent
if rc.get("light_timing_check", True):
try:
hits = src["hits"](al) if al.get("set") else []