SoundCraft MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SoundCraft MCP ServerMake an 8-bar drum and bass loop at 110 BPM in A minor and export WAV"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Why
SoundCraft is an open-source, Pro Tools-class digital audio workstation with a headless CLI (soundcraft-cli), 469 commands, 27 built-in plugins (EQ, dynamics, reverbs, delays, modulation, synths, drum synth, sampler) and an MCP mode. This Model Context Protocol server turns that engine into file-in / file-out tools for Claude, so you can ask things like:
"Make an 8-bar drum and bass loop at 110 BPM in A minor and export WAV, stems and MIDI." "Put this voice over this music for a podcast intro: music under the voice, fades, compressor on the voice, -16 LUFS." "Normalize every recording in
D:\Interviewsto -1 dBFS, cut the first 2 seconds and save 16-bit FLAC." "Pitch this sample up 3 semitones and make it 50 % longer without changing the pitch." "How loud is this master (LUFS, true peak)? Show me its waveform."
Sibling of designcraft-mcp-server, effectcraft-mcp-server, lightcraft-mcp-server, photocraft-mcp-server, vectorcraft-mcp-server, filmcraft-mcp-server, pdfcraft-mcp-server, wordcraft-mcp-server, deckcraft-mcp-server, gridcraft-mcp-server and audacity-mcp-server.
Related MCP server: chat-with-audio
Platforms
OS | SoundCraft package to install | Where the server finds it (no setup needed) | Status |
Windows 10/11 (x64, x86, arm64) | MSI or portable zip |
| ✅ Verified (Windows 11) |
Linux (x86_64, aarch64, riscv64) |
|
| ✅ Verified (Debian 12, headless) |
macOS 11+ (Apple silicon and Intel) |
|
| 🟡 Supported, not yet tested on a Mac |
All downloads: SoundCraft releases (there is also a FreeBSD tar.gz; set SOUNDCRAFT_DIR to it). Anywhere else: set SOUNDCRAFT_DIR (folder, .tar.gz root or SoundCraft.app) or SOUNDCRAFT_CLI.
macOS: the DMG contains only the app. Unzip the separate
soundcraft-clizip and movesoundcraft-clito/usr/local/bin(or pointSOUNDCRAFT_CLIat it). The first run checks Apple's notarization online.Linux: the AppImage and Flatpak contain only the app, not
soundcraft-cli; use the deb, rpm or tar.gz. For an AppImage app, setSOUNDCRAFT_APPsoopen_in_soundcraftcan start it. On a server without a GPU, the verified setup usedlibxkbcommon0 libvulkan1 libegl1 mesa-vulkan-drivers libasound2 fontconfig.
How it works
Part | What it is |
SoundCraft engine ( | SoundCraft's own engine: tracks, clips, MIDI, the built-in plugins, mixer, busses, automation, AudioSuite processing and the WAV / AIFF / FLAC / MIDI / .scraft writers. Started fresh and headless for each job, so it never touches the SoundCraft app or its audio devices. |
MCP server (Node.js) | 10 high-level tools. Builds sessions from a simple description (tracks, clips at seconds, notes in beats, effects, sends), checks every output first, measures the mix (peak, true peak, integrated LUFS) and draws a waveform picture of the result so the assistant can see it. |
Live app (optional) |
|
Tools
Tool | What it does |
| A multitrack session: audio tracks from files placed at times (clip gain, fades), instrument tracks played by the subtractive synth, the General MIDI drum synth or a sampler from notes in beats (with loops), MIDI files, volume, pan, mute, solo, insert effects, sends to aux busses, tempo, meter, key, markers. Writes the mixdown, stems, MIDI and the .scraft session, with peak, LUFS and a waveform |
| A .scraft session changed: tempo, meter, key, markers, busses, new tracks, existing tracks renamed, re-mixed, with new effects and sends, or removed; written as a new copy and mixdown |
| One session, a list or a folder → WAV / AIFF / FLAC mixdown (range, normalize, bit depth), stems, MIDI, with loudness |
| Audio files (one, a list or a folder): trim, normalize, gain, reverse, invert, pitch shift, time stretch, varispeed, effects, fades, volume and pan → WAV, AIFF or FLAC |
| Audio files → WAV, AIFF or FLAC, sample rate, bit depth, normalize |
| Format, channels, rate, bit depth and length of audio files or the tracks of a session; optionally loudness (peak, true peak, LUFS) and a waveform |
| 469 commands, the 27 plugins with every parameter (id, range, unit), drum note names, formats |
| Any engine commands plus |
| Open a session (or the demo song) in the SoundCraft app, optionally with the control channel |
| Platform, installation, version, commands, plugins, Pro Tools coverage, app / control port |
Reads | WAV, AIFF, FLAC, MP3, OGG, M4A/AAC, ALAC, CAF, Standard MIDI Files, .scraft sessions |
Writes | WAV, AIFF, FLAC (16 / 24-bit, 32-bit float), stems, MIDI, .scraft sessions (audio copied into "Audio Files") |
Times are seconds; notes are in beats (quarter notes) from the start of their clip. Pitches are MIDI numbers, names like C4 / F#3 / Bb2, or, for drum_synth, kick, snare, clap, hat, open_hat, low_tom, mid_tom, high_tom, crash, ride.
Example
{
"name": "Night drive",
"tempo": 100,
"key": "A minor",
"busses": [{ "name": "Verb", "effects": [{ "plugin": "plate_reverb", "params": { "mix": 30 } }] }],
"markers": [{ "name": "Intro", "at": 0 }, { "name": "Chorus", "at": 9.6 }],
"tracks": [
{ "type": "instrument", "name": "Drums", "instrument": "drum_synth", "bars": 1, "repeat": 8,
"notes": [{ "pitch": "kick", "start": 0 }, { "pitch": "hat", "start": 0.5, "length": 0.5 }, { "pitch": "snare", "start": 1 },
{ "pitch": "hat", "start": 1.5, "length": 0.5 }, { "pitch": "kick", "start": 2 }, { "pitch": "snare", "start": 3 }] },
{ "type": "instrument", "name": "Bass", "volume_db": -4, "pan": -0.2, "sends": [{ "bus": "Verb", "level_db": -14 }],
"notes": [{ "pitch": "A1", "start": 0, "length": 2 }, { "pitch": "F1", "start": 2, "length": 2 }], "repeat": 4 },
{ "type": "audio", "name": "Voice", "files": [{ "path": "C:\\Audio\\voice.wav", "at": 4.8 }], "fade_in": 0.3, "fade_out": 1,
"effects": [{ "plugin": "eq_7band", "params": { "hpf_on": 1, "hpf_freq": 90 } }, { "plugin": "compressor", "params": { "threshold": -18, "ratio": 3 } }] }
],
"formats": ["wav", "stems", "mid", "scraft"],
"normalize": true,
"output_dir": "C:\\Music"
}Requirements
SoundCraft with
soundcraft-cli(tested with 0.6.1); see PlatformsNode.js ≥ 20 (bundled with Claude Desktop for
.mcpbinstalls)
Installation
Claude Desktop (recommended, all platforms)
Download
soundcraft-mcp-server.mcpbfrom the latest release.Double-click it (or drag it into Claude Desktop → Settings → Extensions) and click Install.
Optional: if SoundCraft is not in a standard location, fill in its folder or the
soundcraft-clipath in the extension settings.
Sunsam Code
Install SoundCraft Bridge from the Sunsam Code marketplace, or drop the .mcpb into MCP → Install extension.
Codex (OpenAI)
Recommended — the marketplace (gets updates): Plugins → Add → Add marketplace, source jhonsu01/craft-marketplace, reference main, then install SoundCraft Bridge from Craft Bridges (craft-marketplace). New versions arrive by refreshing the marketplace. Or upload the zip (Codex then keeps it in your account and refuses a newer zip with the same name):
Download
soundcraft-mcp-server-<version>-codex.zipfrom the latest release.In Codex: Plugins → Add → New plugin, choose the zip and click Add plugin.
Codex starts the server with
node, so Node.js ≥ 20 must be onPATH. If SoundCraft is not in a standard location, setSOUNDCRAFT_DIRorSOUNDCRAFT_CLIas system environment variables (Codex has no settings form for local plugins).
DeepSeek Harness
Plugins → Add plugin, enter
github:jhonsu01/craft-marketplace#path:/plugins/soundcraft-mcp-serverand click Install, then Enable now.Harness runs the server with its own MCP client and
node(Node.js ≥ 20 onPATH); the tools appear asmcp__soundcraft__<tool>and the output files as cards that open in Harness.Harness does not update plugins by itself yet: to upgrade, uninstall the plugin and install it again with the same address.
Claude Code / other MCP clients
git clone https://github.com/jhonsu01/soundcraft-mcp-server.git
cd soundcraft-mcp-server
npm install
npm run buildWindows:
claude mcp add soundcraft -- node "%CD%\dist\bundle.cjs"macOS / Linux:
claude mcp add soundcraft -- node "$PWD/dist/bundle.cjs"Configuration
Variable | Meaning |
| SoundCraft folder, one of its executables, a |
| Path of |
| Path of the desktop app when it lives elsewhere (e.g. a Linux AppImage) |
| Control port of the desktop app (default 7801) |
| Maximum seconds per engine call (default 3600) |
Safety
Files are never overwritten unless
overwrite: true: a free name (_2) is used in folders and an existingoutput_pathis an error. Inputs are only read; an edited file is saved only as a new copy (_edited).All paths must be absolute. The engine runs headless and never touches the SoundCraft app unless
live: true.Everything runs locally with no network access. Each job uses a private engine in a temporary folder that is deleted at the end.
Development
npm run build # TypeScript + single-file bundle (dist/bundle.cjs)
npm test # unit tests (Windows, macOS and Linux path logic)
npm run test:e2e # 27 end-to-end checks (29 with `E2E_LIVE=1`) over real MCP stdio (synthetic audio)
npm run pack:mcpb # soundcraft-mcp-server.mcpb
npm run pack:codex # Codex / DeepSeek Harness plugin zipLinux test in Docker (unpack soundcraft-<version>-linux-x86_64.tar.gz first):
docker run --rm -v "$PWD:/work:ro" -v "/path/to/soundcraft-0.6.1-linux-x86_64:/opt/soundcraft:ro" -e SOUNDCRAFT_DIR=/opt/soundcraft -w /work node:22-bookworm bash -c "apt-get update && apt-get install -y libxkbcommon0 libvulkan1 libegl1 mesa-vulkan-drivers libasound2 fontconfig && node scripts/e2e.mjs"License
Apache-2.0. SoundCraft is © its authors (Storytold), MIT or Apache-2.0. This project is not affiliated with or endorsed by SoundCraft or Storytold. Pro Tools is a trademark of Avid.
Available Tools
10 toolsconvert_audioConvert audio filesB
Convert audio files (one, a list or a folder; WAV, AIFF, FLAC, MP3, OGG, M4A/AAC, ALAC, CAF in) to WAV, AIFF or FLAC, optionally changing the sample rate and bit depth or normalizing, with SoundCraft's converter.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | wav | |
| suffix | No | ||
| bit_depth | No | ||
| input_dir | No | Every audio file directly in this folder. | |
| normalize | No | ||
| overwrite | No | Replace existing outputs. | |
| input_path | No | ||
| output_dir | No | Absolute output folder (default: next to the input; required for new files). | |
| input_paths | No | ||
| output_path | No | Absolute output file for the first format (its extension must match). | |
| sample_rate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, not open-world, not idempotent, not destructive). The description adds useful operational context — accepted input formats, target formats, and the fact that it delegates to SoundCraft's converter — but does not disclose overwrite semantics, where outputs land, or whether existing files are affected, which matters for a tool that writes to disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence led by the verb, with no filler. It is dense with parenthetical format lists but every clause carries information; the only mild cost is readability from packing all options into one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter write tool with no output schema and only 36% schema coverage, the description covers the core conversion story but omits output behavior (where files are written, what is returned) and several parameters. It is adequate to attempt a call but incomplete for confident edge-case handling like overwriting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 36%, so the description must compensate, and it partially does: it clarifies input cardinality (one, a list, or a folder, mapping to input_path/input_paths/input_dir) and names sample rate, bit depth, and normalize. However it says nothing about suffix, overwrite, or output_path/output_dir semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (convert) and resource (audio files), and enumerates accepted input formats (WAV, AIFF, FLAC, MP3, OGG, M4A/AAC, ALAC, CAF) and target formats (WAV, AIFF, FLAC), plus its optional transformations. It clearly describes the operation, though it never explicitly distinguishes itself from the sibling process_audio, leaving some ambiguity about which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains optional capabilities (sample rate, bit depth, normalizing) but gives no guidance on when to use this tool versus process_audio or export_session, nor any prerequisites or exclusions. Usage is only weakly implied by the verb 'convert'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sessionCreate a multitrack sessionB
Build a song, podcast or soundtrack with SoundCraft (a Pro Tools-class DAW) and mix it down: audio tracks from files placed at times (clip gain, fades), instrument tracks played by the built-in subtractive synth, General MIDI drum synth or a sampler from notes in beats, imported MIDI files, per-track volume, pan, mute, solo, insert effects (EQ, compressor, reverb, delay, chorus, saturation...) and sends to aux busses, tempo, meter, key and markers. Writes the mixdown (wav, aiff, flac), the stems, the MIDI and the editable .scraft session, reports peak and integrated loudness (LUFS) and returns a waveform picture of the mix.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Bounce up to this time (seconds; default the end of the last clip). | |
| key | No | Key, e.g. "C major", "A minor". | |
| name | No | File name without extension. | session |
| start | No | Bounce from this time (seconds; default the session start). | |
| tempo | No | Tempo in BPM (default 120). | |
| busses | No | Aux busses (e.g. a shared reverb) that tracks send to. | |
| tracks | Yes | ||
| formats | No | Outputs: wav / aiff / flac (the mixdown), scraft (the editable SoundCraft session; its audio is copied into an "Audio Files" folder beside it), mid (the MIDI of the instrument tracks) and stems (one file per track, in a <name>_stems folder). | |
| markers | No | Markers (seconds). | |
| preview | No | Return a waveform picture of the mix. | |
| bit_depth | No | Bit depth of wav / aiff / flac / stems (flac: 16 or 24). | 24 |
| normalize | No | Normalize the mixdown to -0.1 dBFS peak. | |
| overwrite | No | Replace existing outputs. | |
| output_dir | No | Absolute output folder (default: next to the input; required for new files). | |
| output_path | No | Absolute output file for the first format (its extension must match). | |
| sample_rate | No | ||
| meter_numerator | No | Time signature top (default 4). | |
| meter_denominator | No | Time signature bottom (default 4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-destructive, non-idempotent operation, so the mutation profile is covered. The description adds genuinely useful behavior beyond that: it discloses exactly which files are written (wav/aiff/flac, stems, MIDI, editable .scraft session) and that it reports peak and integrated LUFS plus returns a waveform picture, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the opening clause, which is good. However, the description is a single sprawling run-on sentence that enumerates nearly every field the schema already documents, so much of its length does not earn its place and hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with no output schema, the description does well by describing the return artifacts (mix files, stems, MIDI, LUFS, waveform image). It omits nuance around overwrite/output path behavior, but those are covered by parameter descriptions, so nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so the schema itself already documents nearly every parameter, giving a baseline of 3. The description usefully ties the parameter surface to a workflow (clip gain, fades, sends to aux busses, tempo, meter, key, markers) but adds no syntax, defaults, or constraints beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Build a song, podcast or soundtrack with SoundCraft... and mix it down') and enumerates the concrete artifacts it produces (mixdown, stems, MIDI, .scraft, LUFS report). It is clear what the tool does, but it never distinguishes itself from siblings like export_session (which also produces mixdowns) or edit_session, so an agent must infer the create-from-scratch scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative. With siblings like edit_session, export_session, and run_soundcraft_commands available, the agent gets no rule for choosing this tool over them; the create-from-scratch scenario is only weakly implied by 'Build a song... and mix it down'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_sessionEdit a SoundCraft sessionA
Open a .scraft session (or start from audio files) and change it: tempo, meter, key, markers, busses, add tracks (audio, instrument, MIDI file), change existing tracks by name (rename, volume, pan, mute, solo, add effects and sends), remove tracks, then write a new mixdown, stems, MIDI or a new copy of the session. The original session is never changed.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Bounce up to this time (seconds; default the end of the last clip). | |
| key | No | Key, e.g. "C major", "A minor". | |
| start | No | Bounce from this time (seconds; default the session start). | |
| tempo | No | Tempo in BPM (default 120). | |
| busses | No | Aux busses (e.g. a shared reverb) that tracks send to. | |
| suffix | No | Added to the input name for outputs. | _edited |
| formats | No | Outputs: wav / aiff / flac (the mixdown), scraft (the editable SoundCraft session; its audio is copied into an "Audio Files" folder beside it), mid (the MIDI of the instrument tracks) and stems (one file per track, in a <name>_stems folder). | |
| markers | No | Markers (seconds). | |
| preview | No | ||
| bit_depth | No | Bit depth of wav / aiff / flac / stems (flac: 16 or 24). | 24 |
| normalize | No | Normalize the mixdown to -0.1 dBFS peak. | |
| overwrite | No | Replace existing outputs. | |
| add_tracks | No | ||
| input_path | Yes | Absolute .scraft session. | |
| output_dir | No | Absolute output folder (default: next to the input; required for new files). | |
| output_path | No | Absolute output file for the first format (its extension must match). | |
| change_tracks | No | Changes to existing tracks; `name` renames. | |
| remove_tracks | No | Names of tracks to delete. | |
| meter_numerator | No | Time signature top (default 4). | |
| meter_denominator | No | Time signature bottom (default 4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, and the description corroborates the key safety claim with a strong, explicit statement: "The original session is never changed." It also discloses that outputs are written (mixdown, stems, MIDI, new session copy), which is useful context beyond the flags. It omits the preview default-of-true and the confirmation/overwrite behavior, so it is helpful but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and followed by a one-sentence guarantee about the original session. The long middle sentence is dense but each clause maps to real capability, so little is wasted; it is only slightly list-heavy for a description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter, deeply nested mutation tool with no output schema, the description covers the essential mental model: what gets modified, what gets produced, and that the input is preserved. Remaining details (preview, output_dir being required for new files, overwrite semantics) live in the well-covered schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already documents nearly every parameter, including the default output formats and the name-based track addressing. The description's contribution is an inventory of the changeable categories (tempo, meter, key, markers, busses, tracks, outputs) rather than syntax or format detail, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (open/change/edit) and resource (a .scraft SoundCraft session) and then enumerates the full edit surface: tempo, meter, key, markers, busses, add/change/remove tracks, and output writing. This makes it unmistakably distinct from create_session (new session) and export_session (write-only) without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context – it applies to an existing session or to starting a project from audio files – and implies the edit-then-render workflow. It never states when to prefer a sibling such as export_session or process_audio, nor any exclusions, so it lands at clear-context-without-alternatives rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_sessionExport SoundCraft sessionsA
Mix down one .scraft session, a list or every session in a folder: wav / aiff / flac mixdown (range, normalize, bit depth), stems (one file per track), MIDI, with peak and loudness (LUFS) of each mix.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Bounce up to this time (seconds; default the end of the last clip). | |
| start | No | Bounce from this time (seconds; default the session start). | |
| formats | No | Outputs: wav / aiff / flac (the mixdown), scraft (the editable SoundCraft session; its audio is copied into an "Audio Files" folder beside it), mid (the MIDI of the instrument tracks) and stems (one file per track, in a <name>_stems folder). | |
| preview | No | Return a waveform picture of the first mix. | |
| bit_depth | No | Bit depth of wav / aiff / flac / stems (flac: 16 or 24). | 24 |
| input_dir | No | Every .scraft directly in this folder. | |
| normalize | No | Normalize the mixdown to -0.1 dBFS peak. | |
| overwrite | No | Replace existing outputs. | |
| input_path | No | ||
| output_dir | No | Absolute output folder (default: next to the input; required for new files). | |
| input_paths | No | ||
| output_path | No | Absolute output file for the first format (its extension must match). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive write (readOnlyHint=false, destructiveHint=false), lowering the burden. The description usefully adds output composition, e.g. stems land in a <name>_stems folder and scraft copies audio into an 'Audio Files' folder, plus normalize-to--0.1 dBFS and LUFS reporting. It does not address overwrite semantics, permissions, or failure behavior, so it adds moderate context but not rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence led by the verb 'Mix down', with parentheticals and slashes packing detail efficiently and no filler. It is slightly dense to parse, but every clause contributes information and nothing is redundant with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters, no required fields, and no output schema, the description still conveys the modes, the output formats, and the return information (peak and LUFS of each mix). It leaves the input_path vs input_paths vs input_dir selection and the first-format-only output_path behavior to the schema, but overall it is adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema documents most parameters (range, bit depth, normalize, overwrite, output_dir). The description echoes the key ones (range, normalize, bit depth, stems) without adding syntax or constraints beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('mix down') and resource ('one .scraft session') and enumerates the three input modes (single session, list, folder) plus the concrete output types (wav/aiff/flac, stems, MIDI, LUFS reporting). It is clearly an export/render operation distinct from edit_session or create_session. It stops short of explicitly contrasting with convert_audio, which is the nearest ambiguous sibling, so it earns a 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The three modes imply when each path parameter is relevant, but the description never states explicit when-to-use/when-not guidance or names an alternative (e.g., convert_audio for format-only changes). Usage is only inferable from the phrasing, matching the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audio_infoAudio file or session infoBRead-onlyIdempotent
Format, channels, sample rate, bit depth and length of audio files, or the tracks, clips, plugins, busses, markers and tempo of a .scraft session. With loudness=true also the peak, true peak and integrated loudness (LUFS); with waveform=true a picture of it.
| Name | Required | Description | Default |
|---|---|---|---|
| loudness | No | Measure peak, true peak and LUFS (renders the audio once). | |
| waveform | No | Return a waveform picture of the first file. | |
| input_dir | No | ||
| input_path | No | ||
| input_paths | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is covered. The description does add real behavioral context beyond the annotations — loudness=true "renders the audio once" (a cost side effect) and waveform=true returns a picture of only the first file — but omits batch behavior and the 200-item cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler, front-loading the returned fields before the optional flags. Every clause carries information, though the first sentence is long enough to be slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description has to carry the return-value burden, and it does list the field categories. However, it says nothing about how inputs are selected (dir vs path vs array) or the shape/nesting of the result, which an agent needs for a 5-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%, and the three undocumented parameters (input_dir, input_path, input_paths) are the ones that actually control what gets inspected — yet the description never explains the difference between them or what happens when the multiple-path array is used. The loudness/waveform explanations largely restate what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource and the fields returned: format, channels, sample rate, bit depth, length for audio files, and tracks/clips/plugins/busses/markers/tempo for .scraft sessions. This clearly distinguishes it from siblings like get_soundcraft_status or list_soundcraft_catalog. It lacks an explicit verb ("get"/"inspect"), but the enumeration makes the capability unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It describes what the loudness and waveform flags do, which implies when to enable them, but never states when to prefer this tool over alternatives or what preconditions apply (e.g., must the file exist, does it need SoundCraft open?). No exclusions or sibling routing are given, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_soundcraft_statusSoundCraft statusARead-onlyIdempotent
Check the SoundCraft installation: platform, executables, version, engine commands, built-in plugins, Pro Tools feature coverage, formats, whether the app is running / listening for control.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds one useful behavioral signal — that it reports whether the app is currently running and listening for control, i.e., live state rather than static config — but says nothing about behavior when SoundCraft is absent or the output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, followed by a tight colon-delimited list of inspected facets. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description effectively enumerates what the response covers (platform, version, plugins, formats, running state), which largely substitutes for one. It falls short only on error/edge behavior, e.g., what is returned when SoundCraft is not installed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the enumerated check list is informational rather than parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('SoundCraft installation') and then enumerates the exact facets inspected: platform, executables, version, engine commands, plugins, Pro Tools coverage, formats, and running/listening state. This is clearly distinguishable from siblings like list_soundcraft_catalog or run_soundcraft_commands, which act on content rather than installation health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the preflight/diagnostic call to make before run_soundcraft_commands or open_in_soundcraft, but the description never says when to use it or when to prefer a sibling. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_soundcraft_catalogList commands, plugins, drums, formatsARead-onlyIdempotent
What SoundCraft can do: commands (the engine commands with parameters and menu place, for run_soundcraft_commands), plugins (the built-in effects and instruments with every parameter id, range and unit, for effects and instrument_params), drums (the drum_synth note names) and formats (read and write).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| filter | No | Case-insensitive text to match (id, label, menu or category). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing behavioral beyond content scope — no note on result size, caching, or whether the catalog is static. It is a passive static-data read, so little is needed, but the description itself contributes no extra behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the tool's overall purpose and then cleanly partitioned by kind. The nested parentheticals are dense and require careful reading, but every clause carries information — there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, closed-world, read-only catalog with no output schema, the description tells the agent what content each kind returns and which downstream tool consumes it. It omits only the concrete shape/size of the returned structure, which is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%; the 'kind' enum has no per-value description in the schema, and the description compensates by explaining what each of the four enum values actually yields and why it matters. That is genuine added meaning beyond the schema, though the 'filter' parameter is left entirely to the schema and no matching semantics are elaborated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'What SoundCraft can do' and enumerates exactly what each of the four kinds returns (commands with parameters/menu place, plugins with parameter id/range/unit, drum note names, formats). An agent can tell it is a read-only catalog lookup distinct from the action siblings like run_soundcraft_commands or open_in_soundcraft. It never uses a crisp verb like 'List/Return', which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly gives usage by naming the consumers of each kind ('for run_soundcraft_commands', 'for `effects` and `instrument_params`'), which tells an agent why it would fetch a given kind. But it never states when to call this versus the sibling tools, whether it should be called before running commands, or when the filter is worth using. Usage is implied rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_in_soundcraftOpen in SoundCraftA
Open a .scraft session in the SoundCraft desktop app to listen and keep editing by hand. With control=true the app also starts its loopback-only control channel so run_soundcraft_commands live=true can drive it (play, edit, screenshots).
| Name | Required | Description | Default |
|---|---|---|---|
| demo | No | Open the built-in demo song instead. | |
| path | No | Absolute .scraft session to open (default: an empty session). | |
| control | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: opening launches a GUI, and control=true starts a loopback-only control channel (a security-relevant detail). Annotations already cover the safety profile (non-read-only, non-destructive, not idempotent), but the description doesn't say what happens if the app is already open or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, front-loaded with the core action before the conditional control-channel detail. Nothing repeated from title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should carry the burden of return behavior, and it does not state what the tool returns or what happens on failure/already-running app. Everything else an agent needs to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the control parameter has no schema description at all; the description compensates by explaining exactly what control=true does (starts the control channel enabling live driving). demo and path already carry schema descriptions, so this is additive rather than duplicative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Open a .scraft session in the SoundCraft desktop app') with scope ('to listen and keep editing by hand'), clearly distinguishing it from create_session/edit_session siblings that manipulate sessions without launching the desktop app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly and the condition that selects it: with control=true, run_soundcraft_commands live=true can drive the app. An agent can decide between this tool and run_soundcraft_commands without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_audioProcess audio filesB
Run audio files (one, a list or a folder) through SoundCraft: trim, AudioSuite processing (normalize to a peak, gain, reverse, invert, pitch shift in semitones, time stretch keeping the pitch, varispeed), insert effects (EQ, compressor, gate, de-esser, maximizer, reverb, delay, chorus, flanger, phaser, saturation, lo-fi...), fades, volume and pan, then write WAV, AIFF or FLAC at any bit depth, with peak and loudness (LUFS). Inputs are only read.
| Name | Required | Description | Default |
|---|---|---|---|
| pan | No | ||
| speed | No | Varispeed (pitch and length change together): 2 = twice as fast. | |
| format | No | wav | |
| invert | No | Invert the polarity. | |
| suffix | No | _processed | |
| effects | No | Insert effects, in order (rendered into the output). | |
| fade_in | No | ||
| gain_db | No | ||
| preview | No | Return a waveform picture of the first result. | |
| reverse | No | ||
| stretch | No | Time stretch keeping the pitch: 2 = twice as long. | |
| fade_out | No | ||
| trim_end | No | Keep up to this time (seconds). | |
| bit_depth | No | 24 | |
| input_dir | No | Every audio file directly in this folder. | |
| overwrite | No | Replace existing outputs. | |
| volume_db | No | ||
| input_path | No | ||
| output_dir | No | Absolute output folder (default: next to the input; required for new files). | |
| trim_start | No | Keep from this time (seconds). | |
| input_paths | No | ||
| output_path | No | Absolute output file for the first format (its extension must match). | |
| sample_rate | No | Output rate (default: the file's own). | |
| normalize_db | No | Normalize the peak to this level (dBFS), before the effects. | |
| pitch_semitones | No | Pitch shift keeping the length. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description usefully clarifies that 'Inputs are only read', which softens the readOnlyHint=false flag by telling the agent the source files are untouched. It stops short of explaining overwrite behavior, re-run/idempotency semantics, or failure handling for the many-file case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, which is good, but the tool's identity is delivered as one very long sentence with two dense parenthetical catalogues of effects and formats. The plugin enumerations duplicate content already in the schema's plugin field, and breaking the pipeline into ordered steps would be far more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter tool with no output schema and 56% coverage, the description should do more. It conveys the overall pipeline shape but omits how outputs are named/located (suffix, output_dir vs output_path vs output_path), what happens with multiple inputs and multiple formats, and the default preview behavior, all of which an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 56% across 25 parameters, so the schema carries much but not all of the load. The description's capability list (trim, normalize, gain, reverse, invert, pitch shift, time stretch, varispeed, effects) maps loosely onto parameter names but adds no units, defaults, or interaction rules, so it only partially compensates for the undocumented half.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run files through SoundCraft) and enumerates the concrete capability set: trim, AudioSuite processing, insert effects, fades, volume/pan, and encoding to WAV/AIFF/FLAC. It reads as a full processing pipeline rather than a tautology. However it never names or contrasts with the nearest siblings (convert_audio, run_soundcraft_commands, edit_session), so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named despite clear overlap with convert_audio and run_soundcraft_commands. The only routing hint is the implicit 'processor, not editor' framing, which the agent has to derive from the capability list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_soundcraft_commandsRun SoundCraft engine commandsADestructive
Advanced: run any SoundCraft engine commands in order (session., file., edit., track., clip., mix., automation., event. (tempo, meter, key, MIDI edits), midi., markers., audiosuite.process...) plus the engine tools new_session / open_session / import_audio / inspect_session / bounce_mix / save_session (step id = the tool name), on a new or an opened session, then write outputs. Positions are samples, {"seconds": x} or "bars_beats:5|1|000". Parameters can use "$steps[N].field" for a value returned by step N (0-based). With live=true the steps drive the open SoundCraft app instead.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | Drive the open SoundCraft app (control port 7801) instead of a headless engine. | |
| name | No | soundcraft | |
| steps | No | ||
| formats | No | Write the result (needs output_dir or output_path). | |
| bit_depth | No | 24 | |
| normalize | No | ||
| open_path | No | Absolute .scraft session to open first (never saved over; write a copy with formats). | |
| overwrite | No | ||
| output_dir | No | ||
| output_path | No | ||
| sample_rate | No | New session rate when there is no open_path. | |
| stop_on_error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description adds real behavior beyond that: sequential execution, live=true driving the open app vs a headless engine, and the guarantee that open_path is never saved over. It still does not explain overwrite or stop_on_error semantics, but the additions are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, but it is front-loaded with the 'Advanced: run any ... in order' framing and nearly every clause carries non-obvious information. The malformed quoting around the bars_beats example and the run-on length keep it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, destructive, no-output-schema tool the description covers the hard parts (ordering, step references, positions, live mode, open_path safety) but omits error handling and overwrite behavior and leaves a third of the parameters unexplained. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate, and it does for live, steps, and output writing by documenting the '$steps[N].field' chaining syntax and the position formats (samples, {"seconds": x}, bars_beats) that appear nowhere in the schema. Several parameters (bit_depth, normalize, overwrite, stop_on_error, sample_rate) remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run SoundCraft engine commands in order) and enumerates the command namespaces and engine-tool step ids, so the agent knows exactly what it executes. It does not, however, contrast itself against siblings like edit_session or process_audio, which overlap with the step ids it lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Advanced:' prefix implies this is the heavyweight option and listing engine tools as steps hints at the relationship to siblings, but there is no explicit when-to-use / when-not or routing statement (e.g. 'prefer create_session for a simple new session'). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.0.0- First observed
convert_audio - First observed
create_session - First observed
edit_session - First observed
export_session - First observed
get_audio_info - First observed
get_soundcraft_status - First observed
list_soundcraft_catalog - First observed
open_in_soundcraft - First observed
process_audio - First observed
run_soundcraft_commands
TDQS
Scored across 10 tools
Most tools target distinct lifecycle stages: create_session builds new, edit_session modifies existing, export_session only mixes down, process_audio transforms files, convert_audio changes formats. The main ambiguity is run_soundcraft_commands, a raw escape hatch that overlaps nearly everything, and export_session's mixdown overlaps the export capability embedded in create_session/edit_session, but the detailed descriptions keep boundaries usable.
Nearly all names follow a clean verb_noun snake_case pattern (edit_session, create_session, export_session, process_audio, convert_audio, get_audio_info, list_soundcraft_catalog, run_soundcraft_commands, get_soundcraft_status). The only minor deviation is open_in_soundcraft, which uses verb_prep_noun. Consistency is strong overall.
10 tools is well-scoped for a Pro Tools-class DAW server, covering the full lifecycle without bloat. Each tool earns its place, and run_soundcraft_commands provides depth without inflating the surface.
The surface covers create/edit/export of sessions, audio processing, format conversion, inspection, capability discovery, live app control, and status checks. The raw run_soundcraft_commands plus catalog tool act as escape hatches for any missing granular operations, leaving no obvious dead ends.
Maintenance
Related MCP Connectors
Transcribe audio and video with Speechmatics speech-to-text from Claude and any MCP client.
Audio for your agent: transcribe, speak, translate, summarise, plus sound effects and music.
Audio and video tools for your AI assistant: remove noise, enhance voices, transcribe, and more.
Edit DAW sessions; convert Logic/Ableton/FL/PT/REAPER/Cubase/Dorico; stems, transcribe, generate
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables semantic search of local audio samples by describing sounds, MIDI generation, stem separation, and other music production tools from Claude Desktop.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables chat-driven audio analysis and enhancement using local Claude, including denoising, EQ, compression, and loudness normalization, with an A/B viewer for synchronized comparison.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables Claude to analyze and repair audio files by viewing spectrograms, measuring noise, and applying fixes like healing hums or isolating speakers, all with undoable operations and without uploading audio.-
- AlicenseNot gradedqualityCmaintenanceEnables Claude Desktop to drive FL Studio 2025 and 2026 through natural language, diagnosing and repairing mixes, configuring plugins, writing notes and chords in any scale, exporting arrangements to MIDI, and analyzing audio for tempo, key, and melody.MIT