Skip to main content
Glama

Doseedo: Film Scoring, AI Instruments, Sound Effects & Stems

Cover a song

doseedo_cover_song

AI 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

NameRequiredDescriptionDefault
nameNoOptional: 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>.
seedNoOptional random seed for reproducibility.
genreNoOptional 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.
regenNoOptional: 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).
exportNoOptionally also build a DAW session for this target.
labelsNoOptional 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.
lyricsNoOptional replacement lyrics.
swap_cnsNoOptional 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_keyNoR2 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_urlNohttps 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_onlyNoOptional: 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_keyNoOptional ingest key (upload it first) of a reference MIX whose TIMBRE the regenerated stems take on (style transfer).
drum_splitNotrue = explode the covered drums into isolated kick/snare/hh/… stems, each generated from its own slice of the drum roll (result.drum_stems).
instrumentsNoOptional 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_splitNoDeal 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_keyNoOptional ingest key of audio whose STRUCTURE codes replace the source's (the Cover page's "Structure: custom").
timbre_presetNoOptional named timbre preset — the fallback rung of the timbre ladder (stem latent > this > stock bank).
idempotency_keyNoOptional. 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_strengthNoOptional 0–1 fidelity dial: higher departs further from the source.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / genre / description
      Previous value: -"Optional GENRE style transfer: the target genre in a few words, at most 64 characters (e.g. \"bossa nova\", \"80s synth-pop\", \"West End musical showstopper\") — a name, not a description; every regenerated stem is captioned with it. Outcome in result.cover.genre."New value: +"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."
  2. Changed1 schema field changed
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "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>.",
      +  "maxLength": 80,
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / genre / description
      Previous value: -"Optional GENRE style transfer: free text naming the target genre (e.g. \"bossa nova\", \"80s synth-pop\"); every regenerated stem is captioned with it. Outcome in result.cover.genre."New value: +"Optional GENRE style transfer: the target genre in a few words, at most 64 characters (e.g. \"bossa nova\", \"80s synth-pop\", \"West End musical showstopper\") — a name, not a description; every regenerated stem is captioned with it. Outcome in result.cover.genre."
    • addedInput schema / properties / genre / maxLength
      Added value: +64
  4. First observed

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true) by disclosing that the swap replays a transcription so small note differences are expected, that only swapped stems regenerate by default, that cancel refunds credits only if the render has not reached the GPU, and that result links are pre-signed and valid 24h with no auth header. This is exactly the kind of cost/irreversibility/workflow detail annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the instrument-swap caveat are front-loaded, and the dense run-on later sentences (cancel/credit semantics, download instructions) each carry actionable information. It is heavy for a single paragraph and could be broken with line labels, but little is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter async generation tool with no output schema, the description covers job lifecycle, polling, result delivery, verification and cancellation thoroughly. Minor gaps remain: it does not describe the shape of the eventual result beyond result.cover.instrument_swaps, and does not mention how name collisions or take re-runs should be handled beyond the schema's own note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with rich per-parameter text, so the baseline is 3. The description adds genuine cross-parameter meaning for the instruments/regen interaction (swap separates, transcribes and replays the target stem while others pass through) that the individual schema entries do not fully state, but the bulk of parameter semantics lives in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('AI COVER / style transfer of a whole song: re-render an uploaded song as a cover') and names the two operating modes (timbre/instrument/lyric change, instrument swap). The 'whole song' framing implicitly separates it from the sibling doseedo_cover_stem without the agent needing to open a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong operational context: poll with doseedo_wait_task, several minutes for full songs, default regen behavior for swaps, and the instruction to verify from result.cover.instrument_swaps rather than promise a note-perfect copy. It stops short of an explicit 'use cover_stem instead when you only need one stem' routing statement, leaving sibling selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources