Scene-Aware Scopes (v2)
Audio-reactive scopes that know where the scene actually is
- audio
- scopes_mp4_path
The SIGNAL LOST aesthetic has those CRT scope visuals - the circular rings, the waveform, the frequency bars - that pulse with the audio. OTR_SceneAwareScopes is the v2 version of that, and the "scene-aware" part is the upgrade. The v1 scopes lived inside the procedural floor video, where they couldn't possibly know what scene was playing. This node renders the scopes late and additively - after the real per-beat clip plan exists - and draws them into the actual gutters: at the edges on landscape clips, in the center on the signal-lost gaps, suppressed on the credits tail.
The output is a scopes_only.mp4: green-only scopes on pure black, so it can be screened and lightened over the final video by OTR_PostUpscaleProcgenBlend's third input with zero generation loss. It renders its own silent encode (-an) because it doesn't carry audio - it only analyzes it.
How it works
The required clip_manifest_json comes from OTRVideoRenderBatch - the per-beat engine_id, start_s, and clip path. That manifest is where the portrait-vs-landscape aspect split first exists (HuMo portrait at 480×832 vs LTX/Wan landscape), which is exactly what the scopes have to adapt to. The optional audio input is for analysis only - per-frame RMS and spectrum - and is never decoded into the video; absent it, you get silent idle scopes (still drawn, just not pulsing).
The render is deterministic (stable-hash seeded RNG - a fix over the floor's old unseeded np.random) and honors a pair of invariants: 100% local, and green-only - it deliberately does not import the colored CRT constants. The retro color discipline is part of the look.
Output size defaults to 1920×1080 (out_w/out_h), ffmpeg is the shell-out binary, and landscape_bars (off default, bottom opt-in) adds the old-school green audio bars along the bottom of landscape clips - always below the caption safe-area.
Install and gotchas
Pack-level install (ComfyUI Manager → ComfyUI-OldTimeRadio, restart; v2.0-alpha). Needs ffmpeg on PATH and Pillow (a pack dependency). The one wiring rule: OTR_SignalLostVideo's draw_scopes should be set off when you use this node, or you get v1 scopes and v2 scopes fighting each other. And remember the manifest is a hard requirement - this node can't be scene-aware without the per-beat plan, so it refuses rather than guessing. Feed it an empty manifest and you'll get loud, not graceful.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_manifest_json | STRING | clip_manifest_json from OTRVideoRenderBatch (per-beat engine_id + start_s + path). | |
| audioopt | AUDIO | Master audio for analysis ONLY (never decoded into the video). Absent -> silent idle scopes. | |
| out_wopt | INT | 1920320–7680 | Scopes output width (px, even values). Profile/platform-owned; matches the final master canvas, not the render-tier canvas. |
| out_hopt | INT | 1080240–4320 | Scopes output height (px, even values). Profile/platform-owned -- see out_w. |
| ffmpegopt | STRING | ffmpeg | DEPRECATED and IGNORED (2026-09-04). A workflow value cannot name the binary this pack runs -- it arrives over an unauthenticated /prompt request. Set the OTR_FFMPEG environment variable to pin a build. |
| landscape_barsopt | COMBO | off | Optional old-school green audio bars along the bottom of landscape video (any engine). off = unchanged; captions always stay on top. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| scopes_mp4_path | STRING | — |