Nodes/Kinburg-Nodes/Siren (Music Sampler) 🧜
ComfyUI Node

Siren (Music Sampler) 🧜

Sampler for AceStep music latents, with the dials it actually needs on the node. 'steps' is the whole schedule and 'stage_b_steps' carves the tail off it, so cfg can be high while the lyrics and structure are decided and lower while the sound is finished. 'resume_from_sigma' is the retake dial β€” it resumes an existing take from a chosen noise level and derives the step count itself, so a retake costs proportionally less time. Wire a 'Siren Section' latent in and the retake applies to just that stretch of the track. A 'Sampler Settings' bundle can be wired to override the widgets, which is how a stored per-model recipe drives it. Reports the curve's midpoints (the only place 'shift' is visible), per-stage times and section coverage; 'gen_extra_info' feeds Generation Info's 'extra' input.

By KinburgΒ·Created 2 months agoΒ·Updated 3 days agoΒ· 1
Siren (Music Sampler) 🧜
  • model
  • positive
  • negative
  • latent_audio
  • section
  • sampler
  • sigmas
  • latent
  • report
  • gen_extra_info
  • time
  • seconds
β—„seed0β–Ί
β—„steps50β–Ί
β—„cfg6.0β–Ί
β—„sampler_nameeulerβ–Ί
β—„schedulersimpleβ–Ί
β—„stage_b_steps0β–Ί
β—„stage_b_cfg4.5β–Ί
β—„resume_from_sigma0.000β–Ί
β—„eta1.00β–Ί
β—„s_noise1.00β–Ί
β—„s_churn0.00β–Ί
β—„solver_typemidpointβ–Ί
β—„stage_b_samplerβ–Ύβ–Ί
β—„stage_b_schedulerβ–Ύβ–Ί
β—„stage_b_seed-1β–Ί
β—„verbosetrueβ–Ί
CategoryKinburg-Nodes/Bestiary/Siren

Inputs (23)

