music/release
Music release workflow — prompt → instrumental track → DistroKid-ready bundle.
Category: music
Source: workflows/music/release.py
Input Schema
Section titled “Input Schema”| Field | Type | Default | Description |
|---|---|---|---|
ai_disclosure | boolean | true | Workflow invariant — must be True. AI-generated content tagging. |
album_name | object | — | Album name (defaults to title for singles) |
artist_name | string | required | Artist persona name (one of your registered DistroKid artists) |
audio_model | string | "fal-ai/stable-audio" | Music generation model (commercial-cleared) |
bit_depth | integer | 16 | |
copyright | object | — | © line; auto-built if omitted |
cover_prompt | string | "" | Cover art prompt. Defaults to a derivative of the music prompt if empty. |
cover_size | integer | 3000 | Square pixel size |
distribution | object | — | See _Distribution. auto_submit must be False in Phase 1. |
duration_secs | integer | 180 | Track length in seconds (≥30 for Spotify play-counting) |
explicit | boolean | false | |
featured_artist | string | "" | Featured artist credit (optional) |
genre | string | required | Spotify genre taxonomy (e.g. Ambient, Lo-Fi, Classical) |
image_model | object | — | Image model override |
isrc | object | — | ISRC (12 chars). Null lets DistroKid auto-issue. |
label | object | — | Label name (defaults to artist_name) |
language | string | "instrumental" | ISO code or ‘instrumental’ |
lyrics | object | — | Required when vocals=True |
mood_tags | string[] | — | |
output_dir | object | — | Parent directory for release bundles. Defaults to a temp dir. |
pitch_to_editorial | boolean | true | |
playlist_targets | string[] | — | |
prompt | string | required | Music generation prompt — describes mood, style, instrumentation |
publishing_rights | object | — | ℗ line; auto-built if omitted |
regenerate | object | — | When set, this run is a regeneration. Workflows may read direction / keep / extra_instructions to modulate prompts; the engine persists parent_run_id and parent_variant_index as run lineage columns. |
release_date | string | required | YYYY-MM-DD; ≥7 days out for S4A pitching |
sample_rate | integer | 44100 | |
seed | object | — | Pinned seed shared by every segment generation — keeps the harmonic and timbral palette consistent across the whole track. When omitted, the workflow auto-generates one and records it in release.json so the run is reproducible. |
segment_duration_secs | integer | 30 | Per-segment generation length (Stable Audio Open caps ~30-47s) |
segment_prompts | object | — | Override the auto-generated per-segment prompts. When set, generates exactly len(segment_prompts) segments and skips the song-shape templates. |
songwriter_splits | object[] | — | Publishing royalties — at least one entry; shares sum to 100. See _SongwriterSplit. |
subgenres | string[] | — | |
target_lufs | number | -14.0 | Spotify normalizes to -14 LUFS |
title | string | required | Track title |
upc | object | — | UPC (12 digits). Optional. |
variants | integer | 1 | Number of independent variant executions (1–10). When > 1, the engine runs the workflow N times with different sampling, producing N outputs. |
vocals | boolean | false | True routes to ACE-Step (Phase 3, deferred). Phase 1 supports instrumental only. |
Output Schema
Section titled “Output Schema”| Field | Type | Default | Description |
|---|---|---|---|
audio_path | string | required | Mastered 16-bit/44.1kHz WAV at -14 LUFS |
bundle_dir | string | required | Directory containing the release triple |
cover_meta | object | — | |
cover_path | string | required | Square sRGB JPEG, ≤10MB |
kind | object | — | Variant card shape: video / carousel / image / text. Surfaced on the per-variant entry of the run-output API and used by gallery UIs to pick the right layout. |
loudness | object | — | |
metadata_csv_path | string | required | DistroKid bulk-upload CSV row |
release_json_path | string | required | Machine-readable sidecar with full metadata |
warnings | string[] | — |
Task Pipeline
Section titled “Task Pipeline”prepare_release → generate_track → generate_cover → assemble_bundle| Task | Description |
|---|---|
prepare_release | Validate Phase-1 invariants before any expensive work fires. |
generate_track | Generate the instrumental track as N evolving segments. |
generate_cover | Generate square cover art via the existing image stage. |
assemble_bundle | Crossfade-concat segments, master, process cover, write metadata. |
Run-spec example
Section titled “Run-spec example”Save the YAML below as my-run.yaml, edit the values, and run with the CLI or POST it to the API. Required fields are uncommented; optional knobs are documented above the input: block — copy any line under input: and uncomment to set.
workflow: music/release
# Optional fields — copy any line(s) under `input:` and uncomment to set:# Workflow invariant — must be True. AI-generated content tagging.# ai_disclosure: true## Album name (defaults to title for singles)# album_name: null## Music generation model (commercial-cleared)# audio_model: fal-ai/stable-audio## bit_depth: 16## © line; auto-built if omitted# copyright: null## Cover art prompt. Defaults to a derivative of the music prompt if empty.# cover_prompt: ""## Square pixel size# [min=1400, max=3000]# cover_size: 3000## See _Distribution. auto_submit must be False in Phase 1.# distribution: {}## Track length in seconds (≥30 for Spotify play-counting)# [min=30, max=300]# duration_secs: 180## explicit: false## Featured artist credit (optional)# featured_artist: ""## Image model override# image_model: null## ISRC (12 chars). Null lets DistroKid auto-issue.# isrc: null## Label name (defaults to artist_name)# label: null## ISO code or 'instrumental'# language: instrumental## Required when vocals=True# lyrics: null## mood_tags: []## Parent directory for release bundles. Defaults to a temp dir.# output_dir: null## pitch_to_editorial: true## playlist_targets: []## ℗ line; auto-built if omitted# publishing_rights: null## sample_rate: 44100## Pinned seed shared by every segment generation — keeps the harmonic and timbral palette consistent across the whole track. When omitted, the workflow auto-generates one and records it in release.json so the run is reproducible.# seed: null## Per-segment generation length (Stable Audio Open caps ~30-47s)# [min=15, max=60]# segment_duration_secs: 30## Override the auto-generated per-segment prompts. When set, generates exactly len(segment_prompts) segments and skips the song-shape templates.# segment_prompts: null## Publishing royalties — at least one entry; shares sum to 100. See _SongwriterSplit.# songwriter_splits: []## subgenres: []## Spotify normalizes to -14 LUFS# [min=-23.0, max=-9.0]# target_lufs: -14.0## UPC (12 digits). Optional.# upc: null## True routes to ACE-Step (Phase 3, deferred). Phase 1 supports instrumental only.# vocals: false#
input: # Artist persona name (one of your registered DistroKid artists) artist_name: ""
# Spotify genre taxonomy (e.g. Ambient, Lo-Fi, Classical) genre: ""
# Music generation prompt — describes mood, style, instrumentation prompt: ""
# YYYY-MM-DD; ≥7 days out for S4A pitching release_date: ""
# Track title title: ""Run it locally:
fab-workflow --from-file my-run.yamlOr submit over the wire — the same file is the request body:
curl -X POST 'https://gofabric.dev/v1/workflows/runs?name=music/release' \ -H 'Authorization: Bearer fab_xxx' \ -H 'content-type: application/yaml' \ --data-binary @my-run.yamlEvery workflow also accepts the universal WorkflowInput fields — variants (1–10 fan-out) and regenerate (creative-direction hints with run lineage). See Run-specs (YAML / TOML / JSON) for the full top-level shape (metadata, priority, bundle, parent, etc.).
Worked examples
Section titled “Worked examples”These checked-in run-specs exercise this workflow — good starting points to copy and tweak: