Skip to main content
Glama

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

Lay the score on the picture

doseedo_score_to_picture

SCORE TO PICTURE: the last step of scoring a film. Lays each mixed cue (and any sound effect) on the video at its SMPTE timecode, with dialogue ducking (the lines found on the video's own soundtrack by VAD, or the spans you pass; the music dips ahead of each line and comes back after it), normalises the program to a delivery loudness (web −16, streaming −14, broadcast/ebu −23, atsc −24 LUFS, or a number; true peak under the ceiling) and muxes it onto the picture untouched (no re-encode). Returns the scored video, the printmaster WAV and the music-and-effects stem, plus a report of what it MEASURED: where each track landed (and what was cut at the film's edges), how far the music sits under the lines, and the final loudness and true peak. CPU, no credits. tracks: [{audio_url (a doseedo_mix mix_url as returned, or any public https URL) | audio_key, start_timecode (in the film's timecode) | start_s, gain_db?, role?: music|dialogue|effects, duck?, name?}], ≤ 64. Keep the production audio (default) or drop it (production_audio:"drop"). A FILM THAT ALREADY HAS MUSIC: keeping its audio mixes the old music under yours — split it first (doseedo_split_soundtrack) and lay its dialogue and effects stems back (start_s 0, role dialogue / effects) with production_audio:"drop": the old music is gone, the lines are kept, and the duck reads the lines off the dialogue stem; lay the old music stem back too with duck:false to keep it (or a part of it). With dialogue tracks the delivery also returns the dialogue / music / effects stems. Up to 25 minutes of film per call (a reel). Async: job_id → doseedo_wait_task. Cancel: the plane has no stop for a running delivery — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.

Input Schema

NameRequiredDescriptionDefault
duckNoDialogue ducking (on by default): depth_db (default 10), attack_ms (250: how early before a line the music is down), release_ms (700), sfx (false: duck effects too), enabled.
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>.
tracksYesWhat to lay on the film, in any order.
dialogueNoDialogue spans [{start_s, end_s}] to duck under, instead of detecting them (use the cue sheet's dialogue, or your own).
loudnessNoDelivery loudness: "web" (−16 LUFS, default), "streaming" (−14), "broadcast" / "ebu" (−23), "atsc" (−24), or a LUFS number (−36…−8).
video_keyNoR2 ingest key of the video (the same upload doseedo_spot_video used).
video_urlNohttps URL of the video, as an alternative to video_key.
start_timecodeNoSMPTE timecode of the film's first frame (default: the file's own, else 00:00:00:00) — the clock the tracks' start_timecode is read on.
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.
production_audioNokeep (default) mixes the video's own soundtrack — all of it, its music included — under the score; drop replaces it (lay a doseedo_split_soundtrack's dialogue + effects stems to keep the lines).
production_gain_dbNoTrim on the production audio when kept (default 0).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / properties / tracks / items / properties / fade_in_s
      Added value: +{
      +  "description": "A longer fade in from its first heard sample (the first frame when its head is cut).",
      +  "maximum": 30,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / tracks / items / properties / fade_out_s
      Added value: +{
      +  "description": "A longer fade out to its last heard sample — its own end, length_s, or the last frame: let a piece go over the last shot instead of cutting it.",
      +  "maximum": 60,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / tracks / items / properties / length_s
      Added value: +{
      +  "description": "How much of the audio plays from source_start_s (default: to its end or the last frame). The cut is faded (declick).",
      +  "maximum": 7200,
      +  "minimum": 0.05,
      +  "type": "number"
      +}
    • addedInput schema / properties / tracks / items / properties / source_start_s
      Added value: +{
      +  "description": "Where in the AUDIO it starts playing (default 0): pick the stretch of a longer piece — a public-domain recording cut to a :30 starts at the phrase you chose. The cut is faded (declick).",
      +  "maximum": 7200,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / tracks / items / properties / start_s / description
      Previous value: -"Or where it starts in seconds from the first frame."New value: +"Or where it starts in seconds from the first frame (negative = its head is before the first frame and cut there)."
  2. Changed1 schema field changed
    • changedInput schema / properties / tracks / items / properties / duck / description
      Previous value: -"false = this music track is not ducked (the film's own music laid back from doseedo_split_soundtrack was mixed under its lines already). Default true."New value: +"false = this music track is not ducked: a band seen playing in the scene or a drop (the scene's own sound, forward), or the film's own music laid back from doseedo_split_soundtrack (mixed under its lines already). Default true."
  3. 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"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only mark it non-readOnly, openWorld and non-idempotent; the description supplies the real behavioural picture: mux with no re-encode, CPU with no credits, dialogue detection by VAD or supplied spans, measured delivery report, and — critically — that a running delivery cannot be stopped, burns credits, ends as canceled with output discarded, and is only refunded when still queued at the plane.

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?

Front-loaded with purpose then workflow, and nearly every clause carries decision-relevant content. It is nonetheless a dense single block with heavily nested parentheticals and an inline tracks sketch that duplicates the schema, which costs some readability.

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

Completeness5/5

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

Despite 11 parameters, nested objects and no output schema, the description covers inputs, the split-soundtrack workflow, duration limits, async handoff, cancellation/refund behaviour, and the returned artefacts and measurement report. An agent has what it needs to call this correctly on the first try.

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

Parameters4/5

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

Schema coverage is already 100%, but the description still adds meaning: audio_url must be a doseedo_mix mix_url or any public https URL, role defaults to music and is ducked, tracks cap at 64, start_s negative means the head is cut at the first frame, and production_audio:"keep" also drags the film's own music under the score. It does not re-cover the finer fade/source_start_s knobs the schema documents, which is appropriate.

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 and resource with scope: lay mixed cues on the picture at SMPTE timecode, with ducking, loudness normalisation and mux. It explicitly identifies itself as "the last step of scoring a film" and names the surrounding siblings (doseedo_mix mix_url, doseedo_split_soundtrack, doseedo_spot_video), so it is distinguishable without opening any schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use routing: use it after mixing, split first with doseedo_split_soundtrack if the film already has music and lay dialogue/effects stems back with production_audio:"drop", or lay the old music back with duck:false. It also names the async path (job_id → doseedo_wait_task), the 25-minute reel limit, and the cancel/refund rule, leaving little 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