{"id": "e4a8c7d2-9b3f-4d6e-8a1c-gmanski-musicacestep", "revision": 0, "last_node_id": 21, "last_link_id": 24, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-1480, -340], "size": [470, 700], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Gmanski Music (ACE-Step)\n\n**A second song engine, Apache 2.0.** ACE-Step 1.5 XL Turbo writes a complete song with vocals in **8 steps** from a style caption and lyrics. Same Song Planner front end as MiniMax Music 3, so you can send one brief to both and keep the better take.\n\n### Run it\n1. Write your **idea** on the Song Planner (or type a caption/lyrics by hand and flip the two switches).\n2. Set **Song length (seconds)**; the encoder's **bpm / time signature / key / language** are the song's musical frame - the planner's caption usually implies them, set them to match.\n3. Queue. Result: `output/audio/Gmanski/<title>.flac` (ACE renders at 48 kHz).\n\n### Tips\n- `generate_audio_codes` (on) runs ACE's small LLM for an audio sketch first - slower, noticeably better arrangement. Turn it off when you feed a reference track.\n- Tags read like Suno-style style prompts: genre, era, instruments, vocal type, mood, \"clean mix\". Lyrics use `[Verse]`, `[Chorus]`, `[Bridge]` markers.\n- Cover / remix / repaint and LoRA styles need the `ace-step/ACE-Step-ComfyUI` node pack (not installed by default); the XL SFT checkpoint (`--with-optional`) is the one to use for those.\n\n### Cost\n- **Download**: ~20 GB (`ace-step` pack).\n- **VRAM**: 16 GB is fine; a 3-minute song takes well under a minute on a 5090.\n- Licence: Apache 2.0 for weights and code - no \"powered by\" notice or territory rules.\n\n### Models\n`gmanski-packs install ace-step`.\n"], "title": "Read me: Gmanski Music (ACE-Step)", "color": "#432", "bgcolor": "#653"}, {"id": 2, "type": "PrimitiveFloat", "pos": [-1480, 400], "size": [330, 60], "flags": {}, "order": 1, "mode": 0, "inputs": [{"name": "value", "type": "FLOAT", "link": null, "widget": {"name": "value"}}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": [2, 13, 14]}], "properties": {"Node name for S&R": "PrimitiveFloat"}, "widgets_values": [120.0], "title": "Song length (seconds)"}, {"id": 3, "type": "GmanskiSongPlanner", "pos": [-960, -120], "size": [470, 600], "flags": {}, "order": 2, "mode": 0, "inputs": [{"name": "provider", "type": "COMBO", "link": null, "widget": {"name": "provider"}}, {"name": "idea", "type": "STRING", "link": null, "widget": {"name": "idea"}}, {"name": "genre_hint", "type": "STRING", "link": null, "widget": {"name": "genre_hint"}}, {"name": "vocal_config", "type": "COMBO", "link": null, "widget": {"name": "vocal_config"}}, {"name": "language", "type": "COMBO", "link": null, "widget": {"name": "language"}}, {"name": "duration_seconds", "type": "FLOAT", "link": 2, "widget": {"name": "duration_seconds"}}, {"name": "seed", "type": "INT", "link": null, "widget": {"name": "seed"}}, {"name": "temperature", "type": "FLOAT", "link": null, "widget": {"name": "temperature"}}, {"name": "ollama_model", "type": "STRING", "link": null, "widget": {"name": "ollama_model"}}, {"name": "ollama_url", "type": "STRING", "link": null, "widget": {"name": "ollama_url"}}, {"name": "unload_after", "type": "BOOLEAN", "link": null, "widget": {"name": "unload_after"}}, {"name": "cloud_model", "type": "COMBO", "link": null, "widget": {"name": "cloud_model"}}, {"name": "api_base_url", "type": "STRING", "link": null, "widget": {"name": "api_base_url"}}, {"name": "api_key", "type": "STRING", "link": null, "widget": {"name": "api_key"}}, {"name": "age_band", "type": "COMBO", "link": null, "widget": {"name": "age_band"}}, {"name": "character_id", "type": "STRING", "link": null, "widget": {"name": "character_id"}}, {"name": "character_library_path", "type": "STRING", "link": null, "widget": {"name": "character_library_path"}}], "outputs": [{"name": "caption", "type": "STRING", "links": [3]}, {"name": "lyrics", "type": "STRING", "links": [5]}, {"name": "max_duration", "type": "FLOAT", "links": []}, {"name": "debug", "type": "STRING", "links": []}], "properties": {"Node name for S&R": "GmanskiSongPlanner"}, "widgets_values": ["ollama", "An upbeat hard-rock / J-pop rock song about eating far too much at a festival and the tummy ache that follows. One female singer, two guitarists, bass and drums. At least one quick, shredding guitar solo. Big singalong chorus.", "indie pop / synthwave", "female vocals", "English", 120.0, 0, "fixed", 0.8, "gemma3:27b", "http://localhost:11434", true, "claude", "", "", "general", "", "/workspace/gmanski/characters.json"], "title": "Song Planner (Gmanski)"}, {"id": 4, "type": "PrimitiveStringMultiline", "pos": [-420, -340], "size": [380, 220], "flags": {}, "order": 3, "mode": 0, "inputs": [{"name": "value", "type": "STRING", "link": null, "widget": {"name": "value"}}], "outputs": [{"name": "STRING", "type": "STRING", "links": [4]}], "properties": {"Node name for S&R": "PrimitiveStringMultiline"}, "widgets_values": [""], "title": "Manual caption / tags (optional)"}, {"id": 5, "type": "PrimitiveStringMultiline", "pos": [-420, -80], "size": [380, 280], "flags": {}, "order": 4, "mode": 0, "inputs": [{"name": "value", "type": "STRING", "link": null, "widget": {"name": "value"}}], "outputs": [{"name": "STRING", "type": "STRING", "links": [6]}], "properties": {"Node name for S&R": "PrimitiveStringMultiline"}, "widgets_values": [""], "title": "Manual lyrics (optional)"}, {"id": 6, "type": "ComfySwitchNode", "pos": [-420, 240], "size": [330, 110], "flags": {}, "order": 5, "mode": 0, "inputs": [{"name": "on_false", "type": "STRING", "link": 3}, {"name": "on_true", "type": "STRING", "link": 4}, {"name": "switch", "type": "BOOLEAN", "link": null, "widget": {"name": "switch"}}], "outputs": [{"name": "output", "type": "STRING", "links": [7]}], "properties": {"Node name for S&R": "ComfySwitchNode"}, "widgets_values": [false], "title": "Caption: use manual text?"}, {"id": 7, "type": "ComfySwitchNode", "pos": [-420, 390], "size": [330, 110], "flags": {}, "order": 6, "mode": 0, "inputs": [{"name": "on_false", "type": "STRING", "link": 5}, {"name": "on_true", "type": "STRING", "link": 6}, {"name": "switch", "type": "BOOLEAN", "link": null, "widget": {"name": "switch"}}], "outputs": [{"name": "output", "type": "STRING", "links": [8]}], "properties": {"Node name for S&R": "ComfySwitchNode"}, "widgets_values": [false], "title": "Lyrics: use manual text?"}, {"id": 8, "type": "ShowText|pysssss", "pos": [30, -340], "size": [420, 330], "flags": {}, "order": 7, "mode": 0, "inputs": [{"name": "text", "type": "STRING", "link": 7}], "outputs": [{"name": "STRING", "type": "STRING", "links": [10]}], "properties": {"Node name for S&R": "ShowText|pysssss"}, "widgets_values": [], "title": "Tags (what the model gets)"}, {"id": 9, "type": "ShowText|pysssss", "pos": [30, 30], "size": [420, 470], "flags": {}, "order": 8, "mode": 0, "inputs": [{"name": "text", "type": "STRING", "link": 8}], "outputs": [{"name": "STRING", "type": "STRING", "links": [11]}], "properties": {"Node name for S&R": "ShowText|pysssss"}, "widgets_values": [], "title": "Lyrics (what the model gets)"}, {"id": 10, "type": "UNETLoader", "pos": [500, -340], "size": [440, 90], "flags": {}, "order": 9, "mode": 0, "inputs": [{"name": "unet_name", "type": "COMBO", "link": null, "widget": {"name": "unet_name"}}, {"name": "weight_dtype", "type": "COMBO", "link": null, "widget": {"name": "weight_dtype"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [1]}], "properties": {"Node name for S&R": "UNETLoader", "models": [{"name": "acestep_v1.5_xl_turbo_bf16.safetensors", "url": "https://huggingface.co/Comfy-Org/ACE-Step-1.5/resolve/main/split_files/diffusion_models/acestep_v1.5_xl_turbo_bf16.safetensors", "directory": "diffusion_models"}]}, "widgets_values": ["acestep_v1.5_xl_turbo_bf16.safetensors", "default"], "title": "ACE-Step 1.5 XL Turbo"}, {"id": 11, "type": "ModelSamplingAuraFlow", "pos": [500, -220], "size": [300, 60], "flags": {}, "order": 10, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 1}, {"name": "shift", "type": "FLOAT", "link": null, "widget": {"name": "shift"}}], "outputs": [{"name": "MODEL", "type": "MODEL", "links": [16]}], "properties": {"Node name for S&R": "ModelSamplingAuraFlow"}, "widgets_values": [3.0], "title": "Sampling shift 3 (official recipe)"}, {"id": 12, "type": "DualCLIPLoader", "pos": [500, -130], "size": [440, 130], "flags": {}, "order": 11, "mode": 0, "inputs": [{"name": "clip_name1", "type": "COMBO", "link": null, "widget": {"name": "clip_name1"}}, {"name": "clip_name2", "type": "COMBO", "link": null, "widget": {"name": "clip_name2"}}, {"name": "type", "type": "COMBO", "link": null, "widget": {"name": "type"}}, {"name": "device", "type": "COMBO", "link": null, "widget": {"name": "device"}}], "outputs": [{"name": "CLIP", "type": "CLIP", "links": [9]}], "properties": {"Node name for S&R": "DualCLIPLoader", "models": [{"name": "qwen_0.6b_ace15.safetensors", "url": "https://huggingface.co/Comfy-Org/ACE-Step-1.5/resolve/main/split_files/text_encoders/qwen_0.6b_ace15.safetensors", "directory": "text_encoders"}]}, "widgets_values": ["qwen_0.6b_ace15.safetensors", "qwen_4b_ace15.safetensors", "ace", "default"], "title": "ACE text encoders (Qwen 0.6B + 4B)"}, {"id": 13, "type": "VAELoader", "pos": [500, 30], "size": [440, 60], "flags": {}, "order": 12, "mode": 0, "inputs": [{"name": "vae_name", "type": "COMBO", "link": null, "widget": {"name": "vae_name"}}], "outputs": [{"name": "VAE", "type": "VAE", "links": [22]}], "properties": {"Node name for S&R": "VAELoader", "models": [{"name": "ace_1.5_vae.safetensors", "url": "https://huggingface.co/Comfy-Org/ACE-Step-1.5/resolve/main/split_files/vae/ace_1.5_vae.safetensors", "directory": "vae"}]}, "widgets_values": ["ace_1.5_vae.safetensors"], "title": "ACE 1.5 VAE"}, {"id": 14, "type": "SeedNode", "pos": [500, 130], "size": [300, 90], "flags": {}, "order": 13, "mode": 0, "inputs": [{"name": "seed", "type": "INT", "link": null, "widget": {"name": "seed"}}], "outputs": [{"name": "seed", "type": "INT", "links": [12, 20]}], "properties": {"Node name for S&R": "SeedNode"}, "widgets_values": [12345, "randomize"], "title": "Music seed"}, {"id": 15, "type": "TextEncodeAceStepAudio1.5", "pos": [500, 260], "size": [470, 560], "flags": {}, "order": 14, "mode": 0, "inputs": [{"name": "clip", "type": "CLIP", "link": 9}, {"name": "tags", "type": "STRING", "link": 10, "widget": {"name": "tags"}}, {"name": "lyrics", "type": "STRING", "link": 11, "widget": {"name": "lyrics"}}, {"name": "seed", "type": "INT", "link": 12, "widget": {"name": "seed"}}, {"name": "bpm", "type": "INT", "link": null, "widget": {"name": "bpm"}}, {"name": "duration", "type": "FLOAT", "link": 13, "widget": {"name": "duration"}}, {"name": "timesignature", "type": "COMBO", "link": null, "widget": {"name": "timesignature"}}, {"name": "language", "type": "COMBO", "link": null, "widget": {"name": "language"}}, {"name": "keyscale", "type": "COMBO", "link": null, "widget": {"name": "keyscale"}}, {"name": "generate_audio_codes", "type": "BOOLEAN", "link": null, "widget": {"name": "generate_audio_codes"}}, {"name": "cfg_scale", "type": "FLOAT", "link": null, "widget": {"name": "cfg_scale"}}, {"name": "temperature", "type": "FLOAT", "link": null, "widget": {"name": "temperature"}}, {"name": "top_p", "type": "FLOAT", "link": null, "widget": {"name": "top_p"}}, {"name": "top_k", "type": "INT", "link": null, "widget": {"name": "top_k"}}, {"name": "min_p", "type": "FLOAT", "link": null, "widget": {"name": "min_p"}}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [15, 17]}], "properties": {"Node name for S&R": "TextEncodeAceStepAudio1.5"}, "widgets_values": ["", "", 0, "fixed", 120, 120.0, "4", "en", "C major", true, 2.0, 0.85, 0.9, 0, 0.0], "title": "ACE-Step 1.5 text encode (tags + lyrics + musical frame)"}, {"id": 16, "type": "EmptyAceStep1.5LatentAudio", "pos": [1040, 260], "size": [360, 90], "flags": {}, "order": 15, "mode": 0, "inputs": [{"name": "seconds", "type": "FLOAT", "link": 14, "widget": {"name": "seconds"}}, {"name": "batch_size", "type": "INT", "link": null, "widget": {"name": "batch_size"}}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [19]}], "properties": {"Node name for S&R": "EmptyAceStep1.5LatentAudio"}, "widgets_values": [120.0, 1], "title": "Empty ACE latent (batch_size = takes per run)"}, {"id": 17, "type": "ConditioningZeroOut", "pos": [1040, 390], "size": [300, 40], "flags": {}, "order": 16, "mode": 0, "inputs": [{"name": "conditioning", "type": "CONDITIONING", "link": 15}], "outputs": [{"name": "CONDITIONING", "type": "CONDITIONING", "links": [18]}], "properties": {"Node name for S&R": "ConditioningZeroOut"}, "widgets_values": []}, {"id": 18, "type": "KSampler", "pos": [1040, 470], "size": [360, 270], "flags": {}, "order": 17, "mode": 0, "inputs": [{"name": "model", "type": "MODEL", "link": 16}, {"name": "positive", "type": "CONDITIONING", "link": 17}, {"name": "negative", "type": "CONDITIONING", "link": 18}, {"name": "latent_image", "type": "LATENT", "link": 19}, {"name": "seed", "type": "INT", "link": 20, "widget": {"name": "seed"}}, {"name": "steps", "type": "INT", "link": null, "widget": {"name": "steps"}}, {"name": "cfg", "type": "FLOAT", "link": null, "widget": {"name": "cfg"}}, {"name": "sampler_name", "type": "COMBO", "link": null, "widget": {"name": "sampler_name"}}, {"name": "scheduler", "type": "COMBO", "link": null, "widget": {"name": "scheduler"}}, {"name": "denoise", "type": "FLOAT", "link": null, "widget": {"name": "denoise"}}], "outputs": [{"name": "LATENT", "type": "LATENT", "links": [21]}], "properties": {"Node name for S&R": "KSampler"}, "widgets_values": [0, "fixed", 8, 1.0, "euler", "simple", 1.0], "title": "Sample (8 steps, CFG 1 - Turbo)"}, {"id": 19, "type": "VAEDecodeAudio", "pos": [1460, 470], "size": [250, 60], "flags": {}, "order": 18, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 21}, {"name": "vae", "type": "VAE", "link": 22}], "outputs": [{"name": "AUDIO", "type": "AUDIO", "links": [23]}], "properties": {"Node name for S&R": "VAEDecodeAudio"}, "widgets_values": []}, {"id": 20, "type": "GmanskiFilenamePrefix", "pos": [1460, 580], "size": [330, 130], "flags": {}, "order": 19, "mode": 0, "inputs": [{"name": "title", "type": "STRING", "link": null, "widget": {"name": "title"}}, {"name": "folder", "type": "STRING", "link": null, "widget": {"name": "folder"}}, {"name": "fallback", "type": "STRING", "link": null, "widget": {"name": "fallback"}}], "outputs": [{"name": "filename_prefix", "type": "STRING", "links": [24]}], "properties": {"Node name for S&R": "GmanskiFilenamePrefix"}, "widgets_values": ["", "audio/Gmanski", "acestep"], "title": "Song title (used as the saved filename)"}, {"id": 21, "type": "SaveAudioAdvanced", "pos": [1460, 750], "size": [330, 150], "flags": {}, "order": 20, "mode": 0, "inputs": [{"name": "audio", "type": "AUDIO", "link": 23}, {"name": "filename_prefix", "type": "STRING", "link": 24, "widget": {"name": "filename_prefix"}}, {"name": "format", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "format"}}, {"name": "audioUI", "type": "AUDIO_UI", "link": null, "widget": {"name": "audioUI"}}], "outputs": [{"name": "audio", "type": "AUDIO", "links": []}], "properties": {"Node name for S&R": "SaveAudioAdvanced"}, "widgets_values": ["audio/Gmanski/acestep", "flac"], "title": "Save Audio (flac)"}], "links": [[1, 10, 0, 11, 0, "MODEL"], [2, 2, 0, 3, 5, "FLOAT"], [3, 3, 0, 6, 0, "STRING"], [4, 4, 0, 6, 1, "STRING"], [5, 3, 1, 7, 0, "STRING"], [6, 5, 0, 7, 1, "STRING"], [7, 6, 0, 8, 0, "STRING"], [8, 7, 0, 9, 0, "STRING"], [9, 12, 0, 15, 0, "CLIP"], [10, 8, 0, 15, 1, "STRING"], [11, 9, 0, 15, 2, "STRING"], [12, 14, 0, 15, 3, "INT"], [13, 2, 0, 15, 5, "FLOAT"], [14, 2, 0, 16, 0, "FLOAT"], [15, 15, 0, 17, 0, "CONDITIONING"], [16, 11, 0, 18, 0, "MODEL"], [17, 15, 0, 18, 1, "CONDITIONING"], [18, 17, 0, 18, 2, "CONDITIONING"], [19, 16, 0, 18, 3, "LATENT"], [20, 14, 0, 18, 4, "INT"], [21, 18, 0, 19, 0, "LATENT"], [22, 13, 0, 19, 1, "VAE"], [23, 19, 0, 21, 0, "AUDIO"], [24, 20, 0, 21, 1, "STRING"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "music-acestep", "generator": "scripts/build_gmanski_music_acestep_workflow.py", "source": "https://gmanski.com/workflows/music-acestep"}, "version": 0.4}