NameTypeDefaultDescription
modelMODELβ€”
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
latent_audioLATENTThe audio latent to sample. Straight from 'Empty Ace Step 1.5 Latent Audio' for a fresh track, or through a 'Siren Section' node to regenerate only part of an existing take.
seedINT00–18446744073709550000Noise seed. NOTE this is NOT the seed that decides the song: the musical idea comes from the audio-codes LLM inside TextEncodeAceStepAudio1.5, which has its OWN seed. Change that one for a different piece; change this one for a different noise draw of the same piece. When comparing settings, hold both fixed β€” otherwise you're comparing two different tracks.
stepsINT501–10000Length of the WHOLE schedule. 50 is the shipped default for acestep_v1.5_xl_base / _sft; the turbo variants want 8. 'stage_b_steps' is carved out of this number, not added to it β€” 50 with stage_b_steps 10 means 40 + 10, so you never add the stages up by hand.
cfgFLOAT6.00–100Guidance for stage A. Shipped defaults: 6.0 for xl_base, 7.0 for xl_sft, and 1.0 for the turbo variants. On AceStep this is a trade, not a quality dial: high cfg locks the lyrics and the structure but squeezes the sound, low cfg lets the timbre breathe but slurs the words. At exactly 1.0 the unconditional pass is skipped entirely, so the negative input stops doing anything at all.
sampler_nameCOMBOeuler'euler' is what every shipped AceStep 1.5 template uses. An ancestral / SDE sampler adds variety, but its extra noise on the tail is audible as hiss β€” if you want one, put it on stage A and finish on a deterministic sampler via 'stage_b_sampler'.
schedulerCOMBOsimple'simple' is the shipped default for AceStep 1.5. One schedule is built for the whole run, so this applies to every stage.
stage_b_stepsINT00–10000How many of the 'steps' the SECOND stage takes, off the tail. 0 = a single stage (start here). Two stages exist for one reason: cfg can be high while the lyrics and structure are being decided and lower while the sound is being finished. AceStep's schedule is heavily top-loaded (with shift 3.0 the halfway step is still at sigma 0.750), so the boundary has to be LATE to land in polishing territory β€” out of 50 steps, 10 puts it at sigma 0.429 and 15 at 0.562. Much earlier and the second stage starts rewriting the arrangement instead. Ignored when a section is marked β€” see the tooltip on 'resume_from_sigma'.
stage_b_cfgFLOAT4.50–100Guidance for the second stage. Lower than 'cfg' is the point β€” try 4.5 against a stage-A 6.0. Ignored when 'stage_b_steps' is 0.
resume_from_sigmaFLOAT0.0000–10 = off: start from pure noise, i.e. a fresh take. Above 0: RESUME an existing take from this noise level instead β€” the whole track, or only the marked stretch when a Siren Section is wired. This is the retake dial, and it replaces fiddling with 'denoise': the step count is derived for you, so the run walks exactly the tail of the native schedule and takes proportionally less time. On a 50-step curve at shift 3.0: 0.43 β†’ tidy up the performance, groove intact (10 steps) 0.51 β†’ same musical idea, different performance (12) 0.56 β†’ noticeably different take (14) 0.71 β†’ almost a new section (22) 1.00 β†’ completely new (50) The scale is not linear in how much survives β€” the report prints the step it landed on. Needs something to resume FROM: on an empty latent it only weakens the start, which the node warns about.
etaFLOAT1.000–100Stochasticity for ancestral / SDE samplers. NO effect on 'euler' or other deterministic samplers, which is what AceStep normally runs.
s_noiseFLOAT1.000–100Multiplier on the noise added at stochastic steps. Ancestral / SDE / churn samplers only.
s_churnFLOAT0.000–100Re-injects noise into otherwise deterministic samplers (euler, heun, dpm_2). 0 = off, which is what the AceStep templates use.
solver_typeCOMBOmidpointSolver variant for the samplers that have one. A value from the wrong family is ignored (noted in the console) rather than breaking the run, so this can't hurt.
stage_b_samplerCOMBOLet the second stage use a different sampler. The useful case: an ancestral sampler on stage A for variety, then a deterministic one here so the tail doesn't come out hissy.
stage_b_schedulerCOMBOLet the second stage walk a different scheduler's shape over its part of the run β€” e.g. 'simple' to lay down the structure and 'beta' to spend the tail differently. One curve is still shared, so this can't just be swapped in: the alternate scheduler is rebuilt over the same length, its tail sliced out, and its first sigma PINNED to the level the latent actually carries at the handoff (a mismatch there is what produces classic 'refiner seam' artifacts), then forced monotonic. Same splice Chimera does. The report says when it happened.
stage_b_seedINT-1-1–18446744073709550000Separate noise seed for the second stage. -1 = use stage A's. It only does something when 'stage_b_sampler' is ancestral or SDE: a continuing stage adds NO fresh noise to the latent, so the seed reaches nothing but the stochastic samplers' own internal noise generator. With euler it is inert. In a RETAKE (a section mask) the rule is different β€” there only one stage runs anyway, and it draws its own noise from stage A's seed.
verboseBOOLEANtruePrint the report (curve landmarks, stages, section coverage, warnings) to the console. The same text is always on the 'report' output.
sectionoptKINBURG_SIREN_SECTIONOutput of a 'Siren Section' node β€” informational here (it feeds the report and 'gen_extra_info'). What actually drives the sampling is the mask that node writes into the LATENT, so the input that matters is 'latent_audio'. Wiring this while forgetting the latent is a mistake the node warns about.
sampleroptKINBURG_SAMPLER_CFGOptional 'Sampler Settings' bundle (or a chain of them, or a recipe out of the model library's Settings Select / Model Select). While wired it REPLACES this node's own sampling widgets β€” steps, cfg, samplers, scheduler and the stage split all come from the bundle, and the report says so. Use it to drive Siren from a stored per-model recipe. For everything else the widgets are simpler: they can't disagree with themselves, and they drop the dials that do nothing here ('seed_mode' / 'seed_step' are Ouroboros loop controls, and a later stage's 'denoise' and 'scheduler' are ignored because one schedule is shared).
sigmasoptSIGMASExternal noise schedule, replacing the one this node builds: 'steps', 'scheduler' and any stage denoise are then ignored, though the stages' step counts still decide how the curve is split between them. 'resume_from_sigma' still applies on top.

Outputs (5)

NameTypeDescription
latentLATENTβ€”
reportSTRINGβ€”
gen_extra_infoGEN_INFOβ€”
timeSTRINGβ€”
secondsFLOATβ€”