Generated reference · ComfyUI workflow · Audio & music

Song Section

Section renderer for the song ledger (hook-first pipeline): ACE-Step 1.5 turbo renders one section under explicit bpm/key/time-signature locks, optionally timbre-conditioned on the approved hook via the core ReferenceTimbreAudio node - the …

Audio & music12nodesGPU A6000out audio~90sv1.0.0

On this page

Section renderer for the song ledger (hook-first pipeline): ACE-Step 1.5 turbo renders one section under explicit bpm/key/time-signature locks, optionally timbre-conditioned on the approved hook via the core ReferenceTimbreAudio node - the arrangement stage never drifts away from the audited hook's sound

12Graph nodes
12Node classes
9Inputs
1Models

Tags: audiomusicsong-sectionhook-firstace-step2026-sota

Inputs (9)#

The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.

promptstringrequired
Section description tags (instrumentation, mood, arrangement density)
lyricsstringdefault
Section lyrics; empty for instrumental sections
bpmintegerdefault 92min 40max 220
Tempo lock (the song ledger's per-section bpm)
keyscalestringdefault C major
Key lock, e.g. 'C major' or 'E minor' (template-confirmed free string)
time_signaturestringdefault 4
Time-signature lock (ACE numeric convention, e.g. '4' for 4/4, '3' for 3/4)
duration_secondsintegerdefault 24min 8max 120
Section length
use_hook_referencebooleandefault false
Timbre-condition this section on the approved hook audio (requires hook_audio)
hook_audiostring
Uploaded hook audio filename (the winning hook's mix)
seedintegerdefault -1
Random seed (-1 for random)

ComfyUI node graph (12)#

The executable ComfyUI prompt graph: 12 nodes across 12 distinct node classes, wired by 15 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.

flowchart TD n0["1: CheckpointLoaderSimple"] n1["2: TextEncodeAceStepAudio1.5"] n2["3: ConditioningZeroOut"] n3["hook_load: LoadAudio"] n4["hook_encode: VAEEncodeAudio"] n5["hook_timbre: ReferenceTimbreAudio"] n6["4: EmptyAceStep1.5LatentAudio"] n7["5: ModelSamplingAuraFlow"] n8["6: KSampler"] n9["7: VAEDecodeAudio"] n10["8: AudioLimiter"] n11["9: SaveAudioMP3"] n0 -->|clip| n1 n1 -->|conditioning| n2 n3 -->|audio| n4 n0 -->|vae| n4 n1 -->|conditioning| n5 n4 -->|latent| n5 n0 -->|model| n7 n7 -->|model| n8 n5 -->|positive| n8 n2 -->|negative| n8 n6 -->|latent_image| n8 n8 -->|samples| n9 n0 -->|vae| n9 n9 -->|audio| n10 n10 -->|audio| n11 classDef custom fill:#12b886,stroke:#0b6b4f,color:#04110c; class n10 custom;
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (12)#

1CheckpointLoaderSimplecore
ckpt_name = ace_step_1.5_turbo_aio.safetensors
outputs: MODELCLIPVAE
2TextEncodeAceStepAudio1.5core
clip = ◂ node 1 · out[1]tags = {{prompt}} tmpllyrics = {{lyrics}} tmplseed = {{seed}} tmplbpm = {{bpm}} tmplduration = {{duration_seconds}} tmpltimesignature = {{time_signature}} tmpllanguage = enkeyscale = {{keyscale}} tmpl
outputs: CONDITIONING
3ConditioningZeroOutcore
conditioning = ◂ node 2 · out[0]
outputs: CONDITIONING
hook_loadLoadAudiocore
audio = {{hook_audio}} tmpl
outputs: AUDIO
hook_encodeVAEEncodeAudiocore
audio = ◂ node hook_load · out[0]vae = ◂ node 1 · out[2]
outputs: LATENT
hook_timbreReferenceTimbreAudiocore
conditioning = ◂ node 2 · out[0]latent = ◂ node hook_encode · out[0]
outputs: CONDITIONING
4EmptyAceStep1.5LatentAudiocore
seconds = {{duration_seconds}} tmplbatch_size = 1
outputs: LATENT
5ModelSamplingAuraFlowcore
model = ◂ node 1 · out[0]shift = 3.0
outputs: MODEL
6KSamplercore
model = ◂ node 5 · out[0]positive = ◂ node hook_timbre · out[0]negative = ◂ node 3 · out[0]latent_image = ◂ node 4 · out[0]seed = {{seed}} tmplsteps = 8cfg = 1.0sampler_name = eulerscheduler = simpledenoise = 1.0
outputs: LATENT
7VAEDecodeAudiocore
samples = ◂ node 6 · out[0]vae = ◂ node 1 · out[2]
outputs: AUDIO
8AudioLimitercustom pack
audio = ◂ node 7 · out[0]ceiling_db = -1.0
outputs: AUDIO
9SaveAudioMP3core
audio = ◂ node 8 · out[0]filename_prefix = song_sectionquality = V0

Models & dependencies#

Custom node packs (1)#

The non-core ComfyUI node classes this graph requires; the RunPod worker image the workflow runs on must bake or install a pack that provides every one of them.

AudioLimiter

Models required (1)#

ace_step_1.5_turbo_aio.safetensors

Output contract#

What a successful run of this workflow returns.

type
audio
format
mp3
codec
pcm_s16le
channels
2
description
Song-ledger section master render
audio_package
{"mixdown": {"artifact_id": "audio_mixdown", "path_template": "audio/{{job_id}}/mixdown/section-master.wav", "format": "wav", "sample_rate_hz": 48000, "bit_depth": 24, "channels": 2, "codec": "pcm_s24le"}, "loudness": {"artifact_id": "loudness_report", "path_template": "audio/{{job_id}}/analysis/loudness-report.json", "format": "json", "standard": "spotify", "target_integrated_lufs": -14, "max_true_peak_dbtp": -1}, "compliance": {"artifact_id": "audio_compliance_report", "path_template": "audio/{{job_id}}/analysis/audio-compliance-report.json", "format": "json", "loudness_tolerance_lufs": 1.0, "true_peak_tolerance_dbtp": 0.3, "max_clipping_percent": 0.1, "enforce_format_normalization": true}, "cue_sheet": {"artifact_id": "cue_sheet", "path_template": "audio/{{job_id}}/metadata/cue-sheet.csv", "format": "csv", "include_timecode": true, "include_beat_markers": true, "include_sections": true}}

Taxonomy & routing#

How the control plane classifies this workflow — from the committed workflow-taxonomy-registry.json. It drives the consistency / control surface the agentic director can exercise over the workflow.

assetFamily
song-ledger-section
outputPackageProfile
audio-master-profile
controlModalities
sampler-scheduler-lockseed-lockmodel-lockreference-ensemble
consistencyDimensions
color-scriptmotion
notes
M2/M3 execution vehicle: section render under song-ledger locks; use_hook_reference locks timbre on the approved hook via core ReferenceTimbreAudio + VAEEncodeAudio.