{
  "config": {},
  "extra": {
    "VHS_KeepIntermediate": true,
    "VHS_MetadataImage": true,
    "VHS_latentpreview": false,
    "VHS_latentpreviewrate": 0,
    "ds": {
      "offset": [
        1276.3348183999904,
        1316.4990758496092
      ],
      "scale": 0.46650738020973354
    },
    "frontendVersion": "1.45.15",
    "linearData": {
      "inputs": [
        [
          "94",
          "tags",
          {
            "height": 115
          }
        ],
        [
          "128",
          "value"
        ],
        [
          "129",
          "value"
        ],
        [
          "94",
          "keyscale"
        ],
        [
          "112",
          "value",
          {
            "height": 121
          }
        ],
        [
          "115",
          "sampling_mode.seed"
        ],
        [
          "117",
          "value"
        ]
      ],
      "outputs": [
        "119",
        "111"
      ]
    },
    "linearMode": true,
    "workflowRendererVersion": "LG"
  },
  "groups": [
    {
      "bounding": [
        -210,
        -950,
        440,
        640
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 1,
      "title": "Model"
    },
    {
      "bounding": [
        260,
        -950,
        640,
        960
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 3,
      "title": "Prompt"
    },
    {
      "bounding": [
        -2720,
        -950,
        2450,
        1142
      ],
      "color": "#88537f",
      "flags": {},
      "id": 4,
      "title": "Lyrics Generation (auto + BPM/duration aware)"
    }
  ],
  "id": "88ac5dad-efd7-40bb-84fe-fbaefdee1fa9",
  "last_link_id": 288,
  "last_node_id": 132,
  "links": [
    [
      119,
      47,
      0,
      3,
      2,
      "CONDITIONING"
    ],
    [
      175,
      78,
      0,
      3,
      0,
      "MODEL"
    ],
    [
      249,
      98,
      0,
      3,
      3,
      "LATENT"
    ],
    [
      254,
      94,
      0,
      3,
      1,
      "CONDITIONING"
    ],
    [
      255,
      94,
      0,
      47,
      0,
      "CONDITIONING"
    ],
    [
      256,
      3,
      0,
      18,
      0,
      "LATENT"
    ],
    [
      260,
      104,
      0,
      78,
      0,
      "MODEL"
    ],
    [
      261,
      105,
      0,
      94,
      0,
      "CLIP"
    ],
    [
      262,
      106,
      0,
      18,
      1,
      "VAE"
    ],
    [
      266,
      18,
      0,
      111,
      0,
      "AUDIO"
    ],
    [
      267,
      112,
      0,
      114,
      2,
      "STRING"
    ],
    [
      268,
      113,
      0,
      115,
      0,
      "CLIP"
    ],
    [
      269,
      114,
      0,
      131,
      0,
      "STRING"
    ],
    [
      270,
      115,
      0,
      116,
      1,
      "STRING"
    ],
    [
      271,
      117,
      0,
      116,
      0,
      "STRING"
    ],
    [
      273,
      116,
      0,
      94,
      2,
      "STRING"
    ],
    [
      275,
      117,
      0,
      121,
      0,
      "STRING"
    ],
    [
      276,
      121,
      0,
      116,
      2,
      "BOOLEAN"
    ],
    [
      278,
      116,
      0,
      119,
      0,
      "STRING"
    ],
    [
      280,
      128,
      0,
      94,
      5,
      "FLOAT"
    ],
    [
      281,
      128,
      0,
      98,
      0,
      "FLOAT"
    ],
    [
      282,
      129,
      0,
      94,
      4,
      "INT"
    ],
    [
      283,
      129,
      0,
      127,
      0,
      "INT"
    ],
    [
      284,
      128,
      0,
      130,
      0,
      "FLOAT"
    ],
    [
      285,
      131,
      0,
      132,
      0,
      "STRING"
    ],
    [
      286,
      132,
      0,
      115,
      4,
      "STRING"
    ],
    [
      287,
      130,
      0,
      131,
      2,
      "STRING"
    ],
    [
      288,
      127,
      0,
      132,
      2,
      "STRING"
    ]
  ],
  "nodes": [
    {
      "flags": {},
      "id": 104,
      "inputs": [
        {
          "link": null,
          "localized_name": "unet_name",
          "name": "unet_name",
          "type": "COMBO",
          "widget": {
            "name": "unet_name"
          }
        },
        {
          "link": null,
          "localized_name": "weight_dtype",
          "name": "weight_dtype",
          "type": "COMBO",
          "widget": {
            "name": "weight_dtype"
          }
        }
      ],
      "mode": 0,
      "order": 0,
      "outputs": [
        {
          "links": [
            260
          ],
          "localized_name": "MODEL",
          "name": "MODEL",
          "type": "MODEL"
        }
      ],
      "pos": [
        -190,
        -880
      ],
      "properties": {
        "Node name for S&R": "UNETLoader",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "models": [
          {
            "directory": "diffusion_models",
            "name": "acestep_v1.5_xl_turbo_bf16.safetensors",
            "url": "https://huggingface.co/Comfy-Org/ace_step_1.5_ComfyUI_files/resolve/main/split_files/diffusion_models/acestep_v1.5_xl_turbo_bf16.safetensors"
          }
        ],
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        380,
        120
      ],
      "type": "UNETLoader",
      "widgets_values": [
        "acestep_v1.5_xl_turbo_bf16.safetensors",
        "default"
      ]
    },
    {
      "flags": {},
      "id": 106,
      "inputs": [
        {
          "link": null,
          "localized_name": "vae_name",
          "name": "vae_name",
          "type": "COMBO",
          "widget": {
            "name": "vae_name"
          }
        }
      ],
      "mode": 0,
      "order": 1,
      "outputs": [
        {
          "links": [
            262
          ],
          "localized_name": "VAE",
          "name": "VAE",
          "type": "VAE"
        }
      ],
      "pos": [
        -190,
        -440
      ],
      "properties": {
        "Node name for S&R": "VAELoader",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "models": [
          {
            "directory": "vae",
            "name": "ace_1.5_vae.safetensors",
            "url": "https://huggingface.co/Comfy-Org/ace_step_1.5_ComfyUI_files/resolve/main/split_files/vae/ace_1.5_vae.safetensors"
          }
        ],
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        380,
        110
      ],
      "type": "VAELoader",
      "widgets_values": [
        "ace_1.5_vae.safetensors"
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 98,
      "inputs": [
        {
          "link": 281,
          "localized_name": "seconds",
          "name": "seconds",
          "type": "FLOAT",
          "widget": {
            "name": "seconds"
          }
        },
        {
          "link": null,
          "localized_name": "batch_size",
          "name": "batch_size",
          "type": "INT",
          "widget": {
            "name": "batch_size"
          }
        }
      ],
      "mode": 0,
      "order": 12,
      "outputs": [
        {
          "links": [
            249
          ],
          "localized_name": "LATENT",
          "name": "LATENT",
          "type": "LATENT"
        }
      ],
      "pos": [
        280,
        -40
      ],
      "properties": {
        "Node name for S&R": "EmptyAceStep1.5LatentAudio",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        271,
        8
      ],
      "type": "EmptyAceStep1.5LatentAudio",
      "widgets_values": [
        120,
        1
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 47,
      "inputs": [
        {
          "link": 255,
          "localized_name": "conditioning",
          "name": "conditioning",
          "type": "CONDITIONING"
        }
      ],
      "mode": 0,
      "order": 21,
      "outputs": [
        {
          "links": [
            119
          ],
          "localized_name": "CONDITIONING",
          "name": "CONDITIONING",
          "type": "CONDITIONING"
        }
      ],
      "pos": [
        640,
        -40
      ],
      "properties": {
        "Node name for S&R": "ConditioningZeroOut",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        225,
        8
      ],
      "type": "ConditioningZeroOut",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 3,
      "inputs": [
        {
          "link": 175,
          "localized_name": "model",
          "name": "model",
          "type": "MODEL"
        },
        {
          "link": 254,
          "localized_name": "positive",
          "name": "positive",
          "type": "CONDITIONING"
        },
        {
          "link": 119,
          "localized_name": "negative",
          "name": "negative",
          "type": "CONDITIONING"
        },
        {
          "link": 249,
          "localized_name": "latent_image",
          "name": "latent_image",
          "type": "LATENT"
        },
        {
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        },
        {
          "link": null,
          "localized_name": "steps",
          "name": "steps",
          "type": "INT",
          "widget": {
            "name": "steps"
          }
        },
        {
          "link": null,
          "localized_name": "cfg",
          "name": "cfg",
          "type": "FLOAT",
          "widget": {
            "name": "cfg"
          }
        },
        {
          "link": null,
          "localized_name": "sampler_name",
          "name": "sampler_name",
          "type": "COMBO",
          "widget": {
            "name": "sampler_name"
          }
        },
        {
          "link": null,
          "localized_name": "scheduler",
          "name": "scheduler",
          "type": "COMBO",
          "widget": {
            "name": "scheduler"
          }
        },
        {
          "link": null,
          "localized_name": "denoise",
          "name": "denoise",
          "type": "FLOAT",
          "widget": {
            "name": "denoise"
          }
        }
      ],
      "mode": 0,
      "order": 22,
      "outputs": [
        {
          "links": [
            256
          ],
          "localized_name": "LATENT",
          "name": "LATENT",
          "slot_index": 0,
          "type": "LATENT"
        }
      ],
      "pos": [
        930,
        -670
      ],
      "properties": {
        "Node name for S&R": "KSampler",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        330,
        376
      ],
      "type": "KSampler",
      "widgets_values": [
        0,
        "fixed",
        12,
        1,
        "euler",
        "simple",
        1
      ]
    },
    {
      "flags": {},
      "id": 78,
      "inputs": [
        {
          "link": 260,
          "localized_name": "model",
          "name": "model",
          "type": "MODEL"
        },
        {
          "link": null,
          "localized_name": "shift",
          "name": "shift",
          "type": "FLOAT",
          "widget": {
            "name": "shift"
          }
        }
      ],
      "mode": 0,
      "order": 9,
      "outputs": [
        {
          "links": [
            175
          ],
          "localized_name": "MODEL",
          "name": "MODEL",
          "type": "MODEL"
        }
      ],
      "pos": [
        930,
        -860
      ],
      "properties": {
        "Node name for S&R": "ModelSamplingAuraFlow",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        330,
        80
      ],
      "type": "ModelSamplingAuraFlow",
      "widgets_values": [
        3
      ]
    },
    {
      "flags": {},
      "id": 18,
      "inputs": [
        {
          "link": 256,
          "localized_name": "samples",
          "name": "samples",
          "type": "LATENT"
        },
        {
          "link": 262,
          "localized_name": "vae",
          "name": "vae",
          "type": "VAE"
        }
      ],
      "mode": 0,
      "order": 23,
      "outputs": [
        {
          "links": [
            266
          ],
          "localized_name": "AUDIO",
          "name": "AUDIO",
          "type": "AUDIO"
        }
      ],
      "pos": [
        1320,
        -860
      ],
      "properties": {
        "Node name for S&R": "VAEDecodeAudio",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        230,
        100
      ],
      "type": "VAEDecodeAudio",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 105,
      "inputs": [
        {
          "link": null,
          "localized_name": "clip_name1",
          "name": "clip_name1",
          "type": "COMBO",
          "widget": {
            "name": "clip_name1"
          }
        },
        {
          "link": null,
          "localized_name": "clip_name2",
          "name": "clip_name2",
          "type": "COMBO",
          "widget": {
            "name": "clip_name2"
          }
        },
        {
          "link": null,
          "localized_name": "type",
          "name": "type",
          "type": "COMBO",
          "widget": {
            "name": "type"
          }
        },
        {
          "link": null,
          "localized_name": "device",
          "name": "device",
          "shape": 7,
          "type": "COMBO",
          "widget": {
            "name": "device"
          }
        }
      ],
      "mode": 0,
      "order": 2,
      "outputs": [
        {
          "links": [
            261
          ],
          "localized_name": "CLIP",
          "name": "CLIP",
          "type": "CLIP"
        }
      ],
      "pos": [
        -190,
        -690
      ],
      "properties": {
        "Node name for S&R": "DualCLIPLoader",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "models": [
          {
            "directory": "text_encoders",
            "name": "qwen_0.6b_ace15.safetensors",
            "url": "https://huggingface.co/Comfy-Org/ace_step_1.5_ComfyUI_files/resolve/main/split_files/text_encoders/qwen_0.6b_ace15.safetensors"
          },
          {
            "directory": "text_encoders",
            "name": "qwen_4b_ace15.safetensors",
            "url": "https://huggingface.co/Comfy-Org/ace_step_1.5_ComfyUI_files/resolve/main/split_files/text_encoders/qwen_4b_ace15.safetensors"
          }
        ],
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        380,
        180
      ],
      "type": "DualCLIPLoader",
      "widgets_values": [
        "qwen_0.6b_ace15.safetensors",
        "qwen_4b_ace15.safetensors",
        "ace",
        "default"
      ]
    },
    {
      "flags": {},
      "id": 94,
      "inputs": [
        {
          "link": 261,
          "localized_name": "clip",
          "name": "clip",
          "type": "CLIP"
        },
        {
          "label": "Song Tags",
          "link": null,
          "localized_name": "tags",
          "name": "tags",
          "type": "STRING",
          "widget": {
            "name": "tags"
          }
        },
        {
          "link": 273,
          "localized_name": "lyrics",
          "name": "lyrics",
          "type": "STRING",
          "widget": {
            "name": "lyrics"
          }
        },
        {
          "label": "Song Seed (change to generate new song)",
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        },
        {
          "link": 282,
          "localized_name": "bpm",
          "name": "bpm",
          "type": "INT",
          "widget": {
            "name": "bpm"
          }
        },
        {
          "link": 280,
          "localized_name": "duration",
          "name": "duration",
          "type": "FLOAT",
          "widget": {
            "name": "duration"
          }
        },
        {
          "link": null,
          "localized_name": "timesignature",
          "name": "timesignature",
          "type": "COMBO",
          "widget": {
            "name": "timesignature"
          }
        },
        {
          "link": null,
          "localized_name": "language",
          "name": "language",
          "type": "COMBO",
          "widget": {
            "name": "language"
          }
        },
        {
          "label": "Keyscale",
          "link": null,
          "localized_name": "keyscale",
          "name": "keyscale",
          "type": "COMBO",
          "widget": {
            "name": "keyscale"
          }
        },
        {
          "link": null,
          "localized_name": "generate_audio_codes",
          "name": "generate_audio_codes",
          "type": "BOOLEAN",
          "widget": {
            "name": "generate_audio_codes"
          }
        },
        {
          "link": null,
          "localized_name": "cfg_scale",
          "name": "cfg_scale",
          "type": "FLOAT",
          "widget": {
            "name": "cfg_scale"
          }
        },
        {
          "link": null,
          "localized_name": "temperature",
          "name": "temperature",
          "type": "FLOAT",
          "widget": {
            "name": "temperature"
          }
        },
        {
          "link": null,
          "localized_name": "top_p",
          "name": "top_p",
          "type": "FLOAT",
          "widget": {
            "name": "top_p"
          }
        },
        {
          "link": null,
          "localized_name": "top_k",
          "name": "top_k",
          "type": "INT",
          "widget": {
            "name": "top_k"
          }
        },
        {
          "link": null,
          "localized_name": "min_p",
          "name": "min_p",
          "type": "FLOAT",
          "widget": {
            "name": "min_p"
          }
        }
      ],
      "mode": 0,
      "order": 19,
      "outputs": [
        {
          "links": [
            254,
            255
          ],
          "localized_name": "CONDITIONING",
          "name": "CONDITIONING",
          "type": "CONDITIONING"
        }
      ],
      "pos": [
        290,
        -860
      ],
      "properties": {
        "Node name for S&R": "TextEncodeAceStepAudio1.5",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.11.1"
      },
      "size": [
        570,
        700
      ],
      "type": "TextEncodeAceStepAudio1.5",
      "widgets_values": [
        "Lo-fi hip-hop chill track with mellow electric piano, soft vinyl crackle, subtle synth pads, low-pass filtered drums, percussion loops, and soft plucked bass for a relaxed, dreamy vibe.",
        "",
        1103026267678031,
        "randomize",
        95,
        120,
        "4",
        "en",
        "E minor",
        true,
        2,
        0.85,
        0.9,
        0,
        0
      ]
    },
    {
      "flags": {},
      "id": 111,
      "inputs": [
        {
          "link": 266,
          "localized_name": "audio",
          "name": "audio",
          "type": "AUDIO"
        },
        {
          "link": null,
          "localized_name": "filename_prefix",
          "name": "filename_prefix",
          "type": "STRING",
          "widget": {
            "name": "filename_prefix"
          }
        },
        {
          "link": null,
          "localized_name": "format",
          "name": "format",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "format"
          }
        },
        {
          "link": null,
          "localized_name": "format.quality",
          "name": "format.quality",
          "type": "COMBO",
          "widget": {
            "name": "format.quality"
          }
        },
        {
          "link": null,
          "localized_name": "audioUI",
          "name": "audioUI",
          "type": "AUDIO_UI",
          "widget": {
            "name": "audioUI"
          }
        }
      ],
      "mode": 0,
      "order": 24,
      "outputs": [
        {
          "links": null,
          "localized_name": "audio",
          "name": "audio",
          "type": "AUDIO"
        }
      ],
      "pos": [
        1320,
        -670
      ],
      "properties": {
        "Node name for S&R": "SaveAudioAdvanced"
      },
      "size": [
        710,
        216
      ],
      "type": "SaveAudioAdvanced",
      "widgets_values": [
        "audio/ACE_Step1.5_xl_turbo",
        "mp3",
        "V0"
      ]
    },
    {
      "flags": {},
      "id": 112,
      "inputs": [
        {
          "label": "Song Topic (guides lyric auto-generation)",
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "STRING",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 3,
      "outputs": [
        {
          "links": [
            267
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -2150,
        -650
      ],
      "properties": {
        "Node name for S&R": "PrimitiveStringMultiline"
      },
      "size": [
        420,
        220
      ],
      "title": "User: song topic (USER_INPUT)",
      "type": "PrimitiveStringMultiline",
      "widgets_values": [
        "An upbeat electronic anthem about building workflows in ComfyUI — connecting nodes late at night and watching the render come through."
      ]
    },
    {
      "flags": {},
      "id": 113,
      "inputs": [
        {
          "link": null,
          "localized_name": "clip_name",
          "name": "clip_name",
          "type": "COMBO",
          "widget": {
            "name": "clip_name"
          }
        },
        {
          "link": null,
          "localized_name": "type",
          "name": "type",
          "type": "COMBO",
          "widget": {
            "name": "type"
          }
        },
        {
          "link": null,
          "localized_name": "device",
          "name": "device",
          "shape": 7,
          "type": "COMBO",
          "widget": {
            "name": "device"
          }
        }
      ],
      "mode": 0,
      "order": 4,
      "outputs": [
        {
          "links": [
            268
          ],
          "localized_name": "CLIP",
          "name": "CLIP",
          "type": "CLIP"
        }
      ],
      "pos": [
        -2150,
        -880
      ],
      "properties": {
        "Node name for S&R": "CLIPLoader",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "models": [
          {
            "directory": "text_encoders",
            "name": "qwen3.5_4b_bf16.safetensors",
            "url": "https://huggingface.co/Comfy-Org/Qwen3.5/resolve/main/text_encoders/qwen3.5_4b_bf16.safetensors"
          }
        ],
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.18.1"
      },
      "size": [
        420,
        170
      ],
      "title": "CLIP Loader (Qwen LLM for lyrics)",
      "type": "CLIPLoader",
      "widgets_values": [
        "qwen3.5_4b_bf16.safetensors",
        "stable_diffusion",
        "default"
      ]
    },
    {
      "flags": {},
      "id": 114,
      "inputs": [
        {
          "link": null,
          "localized_name": "string",
          "name": "string",
          "type": "STRING",
          "widget": {
            "name": "string"
          }
        },
        {
          "link": null,
          "localized_name": "find",
          "name": "find",
          "type": "STRING",
          "widget": {
            "name": "find"
          }
        },
        {
          "link": 267,
          "localized_name": "replace",
          "name": "replace",
          "type": "STRING",
          "widget": {
            "name": "replace"
          }
        }
      ],
      "mode": 0,
      "order": 10,
      "outputs": [
        {
          "links": [
            269
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -1690,
        -870
      ],
      "properties": {
        "Node name for S&R": "StringReplace"
      },
      "size": [
        490,
        470
      ],
      "title": "Lyrics Prompt (fill USER_INPUT)",
      "type": "StringReplace",
      "widgets_values": [
        "You are a professional songwriter. Write complete, singable lyrics about the topic below.\n\nThe song is about TARGET_DURATION seconds long at TARGET_BPM BPM. Write enough sections to fill that length naturally:\n- around 120-150s: 2 verses + 2 choruses.\n- around 180-240s: also add a bridge.\n- 210s or more: also add a short intro and outro.\nAt slower tempo (under 90 BPM) use fewer words per line; at faster tempo (over 130 BPM) you can fit more, but keep every line easy to sing in one breath.\n\nOutput ONLY the lyrics — no title, no notes, no explanation.\n\nPut each section tag on its own line, e.g. [Intro], [Verse 1], [Chorus], [Verse 2], [Bridge], [Outro].\n\nRules:\n- Blank line between sections.\n- 6-10 syllables per line; keep lines within a section a similar length.\n- Rhyme the verses; give the chorus one short, repeatable hook.\n- Stay with ONE core image or metaphor.\n- Plain, concrete lines a singer can breathe through — no stacked adjectives or vague filler (neon skies, electric hearts, endless dreams).\n\nTopic: USER_INPUT\nLyrics:",
        "USER_INPUT",
        ""
      ]
    },
    {
      "flags": {},
      "id": 131,
      "inputs": [
        {
          "link": 269,
          "localized_name": "string",
          "name": "string",
          "type": "STRING",
          "widget": {
            "name": "string"
          }
        },
        {
          "link": null,
          "localized_name": "find",
          "name": "find",
          "type": "STRING",
          "widget": {
            "name": "find"
          }
        },
        {
          "link": 287,
          "localized_name": "replace",
          "name": "replace",
          "type": "STRING",
          "widget": {
            "name": "replace"
          }
        }
      ],
      "mode": 0,
      "order": 15,
      "outputs": [
        {
          "links": [
            285
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -2150,
        -370
      ],
      "properties": {
        "Node name for S&R": "StringReplace"
      },
      "size": [
        420,
        252
      ],
      "title": "Inject DURATION (TARGET_DURATION)",
      "type": "StringReplace",
      "widgets_values": [
        "",
        "TARGET_DURATION",
        ""
      ]
    },
    {
      "flags": {},
      "id": 132,
      "inputs": [
        {
          "link": 285,
          "localized_name": "string",
          "name": "string",
          "type": "STRING",
          "widget": {
            "name": "string"
          }
        },
        {
          "link": null,
          "localized_name": "find",
          "name": "find",
          "type": "STRING",
          "widget": {
            "name": "find"
          }
        },
        {
          "link": 288,
          "localized_name": "replace",
          "name": "replace",
          "type": "STRING",
          "widget": {
            "name": "replace"
          }
        }
      ],
      "mode": 0,
      "order": 16,
      "outputs": [
        {
          "links": [
            286
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -2150,
        -70
      ],
      "properties": {
        "Node name for S&R": "StringReplace"
      },
      "size": [
        420,
        252
      ],
      "title": "Inject BPM (TARGET_BPM)",
      "type": "StringReplace",
      "widgets_values": [
        "",
        "TARGET_BPM",
        ""
      ]
    },
    {
      "flags": {},
      "id": 117,
      "inputs": [
        {
          "label": "Manual Lyrics (leave empty to auto-generate)",
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "STRING",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 5,
      "outputs": [
        {
          "links": [
            271,
            275
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -1620,
        -260
      ],
      "properties": {
        "Node name for S&R": "PrimitiveStringMultiline"
      },
      "size": [
        420,
        270
      ],
      "title": "Manual lyrics (leave EMPTY to auto-generate)",
      "type": "PrimitiveStringMultiline",
      "widgets_values": [
        ""
      ]
    },
    {
      "flags": {},
      "id": 115,
      "inputs": [
        {
          "link": 268,
          "localized_name": "clip",
          "name": "clip",
          "type": "CLIP"
        },
        {
          "link": null,
          "localized_name": "image",
          "name": "image",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "video",
          "name": "video",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "audio",
          "name": "audio",
          "shape": 7,
          "type": "AUDIO"
        },
        {
          "link": 286,
          "localized_name": "prompt",
          "name": "prompt",
          "type": "STRING",
          "widget": {
            "name": "prompt"
          }
        },
        {
          "link": null,
          "localized_name": "max_length",
          "name": "max_length",
          "type": "INT",
          "widget": {
            "name": "max_length"
          }
        },
        {
          "link": null,
          "localized_name": "sampling_mode",
          "name": "sampling_mode",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "sampling_mode"
          }
        },
        {
          "link": null,
          "localized_name": "temperature",
          "name": "sampling_mode.temperature",
          "type": "FLOAT",
          "widget": {
            "name": "sampling_mode.temperature"
          }
        },
        {
          "link": null,
          "localized_name": "top_k",
          "name": "sampling_mode.top_k",
          "type": "INT",
          "widget": {
            "name": "sampling_mode.top_k"
          }
        },
        {
          "link": null,
          "localized_name": "top_p",
          "name": "sampling_mode.top_p",
          "type": "FLOAT",
          "widget": {
            "name": "sampling_mode.top_p"
          }
        },
        {
          "link": null,
          "localized_name": "min_p",
          "name": "sampling_mode.min_p",
          "type": "FLOAT",
          "widget": {
            "name": "sampling_mode.min_p"
          }
        },
        {
          "link": null,
          "localized_name": "repetition_penalty",
          "name": "sampling_mode.repetition_penalty",
          "type": "FLOAT",
          "widget": {
            "name": "sampling_mode.repetition_penalty"
          }
        },
        {
          "label": "Lyrics Seed (change to generate new lyrics)",
          "link": null,
          "localized_name": "seed",
          "name": "sampling_mode.seed",
          "type": "INT",
          "widget": {
            "name": "sampling_mode.seed"
          }
        },
        {
          "link": null,
          "localized_name": "presence_penalty",
          "name": "sampling_mode.presence_penalty",
          "shape": 7,
          "type": "FLOAT",
          "widget": {
            "name": "sampling_mode.presence_penalty"
          }
        },
        {
          "link": null,
          "localized_name": "thinking",
          "name": "thinking",
          "shape": 7,
          "type": "BOOLEAN",
          "widget": {
            "name": "thinking"
          }
        },
        {
          "link": null,
          "localized_name": "use_default_template",
          "name": "use_default_template",
          "shape": 7,
          "type": "BOOLEAN",
          "widget": {
            "name": "use_default_template"
          }
        }
      ],
      "mode": 0,
      "order": 17,
      "outputs": [
        {
          "links": [
            270
          ],
          "localized_name": "generated_text",
          "name": "generated_text",
          "type": "STRING"
        }
      ],
      "pos": [
        -1170,
        -870
      ],
      "properties": {
        "Node name for S&R": "TextGenerate",
        "cnr_id": "comfy-core",
        "enableTabs": false,
        "hasSecondTab": false,
        "secondTabOffset": 80,
        "secondTabText": "Send Back",
        "secondTabWidth": 65,
        "tabWidth": 65,
        "tabXOffset": 10,
        "ver": "0.18.1"
      },
      "size": [
        430,
        532
      ],
      "title": "Qwen TextGenerate (lyrics)",
      "type": "TextGenerate",
      "widgets_values": [
        "",
        512,
        "on",
        0.7,
        64,
        0.95,
        0.05,
        1.05,
        35146436134,
        0,
        false,
        true
      ]
    },
    {
      "flags": {},
      "id": 116,
      "inputs": [
        {
          "link": 271,
          "localized_name": "on_false",
          "name": "on_false",
          "type": "STRING"
        },
        {
          "link": 270,
          "localized_name": "on_true",
          "name": "on_true",
          "type": "STRING"
        },
        {
          "link": 276,
          "localized_name": "switch",
          "name": "switch",
          "type": "BOOLEAN",
          "widget": {
            "name": "switch"
          }
        }
      ],
      "mode": 0,
      "order": 18,
      "outputs": [
        {
          "links": [
            273,
            278
          ],
          "localized_name": "output",
          "name": "output",
          "type": "STRING"
        }
      ],
      "pos": [
        -630,
        -870
      ],
      "properties": {
        "Node name for S&R": "ComfySwitchNode"
      },
      "size": [
        280,
        130
      ],
      "title": "Switch (auto: LLM if manual empty)",
      "type": "ComfySwitchNode",
      "widgets_values": [
        false
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 121,
      "inputs": [
        {
          "link": 275,
          "localized_name": "string_a",
          "name": "string_a",
          "type": "STRING",
          "widget": {
            "name": "string_a"
          }
        },
        {
          "link": null,
          "localized_name": "string_b",
          "name": "string_b",
          "type": "STRING",
          "widget": {
            "name": "string_b"
          }
        },
        {
          "link": null,
          "localized_name": "mode",
          "name": "mode",
          "type": "COMBO",
          "widget": {
            "name": "mode"
          }
        },
        {
          "link": null,
          "localized_name": "case_sensitive",
          "name": "case_sensitive",
          "type": "BOOLEAN",
          "widget": {
            "name": "case_sensitive"
          }
        }
      ],
      "mode": 0,
      "order": 11,
      "outputs": [
        {
          "links": [
            276
          ],
          "localized_name": "BOOLEAN",
          "name": "BOOLEAN",
          "type": "BOOLEAN"
        }
      ],
      "pos": [
        -1170,
        -260
      ],
      "properties": {
        "Node name for S&R": "StringCompare"
      },
      "size": [
        318.53125,
        8
      ],
      "title": "Compare Text (manual lyrics == empty)",
      "type": "StringCompare",
      "widgets_values": [
        "",
        "",
        "Equal",
        true
      ]
    },
    {
      "flags": {},
      "id": 119,
      "inputs": [
        {
          "link": 278,
          "localized_name": "source",
          "name": "source",
          "type": "*"
        }
      ],
      "mode": 0,
      "order": 20,
      "outputs": [
        {
          "links": null,
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -720,
        -680
      ],
      "properties": {
        "Node name for S&R": "PreviewAny"
      },
      "size": [
        440,
        860
      ],
      "title": "Preview Lyrics",
      "type": "PreviewAny",
      "widgets_values": [
        null,
        null,
        null
      ]
    },
    {
      "bgcolor": "#000",
      "color": "#222",
      "flags": {},
      "id": 120,
      "inputs": [],
      "mode": 0,
      "order": 6,
      "outputs": [],
      "pos": [
        -2710,
        -880
      ],
      "properties": {},
      "size": [
        520,
        620
      ],
      "title": "Note: Lyrics branch (BPM + duration aware)",
      "type": "MarkdownNote",
      "widgets_values": [
        "## Lyrics Generation (BPM + duration aware)\n\nTurns a **short topic** into structured **song lyrics** for ACE-Step, and injects the target **BPM** and **duration** into the songwriter instruction so the LLM writes the right amount of lyrics for the track.\n\n**Flow:** `Topic` + `BPM` + `Duration` → prompt scaffold (`StringReplace` x3, filling `USER_INPUT` / `TARGET_DURATION` / `TARGET_BPM`) → **Qwen `TextGenerate`** → `Switch` → the **lyrics** input of `TextEncodeAceStepAudio1.5`.\n\n`BPM` and `Duration` are the SAME primitives that drive the encoder (`Int (bpm)` + `Float (Duration)`), turned into text by `PreviewAny` — so the words and the audio target the same tempo/length.\n\n**Auto mode:** `Compare Text` checks whether the **manual lyrics** box is empty. Empty → use the LLM lyrics; typed → use your words verbatim.\n\n## Model (text_encoders)\n\n- qwen3.5_4b_bf16.safetensors (LLM for lyrics — confirm the 4B file/URL exists in your setup)\n\nStore in `ComfyUI/models/text_encoders/`."
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 127,
      "inputs": [
        {
          "link": 283,
          "localized_name": "source",
          "name": "source",
          "type": "*"
        }
      ],
      "mode": 0,
      "order": 14,
      "outputs": [
        {
          "links": [
            288
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -2410,
        150
      ],
      "properties": {
        "Node name for S&R": "PreviewAny"
      },
      "size": [
        225,
        8
      ],
      "title": "bpm to string",
      "type": "PreviewAny",
      "widgets_values": [
        null,
        null,
        null
      ]
    },
    {
      "flags": {},
      "id": 128,
      "inputs": [
        {
          "label": "Duration (seconds)",
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "FLOAT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 7,
      "outputs": [
        {
          "links": [
            280,
            281,
            284
          ],
          "localized_name": "FLOAT",
          "name": "FLOAT",
          "type": "FLOAT"
        }
      ],
      "pos": [
        -2710,
        -180
      ],
      "properties": {
        "Node name for S&R": "PrimitiveFloat"
      },
      "size": [
        270,
        80
      ],
      "title": "Float (Duration)",
      "type": "PrimitiveFloat",
      "widgets_values": [
        120
      ]
    },
    {
      "flags": {},
      "id": 129,
      "inputs": [
        {
          "label": "BPM",
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "INT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 8,
      "outputs": [
        {
          "links": [
            282,
            283
          ],
          "localized_name": "INT",
          "name": "INT",
          "type": "INT"
        }
      ],
      "pos": [
        -2710,
        80
      ],
      "properties": {
        "Node name for S&R": "PrimitiveInt"
      },
      "size": [
        270,
        90
      ],
      "title": "Int (bpm)",
      "type": "PrimitiveInt",
      "widgets_values": [
        90,
        "fixed"
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 130,
      "inputs": [
        {
          "link": 284,
          "localized_name": "source",
          "name": "source",
          "type": "*"
        }
      ],
      "mode": 0,
      "order": 13,
      "outputs": [
        {
          "links": [
            287
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        -2410,
        -150
      ],
      "properties": {
        "Node name for S&R": "PreviewAny"
      },
      "size": [
        225,
        8
      ],
      "title": "duration to string",
      "type": "PreviewAny",
      "widgets_values": [
        null,
        null,
        null
      ]
    }
  ],
  "revision": 0,
  "version": 0.4
}