Skip to content

music/release

Music release workflow — prompt → instrumental track → DistroKid-ready bundle.

Category: music
Source: workflows/music/release.py

FieldTypeDefaultDescription
ai_disclosurebooleantrueWorkflow invariant — must be True. AI-generated content tagging.
album_nameobjectAlbum name (defaults to title for singles)
artist_namestringrequiredArtist persona name (one of your registered DistroKid artists)
audio_modelstring"fal-ai/stable-audio"Music generation model (commercial-cleared)
bit_depthinteger16
copyrightobject© line; auto-built if omitted
cover_promptstring""Cover art prompt. Defaults to a derivative of the music prompt if empty.
cover_sizeinteger3000Square pixel size
distributionobjectSee _Distribution. auto_submit must be False in Phase 1.
duration_secsinteger180Track length in seconds (≥30 for Spotify play-counting)
explicitbooleanfalse
featured_artiststring""Featured artist credit (optional)
genrestringrequiredSpotify genre taxonomy (e.g. Ambient, Lo-Fi, Classical)
image_modelobjectImage model override
isrcobjectISRC (12 chars). Null lets DistroKid auto-issue.
labelobjectLabel name (defaults to artist_name)
languagestring"instrumental"ISO code or ‘instrumental’
lyricsobjectRequired when vocals=True
mood_tagsstring[]
output_dirobjectParent directory for release bundles. Defaults to a temp dir.
pitch_to_editorialbooleantrue
playlist_targetsstring[]
promptstringrequiredMusic generation prompt — describes mood, style, instrumentation
publishing_rightsobject℗ line; auto-built if omitted
regenerateobjectWhen 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_datestringrequiredYYYY-MM-DD; ≥7 days out for S4A pitching
sample_rateinteger44100
seedobjectPinned 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_secsinteger30Per-segment generation length (Stable Audio Open caps ~30-47s)
segment_promptsobjectOverride the auto-generated per-segment prompts. When set, generates exactly len(segment_prompts) segments and skips the song-shape templates.
songwriter_splitsobject[]Publishing royalties — at least one entry; shares sum to 100. See _SongwriterSplit.
subgenresstring[]
target_lufsnumber-14.0Spotify normalizes to -14 LUFS
titlestringrequiredTrack title
upcobjectUPC (12 digits). Optional.
variantsinteger1Number of independent variant executions (1–10). When > 1, the engine runs the workflow N times with different sampling, producing N outputs.
vocalsbooleanfalseTrue routes to ACE-Step (Phase 3, deferred). Phase 1 supports instrumental only.
FieldTypeDefaultDescription
audio_pathstringrequiredMastered 16-bit/44.1kHz WAV at -14 LUFS
bundle_dirstringrequiredDirectory containing the release triple
cover_metaobject
cover_pathstringrequiredSquare sRGB JPEG, ≤10MB
kindobjectVariant 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.
loudnessobject
metadata_csv_pathstringrequiredDistroKid bulk-upload CSV row
release_json_pathstringrequiredMachine-readable sidecar with full metadata
warningsstring[]
prepare_release → generate_track → generate_cover → assemble_bundle
TaskDescription
prepare_releaseValidate Phase-1 invariants before any expensive work fires.
generate_trackGenerate the instrumental track as N evolving segments.
generate_coverGenerate square cover art via the existing image stage.
assemble_bundleCrossfade-concat segments, master, process cover, write metadata.

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:

Terminal window
fab-workflow --from-file my-run.yaml

Or submit over the wire — the same file is the request body:

Terminal window
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.yaml

Every 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.).

These checked-in run-specs exercise this workflow — good starting points to copy and tweak: