RESI VOX: two leads - the song's Audio note in PCO says whose mic goes out
User 2026-10-25: 'check the notes if there's 2 people on a song'. 'V3' or a lead's name in the Audio note picks; without one it stays flagged and nothing switches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -164,7 +164,7 @@ everything on the page at once.
|
||||
| LINEUP TV | ProdDash's Band Lineup shows this plan, nobody who is not on it or who declined, and everyone on the Band and Communication teams | re-syncs the board from Planning Center |
|
||||
| TRACKS OUT | every location in `"locations"` (AB, SC) has this weekend's project folder | copies NA's project to the locations that have none (as `261018 AB Project`, without `Backup/`). It is copied under a temporary name and renamed at the end, so a half-finished copy never looks sent. It never overwrites a folder that is already there and never runs by itself. |
|
||||
| PROP OUT | a `.probundle` is in this weekend's folder of the Chronicles share (`/Volumes/Location Assets/261025`, read on the ProPresenter Mac). **SHARE NOT MOUNTED**: the share itself is not mounted there (2026-10-22: it had dropped off and the key said NOT IN 261025 although the bundle was there). The ProP Mac keeps it mounted by itself: a LaunchAgent (`org.waterschurch.keep-mounted.location-assets`, from `remote-access/mac-keep-mounted.sh`) looks every minute and at login, mounts it again with the Chronicles login saved in the Keychain, and unmounts and remounts it when it hangs after sleep or a network drop (log: `~/Library/Logs/keep-mounted-location-assets.log` on the ProP Mac). | starts that agent now and waits for the share (about 6 s), then looks again. Also an auto-fix. |
|
||||
| RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Only flagged, never switched: **2 LEADS: MIKE DJ**, **JOSH NOT ON LINEUP**, **LEAD ON VOX 5: NO BUTTON**. The lineup is what counts: a PCO Audio note naming another VOX is only mentioned in the details. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). |
|
||||
| RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Two leads ("Mike and DJ lead"): the song's Audio note in PCO says whose mic goes out ("V3" or a name); without one it is flagged, never switched: **2 LEADS: MIKE DJ**. Also only flagged: **JOSH NOT ON LINEUP**, **LEAD ON VOX 5: NO BUTTON**. The lineup is what counts: a PCO Audio note naming another VOX is only mentioned in the details. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). |
|
||||
| START | every service Planning Center lists this week (this location's Sunday and every special service: First / Together Tuesday, Morning Worship, ...) has its Ableton set. **NO SET SUN 11/1** (red when due): hold START. While it builds the key shows what it is doing (**SAVING JEHOVAH**, **COPYING 40/120**). After a build, for a day: **CONSOLIDATE THE LORD IS** (a song transposed to its PCO key: consolidate it in Live), **NEW SONG GRACE** (not in Finished Songs: build it by hand, page 3 of the workflow PDF). See *START* below. | builds the missing sets (on the Tracks Mac, in the background). Never runs by itself. |
|
||||
|
||||
**Where the answers come from:**
|
||||
|
||||
+19
-12
@@ -2226,26 +2226,33 @@ def eval_resi_vox(rc, plan, lineup, now_vox, now_got):
|
||||
if v is None:
|
||||
line.fault(WARN, "%s NOT ON LINEUP" % short(n, 10), "%s leads %s, but %s" % (n, where, (
|
||||
"more than one person fits: " + who) if who else "nobody of that name has a VOX on the lineup or in PCO"))
|
||||
want = None
|
||||
if len(voxes) == 1 and all(v for _, v, _, _ in found):
|
||||
want, lead = None, found[0]
|
||||
audio = (song.get("notes") or {}).get(rv.get("note", "Audio"), "") or ""
|
||||
said = re.search(r"\bV(?:OX)?\s*(\d)\b", audio, re.I)
|
||||
if len(found) > 1:
|
||||
# Two leads: the song's Audio note in PCO says whose mic goes out ("V3", or a name: "DJ"). User, 2026-10-25.
|
||||
picked = [f for f in found if f[1] and ((said and f[1] == int(said.group(1))) or re.search(r"\b%s\b" % re.escape(f[0]), audio, re.I))]
|
||||
if len(picked) == 1:
|
||||
want, lead = picked[0][1], picked[0]
|
||||
line.notes.append("%s: %d leads; PCO's Audio note (%s) picks %s" % (where, len(found), audio, lead[2] or lead[0]))
|
||||
elif all(v for _, v, _, _ in found):
|
||||
line.fault(WARN, "%d LEADS: %s" % (len(found), " ".join(short(n, 6) for n, _, _, _ in found)),
|
||||
"%s has %s leading (VOX %s): say whose mic goes out in the song's Audio note in PCO (\"V3\" or a name)%s" % (
|
||||
where, " and ".join(n for n, _, _, _ in found), ", ".join(str(v) for _, v, _, _ in found),
|
||||
("; it says \"%s\", which is none of them" % audio) if audio else ""))
|
||||
elif voxes:
|
||||
want = voxes.pop()
|
||||
elif len(voxes) > 1:
|
||||
line.fault(WARN, "%d LEADS: %s" % (len(found), " ".join(short(n, 6) for n, _, _, _ in found)),
|
||||
"%s has %s leading (VOX %s): pick the one Resi gets by hand" % (
|
||||
where, " and ".join(n for n, _, _, _ in found), ", ".join(str(v) for _, v, _, _ in found)))
|
||||
audio = (song.get("notes") or {}).get(rv.get("note", "Audio"), "")
|
||||
said = re.search(r"\bV(?:OX)?\s*(\d)\b", audio or "", re.I)
|
||||
if want and said and int(said.group(1)) != want: # the lineup is right (user, 2026-10-25: "V2 was a mistake")
|
||||
line.notes.append("%s: PCO's Audio note says %s; the lineup (VOX %d) is what counts" % (where, audio, want))
|
||||
if said and int(said.group(1)) != want: # the lineup is right (user, 2026-10-25: "V2 was a mistake")
|
||||
line.notes.append("%s: PCO's Audio note says %s; the lineup (VOX %d) is what counts" % (where, audio, want))
|
||||
if want and buttons and want not in buttons:
|
||||
line.fault(ERR, "LEAD ON VOX %d: NO BUTTON" % want, "%s is on VOX %d; page 13 only has VOX %s AJA" % (
|
||||
found[0][2], want, ", ".join(str(b) for b in sorted(buttons))))
|
||||
lead[2], want, ", ".join(str(b) for b in sorted(buttons))))
|
||||
want = None
|
||||
have = "VOX %d" % now_vox if now_vox else "%s @ %s" % (now_got.get("tx_channel") or "nothing", now_got.get("tx_device") or "-")
|
||||
if want and now_vox != want:
|
||||
line.fault(ERR, "RESI %s NOT VOX %d" % (("V%d" % now_vox) if now_vox else "MIC WRONG", want),
|
||||
"%s: %s leads (VOX %d on the %s); the Resi AJA's lead channel gets %s" % (
|
||||
where, found[0][2], want, found[0][3], have))
|
||||
where, lead[2], want, lead[3], have))
|
||||
who = next(((w or n).split()[0] for n, v, w, _ in found if v and v == now_vox), "")
|
||||
line.info = ("VOX %d %s" % (now_vox, short(who, 10))).strip() if now_vox else have[:16]
|
||||
line.notes.append("%s: lead %s; AJA %s receives %s" % (where, ", ".join("%s = VOX %s (%s)" % (w or n, v, s) for n, v, w, s in found),
|
||||
|
||||
+1
-1
@@ -595,7 +595,7 @@
|
||||
lineup: "The Band Lineup TV shows this plan, nobody who is not on it or declined, and everyone on the band and communication teams.",
|
||||
track_bundle: "Every location has this weekend's Ableton project folder on the shared drive.",
|
||||
prop_bundle: "A ProPresenter bundle was saved for the locations since Monday.",
|
||||
resi_vox: "The Resi song (marked RESI in Planning Center, else the last song before the message) goes out to the locations with its lead singer's mic: the lead from the song's description (\"Genesis lead\"), their VOX from the lineup screen, and what the Resi AJA's Lead Vocal channel really receives (read from the card over Dante). Hold, or auto-fix, presses that VOX's AJA button on page 13. Two leads, a lead not on the lineup are only flagged: a person decides.",
|
||||
resi_vox: "The Resi song (marked RESI in Planning Center, else the last song before the message) goes out to the locations with its lead singer's mic: the lead from the song's description (\"Genesis lead\"), their VOX from the lineup screen, and what the Resi AJA's Lead Vocal channel really receives (read from the card over Dante). Hold, or auto-fix, presses that VOX's AJA button on page 13. Two leads: the song's Audio note in Planning Center says whose mic (\"V3\" or a name); without it, two leads, a lead not on the lineup are only flagged: a person decides.",
|
||||
start: "Every service Planning Center lists this week (Sunday and any special service: First / Together Tuesday...) has its Ableton set. Hold START on Monday: it saves last weekend's songs to Finished Songs, then builds each set from the newest weekend set (locators, tempos, Waves Tune cues, songs, markers, guide, lighting cues, pads, routing, in-ear sends). A song in another key is transposed and named here, to consolidate in Live; a song not in Finished Songs is named, to build by hand.",
|
||||
};
|
||||
async function readyKeyPanel(i, hold) {
|
||||
|
||||
@@ -948,6 +948,12 @@ class TestResiVox(unittest.TestCase):
|
||||
self.assertEqual(rd.resi_song(self.plan("Rosaliz lead"))["title"], "Name Above All Names")
|
||||
self.assertEqual(self.run_eval("Rosaliz lead", 2), ([], "VOX 2 ROSALIZ", 2))
|
||||
|
||||
def test_two_leads_the_audio_note_picks(self):
|
||||
"""User, 2026-10-25: with two people on a song, the Audio note in PCO says whose mic goes out."""
|
||||
self.assertEqual(self.run_eval("Mike and DJ lead\nRESI", 1, audio="V3"), (["RESI V1 NOT VOX 3"], "VOX 1 MIKE", 3))
|
||||
self.assertEqual(self.run_eval("Mike and DJ lead\nRESI", 3, audio="Resi: DJ"), ([], "VOX 3 DJ", 3))
|
||||
self.assertEqual(self.run_eval("Mike and DJ lead\nRESI", 3, audio="V2")[0], ["2 LEADS: MIKE DJ"]) # names neither of them
|
||||
|
||||
def test_what_is_not_switched_by_itself(self):
|
||||
self.assertEqual(self.run_eval("Mike and DJ lead", 1)[0], ["2 LEADS: MIKE DJ"]) # two leads: a person picks
|
||||
self.assertEqual(self.run_eval("Genesis lead", 4, audio="V2"), ([], "VOX 4 GENESIS", 4)) # the lineup counts, not the note
|
||||
|
||||
Reference in New Issue
Block a user