Nodes/Kinburg-Nodes/Siren Section (Audio Window) 🧜
ComfyUI Node

Siren Section (Audio Window) 🧜

Regenerate Just the Bad 15 Seconds of a Song β€” Siren Section Marks the Window

By KinburgΒ·Created 3 months agoΒ·Updated 6 days agoΒ· 1
Siren Section (Audio Window) 🧜
  • latent
  • section
  • vae
  • latent
  • section
  • report
β—„moderetakeβ–Ί
β—„start_sec0.00β–Ί
β—„end_sec0.00β–Ί
β—„extend_sec15.00β–Ί
β—„extend_atendβ–Ί
β—„fade_sec0.35β–Ί
β—„snapbarβ–Ί
β—„bpm120β–Ί
β—„beats_per_bar4β–Ί
β—„grid_origin_sec0.00β–Ί
β—„latent_fps25.00β–Ί

An ACE-Step audio latent is a one-dimensional strip of time - [B, 64, T], one frame per 40ms. That single fact is what a generic latent sampler can't exploit: regenerate the whole strip or nothing. Siren Section is the scalpel. It marks a stretch of the latent as the part to redo - a section retake - or grows the latent to extend the track, and it does it in seconds on a clock rather than in cryptic frame indices.

Same family as "inpaint just the face" on the image side, except the mask is temporal: name a window in time, and everything else in the take stays exactly as it was.

The two modes

  • retake - mark start_secβ†’end_sec as free to regenerate; the latent's length doesn't change. end_sec = 0 means "to the end of the track," which is the move for redo everything from the last chorus on.
  • extend - grow the latent by extend_sec at the start or the end, and mark only the new part as free. The existing take is frozen but still visible to the model - attention runs over the whole strip - so the new part is written to follow on from it. Note the tooltip's warning: the duration you gave TextEncodeAceStepAudio1.5 is baked into the tokens, so after extending you should raise it to match.

What actually matters

  • snap - quantize the edges to the musical grid built from bpm / beats_per_bar. One bar at 120bpm in 4/4 is exactly 2 seconds = 50 latent frames. Replacing a section that starts mid-bar is the usual reason a retake refuses to sit in the groove. Use the same bpm you gave TextEncodeAceStepAudio1.5, or snapping just quantizes to nothing.
  • fade_sec - the crossfade. This isn't cosmetic: in an image a hard mask edge is a visible line, in audio it's an audible click. 0.2–0.5s is the sweet spot. The ramp lies outside the window, so the range you named is rewritten in full and the join is spread into the neighbours.
  • vae (optional) - wire the audio VAE and the frame rate is read from the model itself instead of trusting latent_fps. Recommended - it also covers ACE-Step 1.0, which runs at a different rate than 1.5.
  • section (optional) - chain several Section nodes to mark several windows at once; overlapping windows merge and the mask is rebuilt over all of them.

The mask goes into the latent's standard noise_mask, so the latent output also works with the stock samplers - you don't need Siren's own sampler to use this. Which is nice, because the retake rule applies either way: with a section marked, exactly one sampling stage can run, and a masked run has to finish at sigma 0. Set stage_b_steps to 0 on Siren's sampler for retakes.

Install & gotchas

Part of the Kinburg-Nodes pack. ComfyUI Manager (search "Kinburg-Nodes"), or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes, then restart. No extra deps for this node - it needs nothing beyond ComfyUI and the ACE-Step model itself.

Decode the take once and listen before you mark a retake - knowing where the bad section actually sits is half the job. Outputs: latent (feed back to the sampler), section (chain it), and report (what window it marked, what it snapped, every warning). If your join still clicks, check that fade_sec isn't 0 and that you extended before marking a retake later in the chain - extending at the start shifts everything after it, which is deliberate: their timings stay on the music.

CategoryKinburg-Nodes/Bestiary/Siren

Inputs (14)

NameTypeDefaultDescription
latentLATENTThe audio latent to mark up. For a RETAKE this is the latent of a take you already have (decode it once to hear where the section you want to replace actually sits); for EXTEND it is the take to grow.
modeCOMBOretakeβ€’ retake β€” mark the stretch between 'start_sec' and 'end_sec' as free to regenerate; everything else is frozen. The latent's length does not change. β€’ extend β€” GROW the latent by 'extend_sec' seconds and mark only the new part as free. The existing take is frozen but still visible to the model (attention runs over the whole strip), so the new part is written to follow on from it.
start_secFLOAT0.000–2000'retake' only: where the section starts, in seconds from the top of the track.
end_secFLOAT0.000–2000'retake' only: where the section ends, in seconds. 0 = run to the end of the track (handy for 'redo everything from the last chorus on').
extend_secFLOAT15.000–2000'extend' only: how many seconds to add. IMPORTANT: the 'duration' you gave TextEncodeAceStepAudio1.5 describes the WHOLE track and is baked into the tokens, so after extending you should raise it to the new total and re-encode β€” otherwise the model is being told the song is shorter than the strip it is writing on. The sampler prints the new length so you have the number to enter.
extend_atCOMBOend'extend' only: which end to grow. 'start' prepends (an intro) and shifts every section marked earlier in the chain later by the same amount, so their timings stay on the music.
fade_secFLOAT0.350–10Crossfade at each edge of the section, in seconds. The ramp lies OUTSIDE the window, so the range you named is rewritten in full and the join is spread into the neighbouring audio. This is the difference between a seamless replacement and an audible CLICK: in an image a hard mask edge is just a visible line, in audio it is a transient. 0.2-0.5 s is a good range; 0 for a hard cut.
snapCOMBObarQuantize the section's edges to the musical grid built from 'bpm' / 'beats_per_bar'. β€’ bar (recommended) β€” cut on the bar line. Replacing a section that starts mid-bar is the usual reason a retake refuses to sit in the groove. β€’ beat β€” finer, for fills and pickups. β€’ off β€” exactly the seconds you typed.
bpmINT1200–300Tempo for the snap grid β€” use the same value you gave TextEncodeAceStepAudio1.5. 0 disables snapping regardless of the 'snap' setting.
beats_per_barINT41–16Beats per bar for the snap grid (the 'timesignature' on TextEncodeAceStepAudio1.5). One bar at 120 bpm in 4/4 is 2 s = exactly 50 latent frames.
grid_origin_secFLOAT0.000–2000Where bar 1 begins, in seconds. Leave at 0 unless the track opens with a pickup or a bit of silence β€” then the grid is offset from the file start and snapping to 0 would land between bars.
latent_fpsFLOAT25.001–1000Latent frames per second, used to turn seconds into frame indices. 25 is correct for AceStep 1.5 (the VAE maps one frame to 1920 samples at 48 kHz = 40 ms). Wire the 'vae' input instead of touching this β€” it reads the true rate from the model and covers AceStep 1.0, which is different.
sectionoptKINBURG_SIREN_SECTIONWire a PREVIOUS Siren Section here to chain them β€” several sections marked at once (two retakes, or an extend plus a retake of the tail). Each node adds its own window and rebuilds the mask over all of them, so overlapping windows merge cleanly.
vaeoptVAEThe audio VAE, used ONLY to read the true latent frame rate (sample rate Γ· samples per frame) instead of trusting 'latent_fps'. Nothing is encoded or decoded here. Recommended: it makes the seconds exact on any audio model.

Outputs (3)

NameTypeDescription
latentLATENTβ€”
sectionKINBURG_SIREN_SECTIONβ€”
reportSTRINGβ€”