Cover a song
doseedo_cover_songAI COVER / style transfer of a whole song: re-render an uploaded song as a cover, keeping its structure/melody while changing timbre, instruments, or lyrics. INSTRUMENT SWAP: instruments {"piano": "electric_guitar"} separates the song, transcribes the swapped stem and re-plays THOSE transcribed notes on the target instrument; by default only the swapped stem(s) are regenerated and every other stem passes through as the original separated audio (regen changes that). Because the swap replays a transcription, small note differences from the source are expected — verify from result.cover.instrument_swaps (applied or why not), and offer the user the result/takes to judge rather than promising a note-perfect copy. Target ids: GET https://api.doseedo.com/api/instruments (open). Optionally export a DAW session too. Async: returns a job_id — poll with doseedo_wait_task (several minutes for full songs). Result files are pre-signed links: curl -OJ , no auth header (valid 24 h). Cancel: a render that has not reached the GPU yet is stopped and its credits refunded; one already rendering finishes on the GPU (its credits are spent), the job ends as canceled and the output is discarded.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>. | |
| seed | No | Optional random seed for reproducibility. | |
| genre | No | Optional GENRE style transfer: the target genre in a few words, ≤ 64 characters (e.g. "bossa nova", "80s synth-pop", "West End musical showstopper") — a name, not a description; a longer one is cut at its last comma or word that fits, with a warning on the reply. Every regenerated stem is captioned with it. Outcome in result.cover.genre. | |
| regen | No | Optional: which stems to regenerate. Default with a swap = only the swapped stems (the rest are the original separated audio). "all" = cover every stem; or a comma list of stems/instruments, e.g. "piano,other" (a swapped stem is always regenerated). | |
| export | No | Optionally also build a DAW session for this target. | |
| labels | No | Optional identity CORRECTIONS {source: instrument}, same shape as instruments, e.g. {"other": "trumpet"} when the separation mislabels a stem. Only fixes what the stem is called (caption/timbre); nothing is re-played. Outcome in result.cover.stem_labels. | |
| lyrics | No | Optional replacement lyrics. | |
| swap_cns | No | Optional 0–1, only with instruments: how far the SWAPPED stems may depart from their source (overrides cover_noise_strength for them; server default 0.35). Lower = closer to the original timing/feel. | |
| audio_key | No | R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url. | |
| audio_url | No | https URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url. | |
| midi_only | No | Optional: re-perform every regenerated stem from its transcribed MIDI with NO timbre from the recording (the stem's own sound is dropped). Stems with nothing to render are skipped (result.cover.midi_only.skipped). | |
| style_key | No | Optional ingest key (upload it first) of a reference MIX whose TIMBRE the regenerated stems take on (style transfer). | |
| drum_split | No | true = explode the covered drums into isolated kick/snare/hh/… stems, each generated from its own slice of the drum roll (result.drum_stems). | |
| instruments | No | Optional per-stem instrument SWAP map {source: target}, e.g. {"piano": "electric_guitar", "sax": "violin"}. Source = a stem (drums, bass, vocals, guitar, piano, other) or a detected instrument (sax, trumpet…); target = an instrument id from /api/instruments (an unknown target is refused up front). | |
| guitar_split | No | Deal the guitar bucket into N players, each its own row/swap: "2"–"4", or "auto" (a one-vs-two probe decides). Outcome in result.cover.guitar_split. | |
| structure_key | No | Optional ingest key of audio whose STRUCTURE codes replace the source's (the Cover page's "Structure: custom"). | |
| timbre_preset | No | Optional named timbre preset — the fallback rung of the timbre ladder (stem latent > this > stock bank). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| cover_noise_strength | No | Optional 0–1 fidelity dial: higher departs further from the source. |