8 Commits
Author SHA1 Message Date
Ethanfel c4d7224118 Audio Wave: skip overlapping segment labels (readable when splits are close)
Labels crowded when splits are near each other. Now labels are shortened to S{n} and
skipped if within ~26px (canvas) / 30px (image) of the previous drawn label; notes gated
wider. Lines still drawn for every split.
2026-07-04 23:56:51 +02:00
EthanfelandClaude Opus 4.8 ea099ccac4 Audio Wave: segments = user splits only (721 groups are markers, not segments)
Per clarification: the 721 group lines are clip markers, NOT segments. Segments come
ONLY from user split points, numbered globally from 1 — so the first split is seg1, not
seg23. 0 splits = 0 segments; N splits = N segments (seg k = point k-1 .. split k, tail
after the last split excluded). group lines still drawn (bold) + used for the group#.
JS matches (segPoints/nSegs). Empty summary now prompts to add splits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 23:49:46 +02:00
EthanfelandClaude Opus 4.8 488afa0284 Audio Wave: correct model — 721 groups are hard splits, segments inside; range select; mirrored render; fix reload explosion
Rebuilt around the real model: group_frames (721) are HARD splits; segments = user
splits UNION the group lines, so a segment never crosses a group boundary (last segment
in a group ends exactly on frame 721). segment_select is now a RANGE string ('A-B' /
'N' / '' = all) that crops waveform_image + audio + summary to segments A..B. Render
rewritten: mirrored waveform (uses top+bottom), bold group grid, thin segment lines,
labels along the top and notes along the bottom, selected range shaded. JS: guards
frame values (0 -> default, fixing the 400+-segments-on-reload explosion), writes only
USER splits to segments_json, dblclick=add split / shift-click=remove / click=seek.
group number fixed (boundary rounding). Workflows + README updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 23:35:48 +02:00
EthanfelandClaude Opus 4.8 75b20f9656 Audio Wave: fixed 721-frame subsegment grid + per-segment select/crop + notes box auto-fill
Pivot to the user's model: segments are a fixed grid of subsegment_frames frames
(default 721 @ 24fps = one LTX clip), not arbitrary clicks. New inputs:
subsegment_frames (grid size) and segment_select (0=all, N=output ONLY chunk N —
crops waveform_image, AUDIO, and summary so you can generate/skip one beat at a time).
_render gains window-crop + frame markers + per-segment time/frame labels. JS rewritten:
draws the fixed grid, auto-fills the notes box with one segN: line per chunk (type or
dblclick to note), click-to-seek, playhead + time readout. Workflows updated for the
new widgets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 23:12:44 +02:00
EthanfelandClaude Opus 4.8 98d3520775 Drop the SxCP prefix from this pack's node names
SxCP is the Prompt-Builder pack's brand; these are Calibrator nodes. Renamed the
display names (cosmetic only — class_types unchanged, so no workflows/bridge break):
'External Prompt (Receptor)', 'Audio Prompt Guide', 'Audio Wave + Segments'; renamed
the JS extension id too. Kept the genuine Prompt-Builder (SxCP) references in the docs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:36:50 +02:00
EthanfelandClaude Opus 4.8 57b459b956 Add SxCP Audio Wave + Segments: interactive waveform node (upload/play/click-segments)
New node with a JS widget (web/audio_wave.js): upload an audio clip, play it, and click
the waveform to place segment boundaries (click add / drag move / dblclick note /
shift|right-click delete). Boundaries+notes serialize to a hidden segments_json that
drives Python segmentation (falls back to auto-split / notes syntax). Python node
(nodes/audio_wave_segments.py) loads the file (torchaudio/soundfile/librosa), builds
segments from the boundaries, and outputs waveform_image + audio_summary + AUDIO — same
contract as Audio Prompt Guide, so it feeds chat mode the same way. _attach_notes now
merges (keeps clicked notes). WEB_DIRECTORY re-enabled. JS is a first cut — needs testing
in ComfyUI (console logs on error); the Python node works standalone via segments_json/notes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:31:45 +02:00
EthanfelandClaude Opus 4.8 56f1a62616 Audio Prompt Guide: per-segment / per-time / global notes
The notes box now routes each line to a target: 'seg2: fast' (by number, also '2:'
/ 'S2:'), '10s-15s: drop' (by time range / '12.3s:'), or unprefixed = global. Segment
notes are attached to the matching segment in the summary (marked NOTE, overrides the
energy default) and drawn on the waveform image; time notes attach to overlapping
segments (strict end boundary); globals listed separately. README documents the syntax.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:09:43 +02:00
EthanfelandClaude Opus 4.8 6e6232d4ab Add SxCP Audio Prompt Guide node (audio -> waveform image + timing summary)
New node for audio-guided video prompts (LTX): takes a ComfyUI AUDIO clip + free-text
motion notes and outputs (1) a rendered energy-envelope IMAGE with beat/segment markers
so the vision model can see the audio shape, and (2) an audio_summary STRING with
duration, tempo/beats (librosa optional), per-segment energy + 8n+1-snapped frame counts
+ stage hints + the notes. Wire waveform_image -> Judge.reference_image and audio_summary
-> Judge.user_prompt (chat mode, json_output) for beat-aligned LTX JSON. librosa optional
(energy envelope + segments work without it). Registered in __init__; README workflow added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 22:02:12 +02:00