Overview
AudioPod’s audio-to-MIDI engine transcribes bass, vocals, and piano in a recording into note-level MIDI — bass is the strongest instrument. Guitar is supported too but is opt-in/experimental. Use it standalone on a full mix (we split it into stems first, then transcribe each requested stem) or as an add-on to a stem-separation job you already ran (transcribe-only, no re-split).This is a starting-point transcription, not a note-perfect one. Bass is
the strongest instrument; expect to tidy timing and note lengths by ear in
your DAW. Dynamics (velocity) are approximate. Drums aren’t transcribed
yet — a requested
drums (or other) stem is accepted but comes back in
skipped_stems. Guitar is opt-in and experimental — it over-detects on busy
mixes, so it isn’t requested by default. Detected tempo is surfaced as
detected_tempo_bpm.Key Features
- Standalone or add-on: convert a raw file/URL, or transcribe stems from an existing stem-separation job
- Per-stem + multitrack output: individual
.midper stem, plus a merged multitrack.midwith tempo metadata - Tempo detection: auto-detected via beat tracking, or pass an explicit
tempo_bpmoverride - Presigned downloads: direct URLs for every output file
Installation
- Python
- Node.js
Authentication
Get your API key from the API Keys Dashboard.- Python
- Node.js
- cURL
Convert From a File or URL
Standalone conversion splits the mix into stems, then transcribes each requested stem. Provide eitherfile or url — not both. stems defaults
to ["bass", "vocals", "piano"] — the strongest instruments — when omitted.
guitar is supported but opt-in/experimental (it over-detects on busy
mixes), so pass it explicitly if you want it. drums and other are
accepted but are never transcribed — they always come back in
skipped_stems.
- cURL (file)
- cURL (URL, with guitar opt-in)
- Python
- Node.js
Options
Tunables forwarded to the audio-to-MIDI engine, passed asoptions (a JSON
object):
Convert From an Existing Stem-Separation Job
If you already ran stem separation, transcribe its output directly — no re-split, so it bills the add-on rate only.stems
must be a subset of the stems the source job produced, and defaults to all
of them when omitted — drums/other stems still come back in
skipped_stems (never transcribed), and guitar remains
opt-in/experimental.
- cURL
- Python
- Node.js
If the source stem job’s output has expired under your plan’s retention
window, this returns
410 Gone — re-run
stem separation first.Job Status & Stages
- cURL
- Python
- Node.js
stage tracks pipeline progress for a PROCESSING job:
Other Job Endpoints
Output Format
Completed Job Response:midi_urls— presigned download URL per transcribed stem’s.midfilemerged_midi_url— a single multitrack.midwith all transcribed stems as separate tracks plus tempo metadatastem_urls— the separated stem audio (standalone mode only, so you can preview what was transcribed)skipped_stems— stems requested but not transcribed (alwaysdrumsandother, if requested — they’re not part of the transcribable set)failed_stems—{stem: error_message}for any stem the engine couldn’t transcribe; the job still completes if at least one stem succeeded
Status Codes
Pricing
See audiopod.ai/pricing for current rates, or check your estimated cost before converting via the API Wallet.Next Steps
Stem Separation
Separate a mix into stems before (or instead of) converting to MIDI.
API Wallet
Manage billing and view usage history.
