Skip to main content
Glama

openDAW MCP

CI Docs License: Apache-2.0 PyPI OpenSSF Scorecard MCP Tools Skills DSP Scripts Tests Examples Python Lint MCP Registry Smithery Glama LangChain + AutoGen + CrewAI Sponsor

547 MCP tools for agent-native control of openDAW — a browser-based digital audio workstation.

This project wraps openDAW's internal box system and project API behind a Model Context Protocol server, allowing AI agents (Claude, GPT, Hermes, etc.) to create and manipulate music projects programmatically — tracks, instruments, effects, MIDI, automation, audio regions, rendering, and more.

⭐ Star this repo if it's useful — it helps others discover it!

Quick numbers

547 MCP tools

226 Python examples

134 DSP scripts

12 agent skills

3 framework wrappers

6139 unit + E2E tests

7 stem separation modes

0 ruff errors

30-second demo

from opendaw_mcp.server import OpendawServer

server = OpendawServer()
await server.bridge.start()

# Full drum beat in one call (kick|snare|hihat, 16 steps each)
await server.mcp_opendaw_create_drum_pattern(
    pattern="x...x...x...x...|o.......o.....o.|..x...x...x...x.", unit_index=0
)

# Synth + reverb
await server.mcp_opendaw_create_synth_track(name="Lead")
await server.mcp_opendaw_add_effect(unit_index=1, effect_type="Dattorro")

# Render to WAV
await server.mcp_opendaw_render_full(output_path="beat.wav")

Why opendaw-mcp?

The only fully headless, zero-license MCP server for music production. No DAW license, no desktop, no GUI — runs in Docker, CI, and cloud.

Comparison with Ableton-MCP competitors

Feature

opendaw-mcp

ahujasid/ableton-mcp

Producer Pal

OSC-based MCPs

License required

None (free)

Ableton Live 10+ ($99+)

Ableton Live

Varies

Headless / server

✅ Docker, CI, cloud

❌ Desktop only

❌ Desktop only

⚠️ Needs Live running

Tool count

543

~10

~15

~5-10

Tool annotations

✅ readOnly + destructive

❌

❌

❌

Scriptable DSP

✅ Custom JS effects

❌

❌

❌

Stem separation

✅ 7 models (GPU local)

❌

❌

❌

Suno → DAW pipeline

✅ End-to-end

❌

❌

❌

Genre templates

✅ 8 genres

❌

❌

❌

Agent skills

✅ 12 skills

❌

❌

❌

Render with LUFS target

✅ (-14, -16, custom)

❌

❌

❌

dawproject export

✅ Ableton/Bitwig

❌

❌

❌

Lite agent profile

✅ 39 tools

❌

❌

❌

Phase-based tool loading

✅ inspect/compose/mix/render

❌

❌

❌

Bridge benchmarks

✅ p50/p95 in CI

❌

❌

❌

GitHub stars

—

2.8k

—

—

Our moat: fully headless, zero-cost, 547 tools, runs anywhere. Every competitor requires a paid DAW running on a desktop.

Related MCP server: ableton-live-mcp

How It Works

AI Agent ──MCP──▶ Python Server ──Playwright──▶ Headless Chromium ──▶ openDAW (Vite dev server)

The MCP server launches a headless Chromium instance loaded with openDAW, then communicates via page.evaluate() calls into the DAW's V8 context. Every tool performs real operations on the live project — no stubs, no mocks.

Features

  • Track & Region CRUD — create/delete/move audio, note, and automation tracks with regions

  • Instrument Control — Vaporisateur ( polysynth), Nano, Tape, Soundfont, Playfield (drum machine), MIDI output

  • Effects — Delay, Reverb, Compressor, Equalizer, Saturation, Waveshaper, Stereo, Vocoder, NeuralAmp, Maximizer

  • MIDI Effects — Arpeggio, Pitch, Velocity, Zeitgeist, Spielwerk (scriptable)

  • Scriptable Devices — Apparat (instrument), Werkstatt (audio effect), Spielwerk (MIDI effect) with JS code compilation, full @param mapping metadata, and range-validated parameter setting

  • Automation — event creation, interpolation modes, tempo/signature changes

  • Audio Operations — region fades, gain, time/pitch stretch, warp markers, play modes

  • Mixing — send/return routing, buses, volume, solo/mute, mixer state inspection

  • Rendering — offline stem export with LUFS targeting, full mix render

  • Clips — session view clip CRUD, clone, consolidate, playback settings

  • Groove — groove shuffle amount and duration control

  • Presets — export/import audio unit presets, effect chain presets

  • Transfer — move regions and audio units between projects

  • Project Info — tempo map conversion (PPQN↔seconds), duration, validation, sample listing

  • Notes — pitch range, overlapping detection, advanced properties (chance, cent, playCount, playCurve)

  • Modular System — voltage modules (Gain, Delay, Multiplier, AudioInput, AudioOutput), patch cable connections

  • Piano Mode — global transpose, keyboard type, note scale, time range

  • Project & Bus Metadata — creation date, signature, AU/track count, bus labels and colors

  • Debugging & Control — screenshots, condition polling, raw JS evaluation

Agent Skills

The skills/ directory contains structured skill files for AI agents (Hermes, Claude, etc.) that describe how to use the 547 MCP tools effectively. Each skill covers a specific domain and includes decision points so the agent can adapt to any genre or workflow.

Skill

Domain

Description

adaptive-mix-mastering

Mix → Master pipeline

Universal pipeline with decision points: genre detection, stem strategy, effect chain selection, LUFS targeting, mastering approach. Adapts to coldwave, techno, hip-hop, ambient, rock, pop. Includes references/decision-tree.md.

suno-to-opendaw

Suno → openDAW E2E

Killer workflow: Suno AI generation → SOTA stem separation (7 modes) → openDAW import → arrange → mix → master → export. 6-stage pipeline from prompt to finished track. Unique value prop — no other MCP server offers this.

dsp-script-authoring

Custom DSP writing

How to author custom Werkstatt/Apparat/Spielwerk DSP scripts. Processor API, @param/@sample declarations, DSP patterns (filters, saturation, reverb, LFO, envelope), validation workflow, 8 critical pitfalls. For writing new DSP, not using existing.

opendaw-automation

API reference

547 MCP tools full reference, bridge architecture, pitfalls, DSP script library (134 scripts), CodeRabbit review patterns. The base skill — others cross-reference it.

opendaw-track-architecture

Track structure

Tracks, regions, clips, notes, tempo, time signature, markers, groove, song form. 50+ tools for building the skeleton of a track.

opendaw-sound-design

Instruments + DSP

Built-in instruments (Vaporisateur, Playfield, Nano, Tape, Soundfont) + 33 scriptable DSP scripts (Werkstatt/Apparat/Spielwerk) with full API reference and choosing guide.

opendaw-genres

Genre templates

Concrete parameters per genre — BPM, track layout, drum patterns, bass lines, chords, effect chains, pan, LUFS targets. 8 genres: techno, coldwave, hip-hop, ambient, DnB, house, lofi, trap. Not theory — actual tool calls and values.

opendaw-effect-routing

Effects + routing

Effect chains, sends/returns, sidechain, buses, mixing, mastering chain, render/export. How to route audio and deliver final output.

opendaw-composition-patterns

Composition

When and how to use 26 orchestration tools. Decision tree by musical goal, genre-specific recipes, parameter guidelines, pitfalls. Hip-hop/house/jazz/DnB/ambient/expressive MIDI workflows.

opendaw-dsp-chains

DSP signal chains

10 production-ready DSP chain recipes: vocal, guitar, drum bus, synth bass, lofi, mastering, acid, ambient, vocoder, distortion. Exact Werkstatt scripts, order, parameters. Pitfalls: EQ→dynamics→saturation→time order, no double saturation, reverb/limiter last.

Using skills with Hermes

# Skills are auto-discovered from ~/.hermes/profiles/*/skills/
# Copy to your profile:
cp -r skills/adaptive-mix-mastering ~/.hermes/profiles/your-profile/skills/creative/

Using skills with other agents

The SKILL.md files are standard markdown with YAML frontmatter. Any agent that supports skill loading can use them. The decision points and tool references are agent-agnostic.

Suno Integration

opendaw-mcp connects with Suno for AI music generation. The flagship suno_generate_to_opendaw.py example demonstrates the full pipeline: Suno generation → download → openDAW import → mastering → render.

Getting Suno API access: Join the Suno Discord to get chirp API access. Without it, generation won't work — this is required for all Suno-based workflows.

Pipeline examples:

  • suno_generate_to_opendaw.py — Suno generation → openDAW mastering (flagship)

  • suno_to_opendaw.py — Import existing Suno track → enhance with DSP

  • suno_stems_to_opendaw.py — Stem split → per-stem mix → render

Quick Start

📚 Full documentation: https://ameobius.github.io/opendaw-mcp/

Prerequisites

  • Python 3.11+

  • Node.js 20+ (for openDAW dev server)

  • Chromium (Playwright will install it)

Install

From PyPI:

pip install opendaw-mcp
playwright install chromium

From source:

git clone https://github.com/AMEOBIUS-team/opendaw-mcp.git
cd opendaw-mcp
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium

Set Up openDAW

Clone and build openDAW separately:

git clone https://github.com/andremichelle/openDAW.git
cd openDAW
npm install
npm run build   # or: npx turbo run build

Create a headless host page (see headless-daw/ for reference implementation).

Run

# Terminal 1: Start openDAW dev server
cd openDAW
npm run dev     # typically serves on http://localhost:5174

# Terminal 2: Start MCP server (stdio transport, default)
cd opendaw-mcp
source venv/bin/activate
python server.py

SSE Transport

For remote deployments and registry introspection (e.g. Glama):

MCP_TRANSPORT=sse FASTMCP_HOST=0.0.0.0 FASTMCP_PORT=8080 python server.py

Token Optimization Modes

opendaw-mcp ships 547 MCP tools. For token-sensitive environments, three modes reduce schema payload:

Mode

Env var

Tools

Savings

When to use

full (default)

OPENDAW_MCP_MODE=full

543

0%

Full control, no token constraints

lite

OPENDAW_MCP_MODE=lite

39

92%

Basic track production, minimal context

phase

OPENDAW_MCP_MODE=phase

10-55

90%

Phase-based: agent calls switch_phase() to load relevant tools

# Lite mode — 39 essential tools
OPENDAW_MCP_MODE=lite python server.py

# Phase mode — agent switches between compose/mix/render/inspect
OPENDAW_MCP_MODE=phase python server.py

Phase guides: docs/phases/compose.md, docs/phases/mix.md, docs/phases/render.md, docs/phases/inspect.md

Output Sandbox

Truncate bulky tool responses to prevent context flooding:

OPENDAW_MCP_OUTPUT_LIMIT=2000 python server.py  # max 2000 chars per response

Smart JSON truncation: dicts get field truncation with __truncated flag, lists get first N items with total/shown counts.

CLI

python server.py --help        # show usage and env vars
python server.py --version     # print version and tool count
python server.py --list-tools  # list all registered MCP tools

Docker

# Pull pre-built image from GitHub Container Registry
docker pull ghcr.io/ameobius/opendaw-mcp:1.14.1
docker run -p 8080:8080 ghcr.io/ameobius/opendaw-mcp:1.14.1
# MCP server available at http://localhost:8080/sse

# Or build from source
docker build -t opendaw-mcp .
docker run -p 8080:8080 opendaw-mcp

The Docker image bundles openDAW (built from source), Vite dev server, Chromium, and the MCP server. The entrypoint starts Vite, waits for it to be ready, then launches the MCP server in SSE mode.

Claude Desktop / MCP Client Config

Add to your MCP client config (e.g. claude_desktop_config.json):

{
  "mcpServers": {
    "opendaw": {
      "command": "python",
      "args": ["path/to/opendaw-mcp/server.py"],
      "env": {
        "OPENDAW_HOST_DIR": "path/to/headless-daw",
        "OPENDAW_URL": "http://localhost:5174",
        "OPENDAW_EXPORT_DIR": "path/to/exports"
      }
    }
  }
}

See mcp.json in the repo for a reference config.

Environment Variables

Variable

Default

Description

OPENDAW_HOST_DIR

../headless-daw

Path to the headless openDAW host directory

OPENDAW_URL

http://localhost:5174

URL of the running openDAW instance

OPENDAW_EXPORT_DIR

../exports

Directory for rendered audio exports

NODE_BIN_DIR

(from PATH)

Path to Node.js binary directory (if not on PATH)

MCP_TRANSPORT

stdio

Transport protocol: stdio or sse

FASTMCP_HOST

127.0.0.1

SSE server bind host

FASTMCP_PORT

8000

SSE server bind port

Publishing Identity Mapping

This project uses a hybrid identity scheme — different namespaces for different registries. See docs/identity-mapping.md for the full mapping and rules.

Platform

Namespace

GitHub

AMEOBIUS-team/opendaw-mcp

MCP Registry

io.github.AMEBIUS/opendaw-mcp

GHCR

ghcr.io/ameobius/opendaw-mcp

PyPI

opendaw-mcp

Smithery

@macar228228/opendaw-mcp

Architecture

HeadlessDawBridge

The HeadlessDawBridge class manages the Playwright lifecycle:

  1. Launches headless Chromium with audio autoplay enabled

  2. Navigates to the openDAW URL

  3. Waits for window.DAW and factory globals to load

  4. Injects DAW_HELPERS — JS utility functions that eliminate boilerplate across tools

DAW_HELPERS

JavaScript helpers injected into the DAW context:

  • au(i) — get audio unit adapter by index

  • track(auIdx, trackIdx) — get track adapter

  • region(au, track, reg) — get region adapter

  • instrumentAU() — get the first instrument audio unit

  • modify(fn) — wrapper around editing.modify() for box mutations

  • allAUs() — list all audio unit adapters

Tool Structure

Each MCP tool follows the pattern:

@mcp.tool()
async def tool_name(param: str) -> str:
    """Description."""
    async def _run():
        result = await bridge.page.evaluate("""...JS...""")
        return json.dumps(result)
    return await bridge.run(_run)

The bridge is a singleton — state persists within a single Python process. All box mutations go through editing.modify() as required by openDAW's transactional model.

Input Sanitization

All string parameters that are interpolated into JavaScript template literals are sanitized before evaluation — quotes, backslashes, and braces are stripped to prevent JS injection. Numeric parameters use proper int/float type annotations for FastMCP type coercion.

DSP Scripts

The scripts/ directory contains 30 example DSP scripts (19 Werkstatt + 5 Apparat + 6 Spielwerk):

Script

Device

Description

werkstatt_darksat.js

Werkstatt

Tape saturation with drive, bias, tone, mix, output gain

werkstatt_coldfold.js

Werkstatt

Wavefolding + bitcrush + slew rate reduction

werkstatt_paulstretch.js

Werkstatt

Extreme time-stretch via FFT/ISTFT overlap-add

werkstatt_envfollower.js

Werkstatt

Envelope follower with sidechain ducking

werkstatt_chorus.js

Werkstatt

Stereo chorus with LFO-modulated delay lines

werkstatt_reverb.js

Werkstatt

Algorithmic reverb with comb + allpass filters

werkstatt_shimmer.js

Werkstatt

Pitch-shimmer reverb with granular pitch shift

werkstatt_spectral_freezer.js

Werkstatt

Spectral freeze — captures & sustains a spectral frame for drone/ambient textures

werkstatt_phaser.js

Werkstatt

Phaser with LFO-swept allpass filter chain

werkstatt_subcrusher.js

Werkstatt

Sub-bass enhancement with glide and distortion

werkstatt_lookahead.js

Werkstatt

Lookahead limiter with gain reduction metering

werkstatt_adsr_trim.js

Werkstatt

ADSR envelope trim for sustained samples (#241)

werkstatt_flanger.js

Werkstatt

Stereo flanger with LFO-modulated delay line and feedback

werkstatt_noisegate.js

Werkstatt

Noise gate with threshold, attack/hold/release, range control

werkstatt_tremolo.js

Werkstatt

Tremolo with sine→square shape interpolation and phase offset

werkstatt_granular_stretch.js

Werkstatt

Granular time-stretch with Hann window + pitch shift (#201)

werkstatt_pitch_shift.js

Werkstatt

Real-time pitch shifter via delay-line sweep with crossfade (#188)

werkstatt_dcremover.js

Werkstatt

DC offset remover + M/S stereo width tool (#91)

werkstatt_allpass.js

Werkstatt

Allpass filter with invert + cascade stages (#133)

werkstatt_ringmod_env.js

Werkstatt

Ring modulator with envelope-followed frequency modulation (#277)

apparat_darkbass.js

Apparat

Bass synth with sub oscillator and filter envelope

apparat_coldlead.js

Apparat

Lead synth with detune and vibrato

apparat_subcrusher.js

Apparat

Sub-bass synth with glide and distortion

apparat_ringmod.js

Apparat

Ring modulator synth with ADSR and sub-oscillator (#277)

apparat_fm.js

Apparat

2-operator FM synth with carrier/modulator ratio and ADSR (#138)

spielwerk_powerchord.js

Spielwerk

MIDI effect that generates power chord harmonies

spielwerk_arpeggiator.js

Spielwerk

MIDI arpeggiator with swing and octave range

spielwerk_chordmemory.js

Spielwerk

Chord memory — holds last chord shape (major/minor/7/dim/aug)

spielwerk_strum.js

Spielwerk

Strummer with up/down/random direction and spread

spielwerk_velocity.js

Spielwerk

Velocity scaler with curve, offset, and min/max clamp

spielwerk_mididelay.js

Spielwerk

MIDI delay with feedback, transpose per repeat, and decay

Showcase

Three demos proving end-to-end audio production:

Demo

Command

What it shows

Techno in 30s

python examples/showcase/01_techno_30s.py

Genre preset → master → -14 LUFS WAV

Ambient pad

python examples/showcase/02_ambient_pad.py

Manual synthesis, reverb, filter sweep

Suno → DAW

python examples/showcase/03_suno_to_daw.py track.wav

Stem separation, remix, re-render

See docs/showcase/ for details.

Examples

The examples/ directory contains 73 Python scripts demonstrating the full workflow:

Example

Description

create_beat.py

Drum beat with Playfield

create_chord_progression.py

Chord progression with Vaporisateur

mix_workflow.py

Mixing: levels, effects, sends

render_stems.py

Stem export with LUFS targeting

automation_sweep.py

Filter cutoff automation

modular_patch.py

Modular system with patch cables

full_production_pipeline.py

Complete track: synth + drums + DSP + automation + render

full_production_pipeline_v2.py

Enhanced pipeline with orchestration tools

scriptable_devices_demo.py

All 3 scriptable device types: Apparat synth + Werkstatt DSP + Spielwerk MIDI

device_specific_params.py

Effect parameters: Compressor, Reverb, Delay, etc.

instrument_automation.py

Automating instrument parameters over time

mastering_pipeline.py

Mastering chain: EQ, compression, limiting

metronome_settings.py

Metronome configuration and tempo changes

orchestration_demo.py

High-level orchestration tools in action

song_structure_demo.py

Song structure with markers and sections

render_convert.py

Render and convert audio formats

dawproject_export.py

Export to Bitwig .dawproject format

warp_marker_tempo_match.py

Warp markers for tempo-matched audio regions

suno_to_opendaw.py

Suno→openDAW pipeline: import AI track, add mastering chain, reverb send, arp layer, render+stems

suno_stems_to_opendaw.py

Full E2E: stem split (7 SOTA modes, local GPU) → import stems → per-stem mix (vol/pan/effects) → MIDI arp layer → render+export

suno_generate_to_opendaw.py

Flagship: Suno generation (chirp_generate) → download → openDAW load → mastering (DarkSat+Lookahead) → LUFS check → render

preset_management.py

Save/load Werkstatt effect presets (.opb) — compile DSP script, tweak params, export preset, import back

genre_techno.py

Genre template: techno skeleton (130 BPM, 4-on-floor drums, rolling bass, Vaporisateur+Playfield, Compressor+Waveshaper chain)

genre_coldwave.py

Genre template: coldwave skeleton (100 BPM, sparse drums, Am-Fmaj7-Cmaj-Gdom7 progression, 4 tracks, Dattorro reverb, Waveshaper hardclip)

genre_ambient.py

Genre template: ambient skeleton (70 BPM, no drums, Cmaj7-Amin7-Fmaj7-Gmaj7, pad+bell+texture, long reverbs decay 0.85-0.95)

genre_hiphop.py

Genre template: hip-hop skeleton (85 BPM, boom bap drums, 808 bass Ab minor, dark pentatonic melody, Compressor+Waveshaper)

genre_dnb.py

Genre template: DnB skeleton (174 BPM, Amen break, reese+sub bass F minor, aggressive Comp 8:1, Waveshaper)

genre_house.py

Genre template: house skeleton (124 BPM, 4-on-floor, off-beat chord stabs Fmin9-Cmin9-Gmin9-Dmin9, rolling bass, Delay+Reverb)

genre_lofi.py

Genre template: lofi skeleton (82 BPM, swung drums, jazzy Dmin7-Gdom7-Cmaj7-Fmaj7 ii-V-I, warm bass, short reverb)

genre_trap.py

Genre template: trap skeleton (145 BPM, fast hi-hat rolls, gliding 808 bass, dark minor melody)

create_melody.py

Melody from scale degrees + rhythmic pattern (14 scales, rests, sustains, octave shifts)

create_bassline.py

Bassline from root + rhythmic pattern (low octave, high velocity, scale degrees)

create_arpeggio.py

Arpeggios from chord names — 6 patterns (up/down/updown/downup/random/chord), 6 rates

humanize_notes.py

Humanize MIDI: velocity/timing/duration variation + swing (seeded PRNG, reproducible)

create_harmony.py

Generate harmony parts — diatonic (3rds/5ths/6ths) + chromatic intervals, up/down

create_counterpoint.py

Counter-melody in contrary motion — mirrors melody around center pitch

reverse_invert_notes.py

Melodic variation: retrograde (reverse) + mirror inversion around axis

create_drum_fill.py

Drum fills/transitions: 5 types (build, break, roll, crash, tom), adjustable density

create_ostinato.py

Repeating melodic pattern as foundation layer (minimalism, electronic, film)

create_crescendo.py

Crescendo/decrescendo on existing notes: linear, exponential, logarithmic curves

custom_dsp_script.py

DSP authoring: custom Werkstatt analog saturation script (tanh + DC blocker + tone filter), compile via ScriptCompiler, set params, verify

langchain_integration.py

LangChain toolkit: use opendaw-mcp tools as LangChain Tool objects with any LLM agent

autogen_integration.py

AutoGen toolkit: use opendaw-mcp tools with Microsoft AutoGen agents

crewai_integration.py

CrewAI toolkit: use opendaw-mcp tools with CrewAI crews

screenshot_demo.py

Create a full house track with drums/bass/chords/effects, take a screenshot of the DAW UI, render to WAV

Agent Framework Integration

LangChain

from opendaw_mcp.langchain_tools import OpendawToolkit

toolkit = OpendawToolkit()
tools = toolkit.get_tools()  # or filter: get_tools(categories=["transport", "orchestration"])

# Use with any LangChain agent
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

executor.invoke({"input": "Create a dark techno track at 130 BPM and render it"})

See examples/langchain_integration.py for a full demo.

AutoGen

from opendaw_mcp.autogen_tools import get_autogen_tools

tools = get_autogen_tools()  # or filter: get_autogen_tools(categories=["transport", "orchestration"])

from autogen import AssistantAgent, UserProxyAgent

assistant = AssistantAgent("producer", llm_config=llm_config, tools=tools,
    system_message="You are a music producer. Use opendaw tools to create, mix, and render music.")
user = UserProxyAgent("user", human_input_mode="NEVER")
user.initiate_chat(assistant, message="Create a dark techno track at 130 BPM and render it")

See examples/autogen_integration.py for a full demo.

CrewAI

from opendaw_mcp.crewai_tools import get_crewai_tools

tools = get_crewai_tools()

from crewai import Agent, Task, Crew, LLM

llm = LLM(model="gpt-4o-mini")
producer = Agent(role="Music Producer", goal="Create and mix tracks", backstory="Expert producer", tools=tools, llm=llm)
task = Task(description="Create a dark techno track at 130 BPM and render it", agent=producer, expected_output="WAV file")
crew = Crew(agents=[producer], tasks=[task])
result = crew.kickoff()

See examples/crewai_integration.py for a full demo.

Tool Catalog

See TOOL_CATALOG.md for the complete list of 547 tools with parameters and descriptions.

Orchestration Tools

High-level composers that combine multiple low-level operations into a single call — designed for agents to reduce token usage and round-trips:

Tool

Replaces

Example

create_notes_batch

10-50 × create_note

'[{"pitch":60,"start":0,"duration":0.5},...]'

create_drum_pattern

10-20 × create_note

'{"kick":"x...x...","hihat":"....o..."}'

create_chord_progression

15-50 × create_note

'[["C","min7"],["F","dom7"]]'

add_mastering_chain

3 × add_effect + 10 × set_param

style="warm", target_lufs=-14

create_genre_track

20-40 low-level calls

genre="lofi" → synth + drums + bass + chords

Mastering

The MCP server includes a full mastering chain for streaming-ready output:

  1. Render — render_full (full mixdown) or export_stems (per-track stems)

  2. Measure LUFS — measure_lufs (ITU-R BS.1770-4 K-weighting, gated mean squares)

  3. Auto-gain — auto_gain (iterative: render → measure → adjust Maximizer threshold + output volume → re-render, converges ±1 LUFS)

# Render full mix
await server.mcp_opendaw_render_full("my_mix", 48000)

# Measure loudness
lufs = json.loads(await server.mcp_opendaw_measure_lufs("my_mix"))
# → {"lufs_integrated": -18.3, "true_peak_db": -3.71, ...}

# Auto-gain to Spotify target (-14 LUFS)
result = json.loads(await server.mcp_opendaw_auto_gain("-14", "mastered", 48000, "3"))
# → converges to -13.7 LUFS in 3 iterations

Platform targets: Spotify/YouTube -14 LUFS, Apple Music -16 LUFS, Tidal -14 LUFS.

Limitations

  • Headless only — some UI-dependent features (file dialogs, popup-based model loading) are not available

  • Single process — bridge state doesn't persist across Python process restarts

  • Upstream coupling — tools depend on openDAW's internal box system, which can change between versions

  • AU rename — requires adapter context not available in headless mode

Acknowledgments

License

Apache-2.0 — see LICENSE

Changelog

v1.86.0 (2026-07-05)

  • werkstatt_autowah.js DSP script — envelope-followed filter (autowah): filter frequency driven by input envelope, not LFO or static cutoff. 3 filter modes (bandpass/peaking/lowpass), sensitivity, attack/release, direction (up/down sweep), cutoff smoothing. 69 DSP scripts

  • 828 unit tests (+13), E2E 8/8

v1.85.0 (2026-07-05)

  • werkstatt_dimension_chorus.js DSP script — Roland Dimension D-style chorus: 2 detuned delay lines with independent LFO rates (triangle wave), no feedback, mono-sum input, brightness filter, stereo width control. 68 DSP scripts

  • 818 unit tests (+13), E2E 8/8

v1.84.0 (2026-07-05)

  • werkstatt_multitap_delay.js DSP script — multitap delay: 4 independent taps from single delay buffer, each with time/level/pan/feedback. Equal-power stereo pan per tap, feedback damping, spread modulation. 67 DSP scripts

  • 805 unit tests (+13), E2E 8/8

v1.83.0 (2026-07-05)

  • create_stutter orchestration tool — stutter edit: rapid rhythmic repetitions with evolving rate and dynamics. 5 patterns (accelerate, decelerate, ping_pong, constant, random), 5 accent patterns, 5 velocity ramps, gate, pitch jitter. Unlike create_chop (equal segments) — rate evolves over time. 309 MCP tools

  • 792 unit tests (+10), E2E 8/8

v1.82.0 (2026-07-05)

  • spielwerk_harmonizer.js DSP script — MIDI harmonizer: 3 voices at fixed intervals or diatonic, per-voice velocity, 14 scales. 66 DSP scripts

  • 782 unit tests (+11), E2E 8/8

v1.81.0 (2026-07-05)

  • werkstatt_dynamic_eq.js DSP script — dynamic EQ with 3 bands. Each band: peaking biquad filter + envelope follower that tracks signal level at that frequency. When level exceeds threshold, gain is dynamically reduced by up to range dB. Detection uses a separate unity-gain peaking filter to isolate band energy, processing filter applies the dynamic gain. 19 params: 3 bands × (freq, gain, Q, threshold, range) + attack, release, mix, output. Unlike parametric EQ (static gain) or multiband compressor (crossover split, phase issues), dynamic EQ applies dynamic gain only at the target frequency — surgical de-essing, resonance control, plosive removal without affecting the rest of the spectrum. Pro-tier mixing tool (FabFilter Pro-Q3, T-Racks, Soothe2)

  • 66 DSP scripts (50 Werkstatt + 8 Apparat + 8 Spielwerk)

  • 782 unit tests (+11), E2E 8/8

  • ruff clean, CI green

v1.80.0 (2026-07-05)

  • spielwerk_scale_quantizer.js DSP script — MIDI scale quantizer. Snaps incoming note pitches to the nearest pitch in the selected scale. 14 scales: major, minor, dorian, phrygian, lydian, mixolydian, locrian, minor/major pentatonic, harmonic minor, melodic minor, hungarian minor, double harmonic, chromatic (pass-through). 12 root notes (C-B). Direction: nearest (default) or always-up. Unlike arpeggiator (generates notes) or velocity (scales dynamics), this is a constraint — it forces out-of-scale notes into the scale. The most essential MIDI effect for live playing and generative music — no more wrong notes. 3 params: scale, root, direction

  • 64 DSP scripts (49 Werkstatt + 8 Apparat + 7 Spielwerk)

  • 762 unit tests (+10), E2E 7/7

  • ruff clean, CI green

v1.79.0 (2026-07-05)

  • apparat_supersaw.js DSP script — JP-8000 style supersaw synthesizer. 7 detuned sawtooth oscillators with fixed detune pattern (-12/-7/-4/0/+4/+7/+12 cents), per-voice equal-power stereo pan (center voice = center, outer voices spread wide), resonant one-pole lowpass filter with cutoff (50Hz-16kHz exponential) + resonance feedback. 9 params: detune, spread, cutoff, resonance, attack, decay, sustain, release, volume. Unlike wavetable synth (scanned tables, mono), supersaw uses 7 independent sawtooth phases with dedicated stereo placement — the iconic trance/hardstyle/EDM lead sound. ADSR envelope, randomized phase init per noteOn for rich texture

  • 63 DSP scripts (49 Werkstatt + 8 Apparat + 6 Spielwerk)

  • 752 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.78.0 (2026-07-05)

  • werkstatt_convolution_reverb.js DSP script — convolution reverb with generated stereo impulse response. Time-domain direct convolution with a procedurally generated IR: early reflections (7 discrete taps with stereo spread) + exponentially decaying noise tail through one-pole lowpass. Room size controls IR length (50-300ms), decay controls exponential envelope, damping controls lowpass cutoff (2k-16k Hz), predelay shifts reflections, early/late balance mixes discrete taps vs diffuse tail, width controls stereo spread of reflections. 8 params: room_size, decay, damping, predelay, early_late, width, mix, output. Unlike algorithmic reverb (feedback delay network), convolution uses an actual IR — the gold standard for realistic acoustic spaces. IR capped at 8192 samples for CPU. Classic for: realistic room/hall/cathedral ambience, drum room sound, vocal space, film post-production

  • 62 DSP scripts (49 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 742 unit tests (+10), E2E 8/8

  • 100 Python examples

  • ruff clean, CI green

v1.77.0 (2026-07-05)

  • create_motif_development orchestration tool — through-composed melodic development. Takes a 2-8 note motif and builds ONE continuous melodic line that evolves through 11 stage types: statement, sequence_up/down, fragment/fragment_end, invert, octave_up/down, expand, compress, cadence. Beethoven 5th approach — a 4-note seed grows into a full melodic arc. Unlike create_variations (separate regions, each a full transform), this writes a single flowing line. Unlike create_sequence (pure transposition), this mixes multiple development techniques in sequence. Accepts scale degrees (1-7) or MIDI pitches. 51 orchestration tools → 51

  • 308 MCP tools (51 orchestration)

  • 732 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.76.0 (2026-07-05)

  • werkstatt_rotary_speaker.js DSP script — Leslie rotary speaker emulation. Dual rotor system: horn (high rotor) with Doppler pitch modulation via variable delay + amplitude modulation, and rotor (low rotor) with amplitude modulation only. Crossover split (200-4000 Hz) routes highs to horn, lows to rotor. Speed control (0.8-6.67 Hz = 48-400 RPM), acceleration simulates the mechanical ramp-up/ramp-down of a real Leslie. Stereo widening via opposite-phase rotors. Unlike chorus (constant delay modulation) or tremolo (amplitude only), rotary speaker combines Doppler + amplitude + crossover + acceleration for the authentic Hammond organ / guitar sound. Classic for: Hammond organ, Pink Floyd guitar, Jon Lord Deep Purple, soul vocals, dub reggae. 7 params: speed, depth, crossover, horn_level, rotor_level, acceleration, mix

  • 61 DSP scripts (48 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 722 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.75.0 (2026-07-05)

  • create_variations orchestration tool — thematic variation generator. Reads notes from a source region and generates N variations, each as a new region. 9 transformation types: transpose, invert (with axis), reverse, augment, diminish, fragment, octave_up, octave_down. Up to 16 variations per call. This is the fundamental compositional technique of theme-and-variations — Bach Goldberg, Beethoven Diabelli, Brahms, jazz reharmonization. Unlike transpose_notes/invert_notes (destructive, modify in place), create_variations is generative — reads source, writes each variation to a new region. 50 orchestration tools → 50

  • 307 MCP tools (50 orchestration)

  • 712 unit tests (+10), E2E 9/9

  • ruff clean, CI green

v1.74.0 (2026-07-05)

  • opendaw-dsp-chains agent skill — 10 production-ready DSP signal chain recipes: vocal, guitar, drum bus, synth bass, lofi character, mastering, acid house, ambient pad, vocoder/vocal FX, distortion/metal. Each chain specifies exact Werkstatt scripts, order, and parameter values. Includes pitfalls section (EQ→dynamics→saturation→time order, no double saturation, reverb/limiter always last, moog self-oscillation warning, vocoder carrier requirements). DSP script index by family. 12 agent skills total

  • ruff clean, CI green

v1.73.0 (2026-07-05)

  • werkstatt_moog_ladder.js DSP script — Moog ladder filter (24dB/oct) with 4 cascaded one-pole stages, feedback resonance with self-oscillation, Huovilainen improved topology with tanh nonlinearity per stage. 3 modes: LP (classic Moog 24dB), HP (subtractive), BP (cascade). Drive (pre-filter saturation), warmth (feedback cross-mix from stage 1 to resonance path). Unlike multifilter (Chamberlin SVF — 12dB/oct, linear phase), Moog ladder has nonlinear character, steeper rolloff, and harmonic distortion at high resonance. Classic for: subtractive synthesis, acid bass, synthwave leads, analog emulation, house stabs. 6 params: cutoff, resonance, drive, warmth, mode, mix

  • 60 DSP scripts (47 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 702 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.72.0 (2026-07-05)

  • werkstatt_waveshaper.js DSP script — custom-curve waveshaper with 4 transfer functions: tanh (warm soft-clip), cubic (aggressive knee), atan (hard shoulders), Chebyshev (harmonic injection — 2nd/3rd harmonic blend via harmonics param). Drive (0-3), bias (asymmetric even harmonics), tone filter (one-pole LP/HP blend), output gain, dry/wet mix. Unlike tube_saturator (fixed curve) or coldfold (wavefolding), waveshaper gives 4 distinct shaping curves in one unit. Classic for: guitar amp simulation, harmonic excitement, creative distortion, analog emulation. 7 params: drive, curve, bias, harmonics, tone, output, mix

  • 59 DSP scripts (46 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 692 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.71.0 (2026-07-05)

  • create_two_hand_piano orchestration tool — two-hand piano arrangement generator. Left hand: 6 accompaniment patterns (block chords, arpeggio up/down/up-down, Alberti bass, bass+chord). Right hand: chord tones, arpeggiated chords, or custom melody. Separate bass/chord/melody octaves, adjustable arpeggio rate. Unlike create_chord_progression (block chords only) or create_melody (single line), this combines both hands into one coherent piano arrangement. Essential for: piano ballads, jazz comping, classical accompaniment, lofi piano, singer-songwriter patterns. 49 orchestration tools → 49

  • 306 MCP tools (49 orchestration)

  • 625 unit tests (+10), E2E 8/8

v1.70.0 (2026-07-05)

  • create_fugue orchestration tool — polyphonic fugue generator with subject, tonal/real answer, countersubject, and stretto. Subject stated in first voice, then imitated in others with tonal answer (5th up, diatonic adjustment) or real answer (exact transposition). Optional countersubject provides contrasting counterpoint after subject completes. Stretto mode overlaps voice entries for climactic density. Voice alternation: subject → answer → subject (octave down) → answer. Per-voice velocity decay. 2-5 voices, 2-32 note subject. Distinct from create_canon (strict imitation) and create_chorale (SATB voice leading) — fugue uses independent subject/answer/countersubject with tonal answer adjustment. Bach Well-Tempered Clavier, Art of Fugue. 48 orchestration tools → 48

  • 305 MCP tools (48 orchestration)

  • 615 unit tests (+10), E2E 8/8

v1.69.0 (2026-07-05)

  • werkstatt_spectral_gate.js DSP script — multiband spectral gate with per-band envelope followers. 4-16 log-spaced bandpass filter bank, each band has independent envelope detection. Bands below threshold are reduced by adjustable amount. Tilt control shifts spectral balance (boost highs, cut lows or vice versa). Attack/release smoothing per band. Output highpass. Classic for noise reduction, spectral cleaning, creative gating, dub-style frequency manipulation. 10 params: bands, threshold, reduction, attack, release, min_freq, max_freq, tilt, mix, output

  • 58 DSP scripts (45 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 605 unit tests (+10), E2E 8/8

v1.68.0 (2026-07-05)

  • werkstatt_looper.js DSP script — live looper with overdub. Records audio into circular buffer, plays back with variable speed (0.25x-4x), overdubs new layers with adjustable feedback. Three play modes: auto (record then overdub), play (playback only), overdub (continuous layering). Reverse mode for backwards loops. Crossfade at loop boundaries prevents clicks. Input monitor for zero-latency monitoring. Classic for live electronica, guitar looping, ambient performance, Ed Sheeran-style live layering. 10 params: loop_length, feedback, overdub, play_mode, speed, reverse_mode, monitor, fade_edges, mix, output

  • 57 DSP scripts (44 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 595 unit tests (+10), E2E 8/8

v1.67.0 (2026-07-05)

  • create_chorale orchestration tool — 4-voice SATB chorale generator with voice-leading rules. Parses chord progression, assigns soprano/alto/tenor/bass voices with smooth voice movement (nearest chord tone from previous position), parallel fifth/octave detection and correction, voice range clamping (S:60-81, A:55-74, T:48-67, B:36-62), per-voice velocity, optional voice_spread for wider voicings. Supports maj/min/m7/maj7/dom7/sus2/sus4/dim/aug. Classic Bach chorale style — foundational for vocal harmonies, string arrangements, synth pad layering. Distinct from create_harmony (block chords) and create_counterpoint (2 voices) — chorale assigns 4 independent voices with proper voice leading

  • 304 MCP tools (47 orchestration + 3 melodic variation + 4 transformation)

  • 585 unit tests (+10), E2E 8/8

v1.66.0 (2026-07-05)

  • werkstatt_scratch.js DSP script — DJ vinyl scratch with turntable physics. Triangle LFO drives back-and-forth motion with depth and rate control. Pullback parameter adds backward "yank" at cycle start. Physics model: velocity tracks target with friction coefficient for inertia. Wow (0.5 Hz pitch wobble) and flutter (adjustable 2-30 Hz) for vinyl character. Random crackle pops. Variable-speed readhead with linear interpolation from circular buffer. Classic for turntablism, tape rewind, DJ scratching, lo-fi character. 10 params: depth, rate, pullback, friction, wow, flutter, flutter_rate, crackle, mix, output

  • **57 DSP scripts (44 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 575 unit tests (+10), E2E 8/8

v1.65.0 (2026-07-05)

  • werkstatt_reverse.js DSP script — real-time reverse playback effect with chunked circular buffer. Reverses audio in configurable chunks (0.05-5 sec) with variable speed (0.25x-4x). Three trigger modes: continuous (immediately loop), single (freeze at end), gate (restart on input). Three stereo modes: normal, ping-pong (swap L/R), wide (M/S processing). Feedback for layered reverse textures. Crossfade smoothing for click-free transitions. Classic for backwards cymbals, vocal reverses, psychedelic transitions, tape rewind effects. 10 params: chunk_size, feedback, speed, smooth, dry_gain, wet_gain, mix, stereo_mode, trigger_mode, output

  • 55 DSP scripts (42 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 565 unit tests (+10), E2E 8/8

v1.64.0 (2026-07-05)

  • werkstatt_vocoder.js DSP script — channel vocoder with 8-24 log-spaced bandpass filter bank. Maps modulator (vocal/input) spectral envelope onto a carrier oscillator (saw/square/noise). Per-band envelope followers with adjustable response time and threshold gating. Emphasis control boosts high bands for intelligibility. Output highpass removes rumble. Classic for robotic voice effects, synth vocal textures, Daft Punk-style sounds. 10 params: bands, carrier_wave, carrier_freq, mod_response, mod_threshold, band_q, emphasis, highpass, mix, output

  • 54 DSP scripts (41 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 565 unit tests (+10), E2E 8/8

v1.63.0 (2026-07-05)

  • werkstatt_multiband_comp.js DSP script — 3-band multiband compressor with Linkwitz-Riley 4th order crossovers (24dB/oct). Independent threshold/ratio/attack/release/makeup gain per band (low/mid/high). Crossover frequencies 50-8000 Hz (exponential). Envelope followers per band with peak detection. Classic mastering tool — controls dynamics separately in low/mid/high frequency ranges. 18 params: 2 crossovers + 5 per band × 3 + mix

  • 54 DSP scripts (41 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 565 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.62.0 (2026-07-05)

  • werkstatt_harmonizer.js DSP script — dual-voice harmonizer with independent pitch shift (±12 semitones + ±50 cents), per-voice gain, detune LFO for chorus-like wobble, and delay-based pitch shifting. Creates choir/harmony effects from any input — two shifted voices with micro-detune. Distinct from pitch_shift (single voice) — harmonizer creates multiple harmonized copies. Classic for vocal harmonies, guitar harmonizers, synth thickening. 9 params: 2× shift_semi/cent/gain, detune, delay, mix

  • 54 DSP scripts (41 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 546 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.61.0 (2026-07-05)

  • create_passacaglia orchestration tool (303 MCP tools) — repeating bass ostinato with evolving harmonies above. Baroque form (Bach BWV 582) adapted to modern contexts. 3 variation styles: block (sustained chords), arpeggiated (broken), melodic (stepwise counter-melody). Bass pattern as MIDI pitches + custom rhythm, chord cycling, 3/4 and 4/4 time. Distinct from ostinato (single pattern), pedal_point (single note), bordun (drone chord)

  • 46 orchestration tools total

  • 536 unit tests (+10 passacaglia), E2E 8/8

  • ruff clean, CI green

v1.60.0 (2026-07-05)

  • werkstatt_formant_filter.js DSP script — 3-band parallel formant filter simulating vocal tract resonances. 5 vowel presets (/a/, /i/, /u/, /o/) with smooth interpolation, or manual F1/F2/F3 control. Bandwidth and resonance parameters shape the vocal character. Biquad bandpass filters in parallel. Classic for vocoder-like vocal coloring, talk-box effects, and synth voice synthesis. 9 params: 3 formant freqs, 3 bandwidths, vowel, resonance, mix

  • 51 DSP scripts (38 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 358 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.59.0 (2026-07-05)

  • werkstatt_comb_filter.js DSP script — standalone comb filter with delay-line feedback. Positive/negative polarity selects comb vs inverse comb characteristic. Damping LP in feedback path controls high-frequency decay. Freq 10-8000 Hz (delay time = 1/freq), feedback ±0.99. Classic building block of flangers/chorus, but standalone gives distinctive notched/peaked spectral combing. 5 params: freq, feedback, damping, mix, polarity

  • 50 DSP scripts (37 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 344 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.58.0 (2026-07-05)

  • werkstatt_auto_pan.js DSP script — auto-pan with LFO-driven stereo positioning. Waveform morph (sine→triangle→square), rate (0.1-20 Hz), depth, phase offset (0-360°), width, and offset. Equal-power pan law. Distinct from stereowidth (which expands existing stereo) — auto-pan moves the signal between channels. Classic for guitars, synths, percussion. 6 params: rate, depth, shape, phase, width, offset

  • 49 DSP scripts (36 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 334 unit tests (+10), E2E 8/8

  • ruff clean, CI green

v1.57.0 (2026-07-05)

  • werkstatt_graphic_eq.js DSP script — 10-band graphic EQ with ISO frequency bands (32, 64, 125, 250, 500, 1k, 2k, 4k, 8k, 16k Hz), each ±12 dB gain, plus master output ±6 dB. Biquad peaking filters (Q=1.41, ⅔ octave) in series. Distinct from parametric EQ (fixed bands vs movable). Classic rack-mount EQ for tone shaping, mixing, and live sound. 11 params: 10 bands + master

  • 48 DSP scripts (35 Werkstatt + 7 Apparat + 6 Spielwerk)

  • 324 unit tests (+10 for graphic EQ), E2E 8/8

  • ruff clean, CI green

v1.56.0 (2026-07-05)

  • werkstatt_tape_delay.js DSP script — tape delay with wow (0.5 Hz slow pitch drift) and flutter (15 Hz fast pitch wobble) modulating the delay time, plus saturation in the feedback path for graceful repeat degradation. Fractional delay read for smooth modulation. 6 params: time, feedback, wow, flutter, saturation, mix. Classic for dub, guitar slapback, ambient wash. Completes delay family: stereo ✅ tape ✅

  • werkstatt_graphic_eq.js DSP script — 10-band graphic EQ with ISO frequency bands (32, 64, 125, 250, 500, 1k, 2k, 4k, 8k, 16k Hz), each ±12 dB gain, plus master output ±6 dB. Biquad peaking filters (Q=1.41, ⅔ octave) in series. Distinct from parametric EQ (fixed bands vs movable). Classic rack-mount EQ for tone shaping, mixing, and live sound. 11 params: 10 bands + master

  • 48 DSP scripts (35 Werkstatt + 7 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 11 params, band_1k/band_32/band_16k/master set

  • Example script: werkstatt_tape_delay.py — dub, slapback, ambient wash presets

  • ruff clean, CI green

v1.55.0 (2026-07-05)

  • werkstatt_tube_saturator.js DSP script — tube/valve saturator with asymmetrical transfer curve (even harmonic dominance), warmth control (even/odd blend), bias, post-saturation tone filter, output gain. 6 params: drive, warmth, bias, tone, output, mix. Distinct from tape (darksat) and soft-clip (overdrive). Completes saturation family: tape ✅ overdrive ✅ wavefold ✅ bitcrusher ✅ tube ✅

  • 46 DSP scripts (33 Werkstatt + 7 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 6 params, drive/warmth/bias/tone set

  • Example script: werkstatt_tube_saturator.py — gentle warmth, aggressive crunch, vintage vocal

  • ruff clean, CI green

v1.54.0 (2026-07-05)

  • werkstatt_spring_reverb.js DSP script — spring reverb with dispersive delay lines, transient-driven "boing" chirp response, and 4 detuned springs. Parameters: decay, damp, tension (delay time), boing (transient sensitivity), mix. Classic for surf rock, dub, guitar amps. Completes reverb family: algorithmic ✅ shimmer ✅ spring ✅

  • 45 DSP scripts (32 Werkstatt + 7 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params, decay/tension/boing/damp set

  • Example script: werkstatt_spring_reverb.py — surf rock, dub, tight amp presets

  • ruff clean, CI green

v1.53.0 (2026-07-05)

  • create_isorhythm orchestration tool (302 MCP tools) — repeating rhythm (talea) × repeating pitch (color) as independent cycles. When lengths differ, patterns phase-shift until realigning at LCM. Medieval motets (Machaut), Messiaen, Boulez. Distinct from ostinato (which repeats rhythm+pitch together)

  • E2E verified: equal lengths (24 notes), phase shift 4×5 (LCM=20), single talea, complex rhythm, bad velocity/repeats/pitch/talea — 8/8 tests passed

  • +10 unit tests for isorhythm talea/color independence, phase cycling, position, duration → 282 total

  • Example script: create_isorhythm.py — classic, phase shift, minimalist

  • 45 orchestration tools total

  • ruff clean, CI green

v1.52.0 (2026-07-05)

  • create_hocket orchestration tool (301 MCP tools) — melodic line split between 2-4 voices. Hocket (Latin "hoquet" = hiccup) divides a single melody so each voice plays only part of it, creating interlocking texture. Three split modes: alternate (round-robin), pairs (2 per voice), phrase (4 per voice). Medieval Notre Dame polyphony, African mbira, Balinese gamelan, Steve Reich

  • E2E verified: alternate 2v (8 notes), 3 voices (12 notes), pairs, phrase, bad voices/split_mode/velocity/pitch — 8/8 tests passed

  • +10 unit tests for hocket voice assignment, note preservation, position spacing → 272 total

  • Example script: create_hocket.py — alternate, pairs, phrase patterns

  • 44 orchestration tools total

  • ruff clean, CI green

v1.51.0 (2026-07-05)

  • create_bordun orchestration tool (300 MCP tools) — continuously sustained drone chord as a textural layer. Unlike pedal_point (single anchored note), bordun is a sustained chord — open fifths, octaves, or drone chords. Found in Scottish bagpipes, Indian tanpura, hurdy-gurdy, ambient drone, folk. Configurable intervals (1-8), retrigger mode (every N bars), 3/4 time support

  • E2E verified: open fifth (2 notes), octave+fifth (3 notes), retrigger (4 notes), single drone, 3/4 time, bad root/octave/velocity — 8/8 tests passed

  • +10 unit tests for bordun note generation, pitch mapping, retrigger, duration → 262 total

  • Example script: create_bordun.py — open fifth, octave+fifth, minor triad, single drone

  • 43 orchestration tools total

  • ruff clean, CI green

v1.50.0 (2026-07-05)

  • werkstatt_bitcrusher.js DSP script — standalone bitcrusher with bit-depth quantization (1-16 bits) and sample-rate reduction. Drive, DC offset, dry/wet mix. Dedicated bitcrusher separate from coldfold's combined wavefold+crush

  • 44 DSP scripts (31 Werkstatt + 7 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params (bits/rate/drive/offset/mix), param values set

  • Example script: werkstatt_bitcrusher.py — lo-fi and extreme degradation presets

  • ruff clean, CI green

v1.49.0 (2026-07-05)

  • create_hemiola orchestration tool (299 MCP tools) — 3:2 rhythmic displacement creating cross-rhythm illusion. Fundamental to West African, Afro-Cuban, jazz, and minimalist music. Brahms, Bernstein, Glass. Two patterns: "3:2" (classic) and "2:3" (inverse). Superimposes primary and secondary groups over same time span

  • E2E verified: 3:2 pattern (5 notes), 2:3 pattern (5 notes), bars=2, bad pattern, bad bars, bad velocity, bad pitch, bad duration — 8/8 tests passed

  • +10 unit tests for hemiola note count, ratio, timing, velocity → 242 total

  • Example script: create_hemiola.py — 3:2 and 2:3 patterns

  • 42 orchestration tools total

  • ruff clean, CI green

v1.48.0 (2026-07-05)

  • apparat_wavetable.js DSP script — wavetable synthesizer with 8 interpolated wavetables (sine, triangle, saw, square, pulse, double-sine, saw+tri, noise-sine). Scan position with LFO modulation, unison detune (1-7 voices), ADSR envelope. Completes Apparat synthesis methods: subtractive ✅ FM ✅ ring mod ✅ Karplus-Strong ✅ wavetable ✅

  • 44 DSP scripts (31 Werkstatt + 7 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 10 params, pos/unison/pos_lfo_depth set

  • +10 unit tests (TestWavetableDSP: header, params, tables, scan, unison, ADSR) → 232 total

  • Example script: apparat_wavetable.py — scan + unison presets

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.47.0 (2026-07-05)

  • werkstatt_vibrato.js DSP script — pitch vibrato via modulated delay line. 4 params: rate (0.1-20 Hz, exp), depth (0.5-20 ms), shape (sine→triangle morph), stereo (phase offset 0-1). Completes the modulation family: chorus ✅ flanger ✅ phaser ✅ tremolo ✅ vibrato ✅

  • 42 DSP scripts (30 Werkstatt + 6 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 4 params, rate 5→8, depth 0.003→0.008

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.46.0 (2026-07-05)

  • create_appoggiatura orchestration tool (298 MCP tools) — expressive leaning grace note: approach → main. Fourth and final essential ornament (trill ✅, mordent ✅, turn ✅, appoggiatura ✅). Adjustable ratio, above/below direction. Bach, Mozart, Chopin. Ornaments set complete

  • E2E verified: above, below, equal split, validation — 8/8 tests passed

  • +10 unit tests for appoggiatura order, timing, velocity (374 total)

  • Example script: create_appoggiatura.py — above + below appoggiatura

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.45.0 (2026-07-05)

  • create_turn orchestration tool (298 MCP tools) — circular ornament (gruppetto): main → upper → main → lower → main. Third of four essential ornaments (trill ✅, mordent ✅, turn ✅). Mozart, Beethoven, Bach

  • E2E verified: upper, lower, half-step, validation — 8/8 tests passed

  • +10 unit tests for turn note order, timing, velocity (374 total)

  • Example script: create_turn.py — upper + lower turn

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.44.0 (2026-07-05)

  • create_mordent orchestration tool (298 MCP tools) — classical baroque ornament: main → neighbor → main. Upper/lower direction, adjustable interval. One of four essential ornaments (trill, mordent, turn, appoggiatura). Bach, Mozart

  • E2E verified: upper, lower, half-step, validation, clamped neighbor — 8/8 tests passed

  • +10 unit tests for mordent neighbor direction, timing, velocity (374 total)

  • Example script: create_mordent.py — upper + lower mordent

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.43.0 (2026-07-05)

  • create_comping orchestration tool (298 MCP tools) — rhythmic chordal accompaniment. Jazz piano comping, funk guitar chops, reggae skanks, country boom-chick, neo-soul. Rhythm grid (x/play, -/rest, ./ghost), syncopation, chord JSON parsing. One call replaces 20-80 manual note creations

  • E2E verified: jazz comping (64 notes), funk with ghosts, reggae skank (16 steps), syncopation, validation — 8/8 tests passed

  • +10 unit tests for comping generation, ghost velocity, rhythm parsing (374 total)

  • Example script: create_comping.py — jazz ii-V-I with syncopation

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.42.0 (2026-07-05)

  • augment_notes transformation tool (298 MCP tools) — augmentation/diminution: the fourth classical motivic transformation. Multiplies note durations by a factor (0.25-4.0). Two modes: "scale" (phrase slows down/speeds up) and "stretch" (durations only). Completes the four fundamental transformations: transpose, reverse, invert, augment. Think Beethoven 5th recapitulation

  • E2E verified: augmentation x2 (5 notes), diminution x0.5 (8 notes), stretch mode, no-op, validation — 8/8 tests passed

  • +10 unit tests for factor validation + duration math (374 total)

  • Example script: augment_notes.py — augmentation + diminution on C major scale

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.41.0 (2026-07-05)

  • create_canon orchestration tool (298 MCP tools) — strict melodic imitation with delayed voice entries. The foundation of contrapuntal music: Pachelbel's Canon, "Row Row Row Your Boat", Bach fugue subjects, film score layering. Unlike create_counterpoint (generates a new line), a canon copies the SAME melody into each voice — just shifted in time and pitch. 2-6 voices, per-voice transposition, velocity decay, up/down entry order. One call replaces 16-48 manual note creations. Essential for: rounds, fugues, film scores, call-and-response layering, minimalism

  • E2E verified: 3-voice canon (24 notes), 2-voice round (8), direction=down (12), 4-voice (24), bad voices, transposition mismatch, bad direction, start_beat offset — 8/8 tests passed

  • +10 unit tests for canon voice generation + transposition + direction + clamping (374 total)

  • Example script: create_canon.py — 4-voice Pachelbel-style canon with fifth/octave transpositions

  • 298 MCP tools (260 low-level + 41 orchestration + 3 melodic)

  • ruff clean, CI green

v1.40.0 (2026-07-05)

  • create_pedal_point orchestration tool (292 MCP tools) — sustained bass note under changing chords. The foundational technique in film scoring (Hans Zimmer drones), organ preludes (Bach), and rock ballads. Retrigger or sustained pedal mode. Full chord name parsing (maj/min/m7/maj7/dom7/sus2/sus4/dim/aug + implicit major). Adjustable time signatures (3/4, 4/4, 6/8). One call replaces 13-34 manual note creations. Essential for: film scoring, organ music, rock ballads, ambient drones, harmonic tension

  • E2E verified: retriggered (16 notes), sustained (13), 7th chords (15), 2 bars per chord, 3/4 waltz, sus4, error handling — 8/8 tests passed

  • +10 unit tests for pedal point generation + chord parsing (314 total)

  • Example script: create_pedal_point.py — 5 pedal points (retriggered, sustained, jazz 7ths, slow, waltz)

  • 292 MCP tools (254 low-level + 35 orchestration + 3 melodic)

  • ruff clean, CI green

v1.39.0 (2026-07-05)

  • create_sequence orchestration tool (291 MCP tools) — transposed melodic repetition. The most fundamental compositional technique in Western music: repeat a melodic fragment at different pitch levels. 3 directions (up/down/alternating). Adjustable transposition (semitones, 5=4th, 7=5th), repeats (1-8), velocity decay (fade-out/build-up). One call replaces 8-32 manual note creations. Essential for: baroque sequences, jazz ii-V-I chains, film score builds, EDM build-ups, classical development sections

  • E2E verified: ascending 4th (12 notes), descending 2nd (16 notes), alternating 5th (9 notes), velocity decay, single repeat, error handling — 8/8 tests passed

  • +9 unit tests for sequence pattern generation (304 total)

  • Example script: create_sequence.py — 5 sequences (baroque, jazz, film score, fade-out, rising quint)

  • 291 MCP tools (254 low-level + 34 orchestration + 3 melodic)

  • ruff clean, CI green

v1.38.0 (2026-07-05)

  • create_glissando orchestration tool (290 MCP tools) — smooth scale run between two pitches. 6 scale types (chromatic/major/minor/pentatonic_minor/pentatonic_major/whole_tone). 5 rates (32nd/16th/8th/32t/16t). 4 velocity curves (flat/ramp_up/ramp_down/arc). Ascending or descending. Unlike riser/bass_drop (pitch sweeps), glissando plays every intermediate scale tone. One call replaces 6-13 manual note creations. Essential for: transitions, fills, classical ornamentation, jazz runs, dramatic effects

  • E2E verified: chromatic asc (13 notes), major (8), descending (13), pentatonic minor (6), whole tone (7), velocity arc, error handling — 8/8 tests passed

  • +12 unit tests for glissando pattern generation (295 total)

  • Example script: create_glissando.py — 5 glissandi across scales

  • 290 MCP tools (254 low-level + 33 orchestration + 3 melodic)

  • ruff clean, CI green

v1.37.0 (2026-07-05)

  • create_trill orchestration tool (289 MCP tools) — rapid two-note alternation ornament. 5 rates (32nd/16th/8th/32t/16t triplet). Upper note accent (baroque style), start on upper or lower. Works for classical trills, jazz shakes, metal tremolo picking, electronic LFO patterns. One call replaces 4-64 manual note creations. Essential for: baroque ornaments, jazz phrasing, tremolo effects, ornamentation

  • E2E verified: default 16th (16 notes), 32nd (64 notes), 8th (4 notes), triplet 16th (24 notes), start_with_upper, no_accent, error handling — 8/8 tests passed

  • +11 unit tests for trill pattern generation (283 total)

  • Example script: create_trill.py — 5 trills across genres (baroque, fast, slow, jazz shake, minor 3rd)

  • 289 MCP tools (254 low-level + 32 orchestration + 3 melodic)

  • ruff clean, CI green

v1.36.0 (2026-07-05)

  • create_chop orchestration tool (288 MCP tools) — slice source pitches into segments and rearrange. 5 modes: reverse (Dilla flip), stutter (glitch repeat), shuffle (Madlib random), ping-pong (ABBA), gate (chopped break). Octave shift for bass chops, velocity variation for human feel, inner-pitch reverse for nested chops. One call replaces 8-48 manual note creations. Essential for: hip-hop sampling, glitch-hop, bass music, sample flip workflows

  • E2E verified: reverse (4 notes), stutter x3 (12 notes), shuffle (5 notes), ping-pong (8 notes), gate (3 notes), octave shift, error handling — 8/8 tests passed

  • +13 unit tests for chop pattern generation (285 total)

  • Example script: create_chop.py — 6 chops across 48 beats (reverse, stutter, shuffle, ping-pong, gate, bass chop)

  • 288 MCP tools (254 low-level + 31 orchestration + 3 melodic)

  • ruff clean, CI green

v1.35.0 (2026-07-05)

  • create_bass_drop orchestration tool (287 MCP tools) — descending pitch sweep into sustained sub bass for dubstep/EDM/trap. Two phases: sweep (16th-note resolution pitch glide) + hold (sustained landing note). 3 curves (linear/exp/log), adjustable sweep (0.25-8 beats) and hold (0-16 beats). Complement to create_riser — riser builds up, bass drop lands. One call replaces 10-65 manual note creations. Essential for: dubstep drops, EDM build-and-drop, trap bass falls, impact transitions

  • E2E verified: default drop (33 notes, 32 sweep + 1 hold), sweep-only (64 notes), short aggressive (9 notes), error handling

  • 287 MCP tools (254 low-level + 30 orchestration + 3 melodic)

  • ruff clean, CI green

v1.34.0 (2026-07-05)

  • create_break orchestration tool (287 MCP tools) — classic drum break patterns for jungle/DnB/hip-hop/breakbeat. 6 presets: Amen Break, Think Break, Ashanti, Funky Drummer, When the Levee, Synthetic. 1-8 bars with variation modes (none/fill/humanize/drop) and swing. One call replaces 15-120 manual note creations. Essential for: breakbeat-based genres, sampling workflows, drum programming

  • E2E verified: Amen (14 notes), Think 2-bar fill (26 notes), Funky Drummer humanized (22 notes), Amen 2-bar drop (25 notes), Synthetic with swing (14 notes), error handling

  • 287 MCP tools (254 low-level + 30 orchestration + 3 melodic)

  • ruff clean, CI green

v1.33.0 (2026-07-05)

  • create_stab orchestration tool (287 MCP tools) — rhythmic chord stabs for house/disco/funk. Grid pattern with 'x' (stab), '-' (rest), '.' (ghost). Cycles through chord progressions. Adjustable octave, velocity, stab duration, pattern length. Ghost stabs use 45% velocity and shorter duration. One call replaces 20-60 manual note creations. Essential for: house off-beat stabs, funk syncopated punches, garage/shuffle patterns

  • E2E verified: house Cm7 off-beat (16 notes, 4 stabs), funky F7/Cm7 with ghost notes (28 notes, 7 hits), all-rests error, invalid rhythm error

  • 287 MCP tools (254 low-level + 30 orchestration + 3 melodic)

  • ruff clean, CI green

v1.32.0 (2026-07-05)

  • create_riser orchestration tool (284 MCP tools) — ascending pitch sweep for build-up transitions. 3 curves (linear, exp, log). Adjustable pitch range (MIDI 0-127), step count (8-128), length (0.25-16 beats). Velocity ramps up proportionally. One call replaces 10-50 manual note creations. Essential for: build-ups before drops, section transitions, tension creation

  • E2E verified: 32 notes, pitch 36→84, exp curve ascending, linear curve 16 notes, error handling

  • 287 MCP tools (254 low-level + 30 orchestration + 3 melodic)

  • ruff clean, CI green

v1.31.0 (2026-07-05)

  • werkstatt_stereowidth.js — M/S stereo width processor. 5 params: width (0=mono, 0.5=neutral, 1.5=wide), lowTrim (mono bass below crossover), lowFreq (50-500Hz crossover), mix, output. M/S encode → width scaling on side → low-freq trim → M/S decode. Essential for mastering: wide highs, mono bass

  • 41 DSP scripts (29 Werkstatt + 6 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params, width 0.5→1.2, lowTrim 0→0.7

  • ruff clean, CI green

v1.30.0 (2026-07-05)

  • apparat_pluck.js — Karplus-Strong plucked string synth. 7 params: decay (string decay rate), damping (lowpass strength), brightness (noise burst spectral content), attack, release, detune, volume. Noise burst excites delay line, averaging filter creates natural string decay. Unique physical modeling sound unavailable in other Apparat scripts

  • 40 DSP scripts (28 Werkstatt + 6 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 7 params, brightness 0.7→0.9, code header readback OK

  • ruff clean, CI green

v1.29.0 (2026-07-05)

  • werkstatt_transient.js — transient shaper with dual envelope followers. 4 params: attack (±12 dB transient boost/cut), sustain (±12 dB sustain boost/cut), mix, output. Fast envelope (~5ms) detects transients, slow envelope (~80ms) detects sustain, independent gain on each component. No threshold needed — works on any material. Essential for drum mixing

  • 39 DSP scripts (28 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 4 params, attack 0.5→0.8, sustain 0.5→0.3

  • ruff clean, CI green

v1.28.0 (2026-07-05)

  • werkstatt_deesser.js — dynamic de-esser, band-split architecture. 7 params: freq (2-12kHz crossover), threshold (-40..0 dB), ratio (1:1..10:1), attack, release, mix, output. 2nd-order Linkwitz-Riley HPF isolates sibilance, envelope-followed gain reduction on high band only. Completes vocal chain: EQ → compressor → de-esser → exciter → limiter

  • 38 DSP scripts (27 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 7 params, threshold 0.5→0.65, freq 0.4→0.8

  • ruff clean, CI green

v1.27.0 (2026-07-05)

  • werkstatt_exciter.js — harmonic exciter with band-split architecture. 5 params: freq (crossover 800Hz-12kHz), harmonics (0-1), drive (0-1), mix (0-1), output (±24 dB). Cascaded one-pole HPF isolates highs, cubic nonlinearity adds odd harmonics, parallel wet/dry. Completes mastering chain: EQ → compressor → exciter → limiter

  • 37 DSP scripts (26 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params, freq 0.3→0.75, harmonics 0.5→0.85

  • ruff clean, CI green

v1.26.0 (2026-07-05)

  • werkstatt_limiter.js — brickwall limiter with lookahead buffer + TPDF dither. 5 params: ceiling (0-1), release (10-500 ms), lookahead (0.1-5 ms), dither (TPDF on/off), mix. Instant attack, smooth release, circular lookahead buffer. Completes dynamics chain: compressor → limiter. Essential for mastering

  • werkstatt_exciter.js — harmonic exciter with band-split architecture. 5 params: freq (crossover 800Hz-12kHz), harmonics (0-1), drive (0-1), mix (0-1), output (±24 dB). Cascaded one-pole HPF isolates highs, cubic nonlinearity adds odd harmonics, parallel wet/dry. Completes mastering chain: EQ → compressor → exciter → limiter

  • 37 DSP scripts (26 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params, freq 0.3→0.75, harmonics 0.5→0.85, code header readback OK

  • ruff clean, CI green

v1.25.1 (2026-07-05)

  • +31 unit tests for music_theory functions — parse_melody_pattern (11 tests: ascending, rests, timing, velocity, scales, octaves, sharps, empty pattern), scale_to_pitches (6 tests: major, minor, length extension, octave, dorian, phrygian), chord_to_pitches (8 tests: triads, sevenths, diminished, sus4, octave, sharps), GENRE_PRESETS (6 tests: known genres, bpm/drums fields, bpm ranges)

  • 316 unit tests total (was 241), all passing

  • ruff clean, CI green

v1.25.0 (2026-07-05)

  • werkstatt_paraeq.js — 3-band parametric EQ + HP/LP filters. 12 params: 3 × (freq, gain ±18 dB, Q 0.1-6) + hp_freq + lp_freq + mix. Biquad filters (RBJ Audio EQ Cookbook). Signal chain: HP → Band1 → Band2 → Band3 → LP. Closes critical EQ gap — parametric EQ is fundamental to mixing, was the most requested missing DSP category

  • 35 DSP scripts (24 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 12 params with correct defaults, band1_gain 0→6 dB, band2_q 1→3.5, code header readback OK

  • ruff clean, CI green

v1.24.0 (2026-07-05)

  • werkstatt_compressor.js — soft-knee peak compressor. 7 params: threshold (0→-60 dB), ratio (1:1→20:1), attack (0.1→100 ms log), release (50→500 ms log), makeup (0→+24 dB), mix (dry/wet), knee (0→12 dB soft knee). Peak detection, one-pole envelope smoother, stereo-linked. Closes the biggest DSP gap — compressor is fundamental to mixing

  • Integration test fix — test_integration.py now skips when Playwright chromium is unavailable instead of failing. Checks both DAW reachability and browser availability

  • 34 DSP scripts (23 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 7 params with correct defaults, threshold 0.5→0.75, ratio 0.4→0.85, code header readback OK

  • ruff clean, CI green

v1.23.3 (2026-07-05)

  • werkstatt_multifilter.js — multi-mode SVF filter (Chamberlin topology). 4 modes: lowpass, highpass, bandpass, notch. 5 params: mode, cutoff (20-20kHz), resonance, drive, mix. Closes critical gap — standalone multi-mode filter was missing while allpass/dcremover existed

  • 34 DSP scripts (23 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params with correct defaults, mode switching (LP→HP), resonance cranked (0.3→0.8)

  • ruff clean, CI green

v1.23.2 (2026-07-05)

  • werkstatt_overdrive.js — asymmetric soft-clip overdrive (tube-like). 5 params: drive, tone, level, bias, dry. Asymmetric clipping = even harmonics = warmth. Pre-HP filter removes mud, post-LP tone control, dry blend for parallel overdrive

  • 32 DSP scripts (21 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 5 params with correct defaults, set_param works (drive 0.4→0.8, dry 0→0.3)

  • ruff clean, CI green

v1.23.1 (2026-07-05)

  • werkstatt_stereo_delay.js — stereo delay with ping-pong, feedback, tone filter. 6 params: time_l, time_r, feedback, tone, mix, pingpong. Fill gap — delay was missing from DSP library while reverb/chorus/flanger/phaser all present

  • 31 DSP scripts (20 Werkstatt + 5 Apparat + 6 Spielwerk)

  • E2E verified: compiled via ScriptCompiler, 6 params created with correct defaults, set_param works (feedback 0.35→0.6, pingpong 0→1.0)

  • ruff clean, CI green

v1.23.0 (2026-07-05)

  • apply_articulation — staccato/legato/tenuto/accent for existing notes. Duration reshaping for phrasing character (staccato=short, legato=connected, tenuto=full slot, accent=velocity boost on downbeats). Deterministic, not random

  • 13 unit tests for articulation math (staccato ratio, legato overlap, tenuto slot fill, accent boost) — 228→241 total

  • E2E verified: staccato (240→120, 8 notes), legato (240→228, 95% fill), accent (beats boosted to 0.9, off-beats stay 0.5)

  • 58 examples (added apply_articulation.py)

  • 283 MCP tools, 26 orchestration tools, ruff clean, CI green

v1.22.0 (2026-07-05)

  • apply_velocity_curve — deterministic velocity envelope across notes (ramp_up/ramp_down/arc/trough/power). Unlike humanize (random), this applies a mathematical curve shape — build-ups, fade-ins, crescendo rolls, expressive phrasing. Power exponent for exponential curves

  • 15 unit tests for velocity curve interpolation (ramp, arc, trough, power) — 213→228 total

  • E2E verified: ramp_up (0.2→1.0, 16 notes), arc (peak at middle=0.95), power=2.0 (slow rise, mid=0.36)

  • 54 examples (added apply_velocity_curve.py)

  • 282 MCP tools, 25 orchestration tools, ruff clean, CI green

v1.21.0 (2026-07-05)

  • apply_sidechain — sidechain ducking via volume automation. Classic pumping/breathing effect for house/techno/EDM. Adjustable depth, attack, release, kick interval

  • create_ghost_notes — ghost notes (quiet grace notes) for funk/R&B/neo-soul/hip-hop drumming. Seeded reproducibility, avoids occupied positions

  • 12 unit tests for sidechain ducking curve and ghost note placement logic — 201→212 total

  • E2E verified: sidechain (272 events, 16 kicks, error handling), ghost_notes (4 added, error handling)

  • 53 examples (added apply_sidechain.py, create_ghost_notes.py)

  • 281 MCP tools, 24 orchestration tools, ruff clean, CI green

v1.20.0 (2026-07-05)

  • create_call_response — call-and-response patterns (antecedent/consequent phrases). Foundation of blues, jazz, hip-hop, electronic. Alternates call → response with adjustable repeats

  • create_walking_bass — walking bass lines over chord progressions. Beat 1=chord root, beat 2=chord tone, beat 3=passing tone, beat 4=approach note. Jazz/blues/swing

  • 11 unit tests for call_response (interleave, timing, velocity) and walking_bass (beat positions, approach notes, bass range) — 190→201 total

  • E2E verified: call_response (blues ×4, error handling), walking_bass (ii-V-I, 12-bar blues, 2 bars/chord, error handling)

  • 51 examples (added create_call_response.py, create_walking_bass.py)

  • 279 MCP tools, 22 orchestration tools, ruff clean, CI green

v1.19.1 (2026-07-05)

  • create_scale_run — ascending/descending scale sequences for fills, transitions, build-ups. 14 scales, 1-4 octaves

  • 8 unit tests for scale run generation (major/minor/blues/chromatic/pentatonic, multi-octave, direction)

  • E2E verified: C minor up 1 oct (8 notes), A blues down 2 oct (13 notes), error handling

  • 277 MCP tools, 20 orchestration tools, ruff clean, CI green

v1.19.0 (2026-07-05)

  • apply_swing — pure swing feel for existing notes, deterministic, no randomness. 16th/8th grid, 0-1 depth. 0.58 = classic hip-hop/lofi swing

  • create_polyrhythm — polyrhythms: two streams with different subdivision counts (3:4, 2:3, 5:7, 7:8). Jazz, electronic, progressive, math rock

  • 12 unit tests for swing offset logic and polyrhythm generation (170→182 total)

  • E2E test for apply_swing (0.5/0.0/8th grid) and create_polyrhythm (3:4, 2:3, error handling)

  • 30 DSP scripts (added flanger, noisegate, tremolo)

  • 281 MCP tools, 24 orchestration tools, ruff clean, CI green

v1.18.0 (2026-07-05)

  • create_drum_fill — drum fills/transitions: 5 types (build, break, roll, crash, tom), adjustable density and bar length

  • create_ostinato — repeating melodic/rhythmic pattern as foundation layer, scale-based, 1-16 repeats

  • create_crescendo — crescendo/decrescendo on existing notes, 3 curves (linear, exp, log)

  • E2E verified: drum_fill (build+roll), ostinato (C minor ×4), crescendo (exp 0.2→0.9)

  • 276 MCP tools, 19 orchestration tools, ruff clean, CI green

v1.17.0 (2026-07-05)

  • create_counterpoint — new orchestration tool: generate counter-melody in contrary motion. Mirrors melody around center pitch. Auto-creates target track.

  • humanize_notes — new orchestration tool: velocity/timing/duration variation + swing. Seeded mulberry32 PRNG for reproducibility.

  • create_harmony — new orchestration tool: generate harmony from existing notes. 8 intervals (diatonic thirds/fifths/sixths + chromatic). Up/down direction.

  • reverse_notes — melodic variation: retrograde (reverse note order in region)

  • invert_notes — melodic variation: mirror inversion around axis pitch (newPitch = 2*axis - oldPitch)

  • suno-prompt-engineering skill — concentrated Suno prompt engineering guide from 20+ KB files

  • 7 new examples: create_melody, create_bassline, create_arpeggio, humanize_notes, create_harmony, create_counterpoint, reverse_invert_notes

  • TOOL_CATALOG: all 27 DSP scripts documented (was 7)

  • KB index sync: 31→33 entries (all files covered)

  • bridge.py: PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH env var for system chromium

  • 271 MCP tools, 43 examples, 9 skills, ruff clean, CI green

v1.16.1 (2026-07-05)

  • create_melody — new orchestration tool: generate melodies from scale + rhythmic pattern using scale degrees (1-7). Supports 14 scales, rests, sustains, octave shifts. One call replaces 10-30 create_note calls.

  • create_bassline — new orchestration tool: generate basslines from root + rhythmic pattern. Low octave default (C2=36), high velocity (0.9), octave up/down (+/_). One call replaces 8-20 create_note calls.

  • create_arpeggio — new orchestration tool: generate arpeggios from chord name with 6 patterns (up/down/updown/downup/random/chord) and 6 rates. One call replaces 8-32 create_note calls.

  • opendaw_mcp/music_theory.py — shared music theory module: NOTE_TO_PITCH, CHORD_INTERVALS, SCALE_INTERVALS, GENRE_PRESETS, chord_to_pitches(), scale_to_pitches()

  • DRY refactor: create_chord_progression and create_genre_track now import from music_theory instead of duplicating dicts inline

  • 2 new genres: coldwave (110 BPM, dark bass, Dm-Fmaj-Gmin-Amin) and hiphop (90 BPM, boom bap, Cm7-Ebmaj7-Gmin7-Bbmaj7) — create_genre_track now supports 8 genres

  • Scales: 14 scale types (major, minor, harmonic minor, melodic minor, dorian, phrygian, lydian, mixolydian, locrian, pentatonic major/minor, blues, chromatic)

  • 38 new unit tests (test_music_theory.py) — 150 total

  • ruff clean, 264 MCP tools intact, no regressions

v1.16.0 (2026-07-05)

  • Modular architecture — infrastructure extracted from 13K-line server.py into opendaw_mcp/ package:

    • constants.py — lookup tables (TIDAL_RATE_MAP, DELAY_SYNC_MAP, WAVESHAPER_FUNCS, REVAMP_SECTIONS)

    • bridge.py — HeadlessDawBridge class (Playwright bridge, DAW_HELPERS injection)

    • utils.py — pure-Python helpers (_parse_wav, _compute_lufs, _ok, _err, _safe_filename, _safe_path, _clamp_script_param)

    • __init__.py — public API, all symbols re-exported for backward compat

  • OpendawServer facade — class providing bridge + all mcp_opendaw_* tools as methods. Framework wrappers (LangChain, AutoGen, CrewAI) now work via this single interface.

  • server.py: 13244 → 12955 lines (infrastructure moved to package modules)

  • 0 regressions — 316 unit tests pass, ruff clean, all framework wrappers functional, 283 MCP tools intact

v1.15.2 (2026-07-04)

  • CrewAI toolkit — opendaw_mcp/crewai_tools.py wraps 27 tools for CrewAI. Custom OpendawCrewAITool class, category filtering, shared server instance.

  • GitHub Discussions seeded — 5 discussions: release announcement, 3 FAQ (bridge, GPU, MCP clients), genre showcase

  • 33 examples total (added crewai_integration.py)

v1.15.1 (2026-07-04)

  • AutoGen toolkit — opendaw_mcp/autogen_tools.py wraps 27 tools for Microsoft AutoGen. Category filtering, shared server instance.

  • Framework integration docs page — LangChain + AutoGen + MCP direct + Hermes, with comparison table

  • 32 examples total (added autogen_integration.py)

v1.15.0 (2026-07-04)

  • LangChain toolkit — opendaw_mcp/langchain_tools.py wraps 30+ tools as LangChain StructuredTool objects. Category filtering, auto bridge start. Use with any LangChain agent.

  • AutoGen toolkit — opendaw_mcp/autogen_tools.py wraps 27 tools for Microsoft AutoGen. Category filtering, shared server instance.

  • Docs site — mkdocs-material at https://ameobius.github.io/opendaw-mcp/ — 21 pages, dark mode, search, auto-deploy via GitHub Actions

  • PR template — structured checklist for contributors

  • PyPI metadata — Documentation, Issues, Changelog URLs pointing to docs site

  • dev.to article — "Controlling a DAW with AI Agents via MCP" (in promotion/)

  • 32 examples total (added langchain_integration.py, autogen_integration.py)

v1.14.4 (2026-07-04)

  • Final 2 genre examples (E2E verified): genre_lofi.py (82 BPM, swung drums, jazzy ii-V-I, warm) and genre_trap.py (145 BPM, fast hi-hat rolls, gliding 808, dark minor). All 8 genres from the skill now covered with E2E examples. 30 examples total.

v1.14.3 (2026-07-04)

  • 3 more genre examples (E2E verified): genre_hiphop.py (85 BPM, boom bap, 808 Ab minor), genre_dnb.py (174 BPM, Amen break, reese+sub F minor), genre_house.py (124 BPM, 4-on-floor, off-beat chord stabs Fmin9-Cmin9-Gmin9-Dmin9). 28 examples total, 6 genres covered.

v1.14.2 (2026-07-04)

  • 2 new genre examples (E2E verified): genre_coldwave.py (100 BPM, Am-Fmaj7-Cmaj-Gdom7, 4 tracks, Dattorro+Waveshaper) and genre_ambient.py (70 BPM, Cmaj7-Amin7-Fmaj7-Gmaj7, pad+bell+texture, long reverbs). 25 examples total.

  • Fixed return key names in genre examples (notes_created / total_notes / lanes)

v1.14.1 (2026-07-04)

  • opendaw-genres skill — 8 genre templates with concrete parameters: techno, coldwave, hip-hop, ambient, DnB, house, lofi, trap. BPM, track layout, drum patterns, bass lines, chord progressions, effect chains, pan, LUFS targets. Not theory — actual tool calls and values. 10 skills total.

v1.14.0 (2026-07-04)

  • 2 new agent skills: suno-to-opendaw (6-stage Suno→stems→openDAW→mix→master→export pipeline) and dsp-script-authoring (custom Werkstatt/Apparat/Spielwerk DSP script writing guide with patterns, validation, pitfalls). 7 skills total.

  • set_marker_repeat MCP tool (v1.13.1) — marker repeat count control (0=infinite)

  • 283 MCP tools (254 low-level + 26 orchestration)

v1.13.0 (2026-07-04)

  • Preset Management: 2 new MCP tools for openDAW preset format (.opb). save_effect_preset encodes any audio effect chain into a shareable .opb bundle via PresetEncoder.encodeEffects. load_effect_preset decodes .opb and applies it to a project. Enables agent-driven preset creation and reuse.

  • 5 Werkstatt presets published to upstream (PR #284): Dark Saturation, Plate Reverb, Cold Fold Distortion, Stereo Phaser, Stereo Chorus.

  • 283 MCP tools (254 low-level + 26 orchestration)

v1.12.1 (2026-07-04)

  • Stem Splitter: 2 new MCP tools for SOTA open-source source separation. split_stems runs 7 modes locally on GPU (ensemble, scnet, bs6, polarformer, dereverb, drumsep, denoise). Optional auto-import into DAW. Uses BS-Roformer, HTDemucs FT, SCNet XL, MelBand Roformer models.

  • list_split_modes — list all separation modes with SDR scores

  • 283 MCP tools (254 low-level + 26 orchestration)

v1.12.0 (2026-07-04)

  • Agent Skills: 10 structured skill files in skills/ directory — adaptive mix→master, suno-to-opendaw (Suno→stems→mix→master E2E), dsp-script-authoring (custom DSP), opendaw-genres (8 genre templates), opendaw-automation (283 tools, 146 ref files), track architecture, sound design, effect routing, composition patterns. Decision points for genre-adaptive workflows. Agent-agnostic.

  • 41 DSP scripts total (29 Werkstatt + 6 Apparat + 6 Spielwerk)

v1.11.9 (2026-07-04)

  • CodeRabbit fixes: reverb stereo width (separate L/R comb banks with decorrelated delay times, M/S width on reverb tail), paulstretch cursor split (independent read/write cursors, proper frame emission gating)

  • 41 DSP scripts total (29 Werkstatt + 6 Apparat + 6 Spielwerk)

v1.11.8 (2026-07-04)

  • New Werkstatt script: ring modulator with envelope-followed frequency modulation (#277) — workaround for MIDI input limitation in Werkstatt audio effects

  • 41 DSP scripts total (29 Werkstatt + 6 Apparat + 6 Spielwerk)

v1.11.7 (2026-07-04)

  • Suno→openDAW pipeline example: import AI-generated track, add mastering chain (tape sat + lookahead comp), reverb send bus, MIDI arp layer, render + stems + LUFS

v1.11.6 (2026-07-04)

  • 4 new Spielwerk MIDI effect scripts: chord memory, strummer, velocity scaler, MIDI delay

  • 1 new Python example: Suno→openDAW pipeline (import AI track, mastering chain, reverb send, arp layer, render+stems)

  • 41 DSP scripts total (29 Werkstatt + 6 Apparat + 6 Spielwerk)

v1.11.5 (2026-07-04)

  • 7 new DSP scripts: DC remover + stereo width (#91), allpass filter (#133), 2-operator FM synth (#138), chord memory, strummer, velocity scaler, MIDI delay

  • Coldfold fix: removed unused range variable (CodeRabbit review)

  • 41 DSP scripts total (29 Werkstatt + 6 Apparat + 6 Spielwerk)

v1.11.4 (2026-07-04)

  • 1 new Apparat script: ring modulator synth with ADSR and sub-oscillator (#277)

  • 18 DSP scripts total (12 Werkstatt + 4 Apparat + 2 Spielwerk)

v1.11.3 (2026-07-04)

  • 1 new Werkstatt script: real-time pitch shifter via delay-line sweep (#188)

  • Ruff lint fixes: removed unused imports/variables in examples and midi_parser

  • 17 DSP scripts total (12 Werkstatt + 3 Apparat + 2 Spielwerk)

v1.11.2 (2026-07-04)

  • 10 DSP bug fixes synced from upstream PR #283 CodeRabbit review:

    • darksat: undefined outR variable fix, DC blocker signal path corrected

    • chorus: delay buffer 2× for depth modulation, safe modulo for negative indices

    • coldfold: slew parameter /100 scaling removed (was disabling the parameter)

    • lookahead: gain reduction now applied to delayed signal (true lookahead)

    • reverb: comb filter indices advancing, per-comb damping state, M/S stereo width decode

    • shimmer: per-channel pitch shifter state (eliminates stereo crosstalk)

    • phaser: stable 1st-order allpass topology (2nd-order was unstable)

    • subcrusher: bidirectional glide (was diverging on upward glides)

    • arpeggiator: swing notes no longer dropped at block boundaries

  • 14 DSP scripts total (9 Werkstatt + 3 Apparat + 2 Spielwerk) — all CodeRabbit issues addressed

  • 2 new Werkstatt scripts: ADSR trim (sustained sample trimming, #241) + granular time-stretch (Hann window overlap + pitch shift, #201)

  • 1 new Werkstatt script: real-time pitch shifter via delay-line sweep (#188)

  • 1 new Apparat script: ring modulator synth with ADSR and sub-oscillator (#277)

  • 18 DSP scripts total (12 Werkstatt + 4 Apparat + 2 Spielwerk)

v1.11.1 (2026-07-04)

  • Scriptable device mapping info — list_script_params now returns full @param mapping metadata (min, max, mapping type, unit) via ScriptDeclaration.parseParams()

  • Range validation — set_script_param now validates values against @param declarations: bool snaps to 0/1, int rounds+clamps, linear/exp clamps to [min, max]. Returns clamped flag and range info

  • _clamp_script_param Python helper mirrors JS-side clamping logic

  • +15 unit tests (93 total) — TestScriptParamClamping: linear/exp/int/bool/unipolar clamping, rounding, snapping

  • +6 integration E2E tests — bridge startup, globals, track ops, scriptable compile, param clamping, latency benchmark (avg 4ms round-trip)

  • 5 new Werkstatt DSP scripts — reverb (Schroeder plate), chorus (stereo dual-LFO), phaser (allpass cascade), lookahead compressor (soft knee), shimmer delay (granular pitch shift). Total: 12 scripts

  • DAW_ScriptDeclaration added to headless-daw globals

v1.11.0 (2026-07-04)

  • apply_mix_preset — 8th orchestration tool: batch volume/pan/mute/solo across all tracks. Named presets (lofi, house, balanced, wide) or custom JSON

  • 258 MCP tools (252 low-level + 8 orchestration)

v1.10.2 (2026-07-04)

  • 24 new unit tests for orchestration tools (78 total) — curve interpolation, chord theory, drum pattern parsing, song structure parsing

  • TOOL_CATALOG fully synchronized — 0 discrepancies with server.py

v1.10.1 (2026-07-04)

  • 258 MCP tools (253 low-level + 7 orchestration)

  • create_song_structure — arrangement markers (intro/verse/chorus/bridge/outro) from JSON section list

  • automation_sweep — smooth automation ramps with linear/exp/log curves. Replaces 10-30 create_automation_event calls

  • PyPI v1.10.1 published — pip install opendaw-mcp

  • Both orchestration tools tested end-to-end via Playwright bridge

  • 54 tests, ruff clean, CI green

v1.10.0 (2026-07-04)

  • 7 orchestration tools — high-level composers for agents:

    • create_notes_batch — batch MIDI note creation (JSON array, one round-trip)

    • create_drum_pattern — step-sequencer notation (x...x... → drum beat)

    • create_chord_progression — chord names → auto-voiced notes ([["C","min7"]])

    • add_mastering_chain — EQ + Compressor + Maximizer with style presets

    • create_genre_track — full genre starting point (house/techno/lofi/dnb/trap/ambient)

    • create_song_structure — arrangement markers from JSON

    • automation_sweep — smooth parameter ramps with linear/exp/log curves

  • 258 total tools (250 low-level + 7 orchestration + 1 internal)

  • set_metronome — dedicated metronome control (enabled, gain, beat_subdivision)

  • Module-level lookup tables — TIDAL_RATE_MAP, DELAY_SYNC_MAP, WAVESHAPER_FUNCS, REVAMP_SECTIONS extracted for testability

  • +23 new unit tests (54 total) — fraction maps, waveshaper funcs, revamp sections, safe_filename edge cases

  • Official ScriptCompiler migration — set_script_device_code now uses the real ScriptCompiler from @opendaw/studio-adapters instead of custom @param/@sample parser. Benefits: declaration caching (WeakMap), proper sample file cleanup, label parsing, correct worklet wrapping

  • Stems export fix — useInstrumentOutput changed from True→False. Stems now route through channel strip (effects, sends, volume/pan) as documented by naomiaro/opendaw-test

  • export_dry_stem — new tool for freeze/flatten/re-amp workflows: captures raw instrument output before effects

  • set_waveshaper_equation — 6 transfer functions (hardclip/cubicSoft/tanh/sigmoid/arctan/asymmetric)

  • set_crusher_crush — sample-rate reduction with documented crush inversion semantics

  • set_revamp_filter — 7 EQ sections (highpass/lowshelf/lowbell/midbell/highbell/highshelf/lowpass) with enabled/freq/gain/q/order

  • set_tidal_rate — musical fraction string → Tidal LFO rate index (17 entries)

  • set_delay_sync — musical fraction string → Delay synced time index (21 entries, includes "off")

  • Effect lookup case-insensitive — add_effect("werkstatt") now works alongside Werkstatt

  • naomiaro/opendaw-test research — 543 commits, 17 SDK doc chapters used as authoritative reference for effect parameters and box field names

  • 54 tests, ruff clean, CI green

v1.9.6 (2026-07-03)

  • measure_lufs refactored — 223 lines → 20 lines. Extracted _parse_wav() and _compute_lufs() helpers

  • DRY: K-weighting coefficients — duplicated if/else branches (48kHz vs else) were identical, merged into single computation

  • 9 new unit tests — WAV parsing (float32/mono/stereo/PCM16/invalid/no-data) + LUFS computation (silence/full-scale/low-level/stereo)

  • Social preview banner — custom OpenGraph image for GitHub link previews

  • awesome-mcp PR updated — title and body synced to 255 tools

  • GitHub topics — 18 topics for discoverability

  • 31 total tests, ruff clean, CI green

v1.9.5 (2026-07-03)

  • CLI commands — --version, --list-tools, --help with full env var reference

  • 31 unit tests — pytest covering _ok, _err, _wrap_eval, _unwrap_eval, _safe_filename, _safe_path, _parse_wav, _compute_lufs

  • 3 bug fixes found by tests:

    • _ok() — {"success": False} in data overwrote the True flag (security fix)

    • _safe_filename() — case-sensitive extension stripping (.MP3 not stripped)

    • _safe_filename() — Windows backslash path traversal not handled on Linux

  • CI enhanced — now runs pytest (54 tests) alongside syntax/AST/smoke/ruff checks

  • PEP 561 — py.typed marker for type checker support

  • Mastering pipeline example — full chain: render → measure LUFS → auto-gain → stems → MP3

  • 25 examples total — all syntax-validated

  • 255 total tools (added export_dry_stem for freeze/flatten workflows)

v1.9.4 (2026-07-03)

  • Removed 2 duplicate tools (245 → 243)

    • delete_signature_event — superseded by delete_signature_change (richer: position match + index, returns updated event list)

    • list_aux_sends — superseded by list_sends (richer: target_bus_name, send_level_db, routing, send_pan via box-level access)

  • TOOL_CATALOG.md regenerated from AST — all 255 tools with descriptions, 32 categories

  • server.json Docker tag fixed — was stale 1.0.0, now matches release version

  • 255 total tools

v1.9.3 (2026-07-03)

  • DRY refactoring complete: 17 DAW_HELPERS, ~295 replacements, 0 raw enumeration patterns

    • New helpers: markerBoxes, sendBoxes, busBoxes, sampleBoxes, noteTrackBoxes, clipBoxes, rootClipBoxes, scriptParams, scriptSamples, chainBoxes

    • All pointerHub.incoming() enumeration patterns replaced across 245 tools

    • CONTRIBUTING.md updated with full 17-helper reference table

    • 6 DRY commits, 0 regressions, CI green

v1.9.2 (2026-07-03)

  • DRY refactoring: 113+ tools migrated to h.allAUBoxes() / h.auBox() helpers

    • Replaced 133 occurrences of raw [...rootBox.audioUnits.pointerHub.incoming()].map(({box}) => box).sort(...) boilerplate with h.allAUBoxes() across 113+ MCP tools

    • Box-level helpers eliminate ~3000 lines of duplicated AU enumeration code

    • E2E verified: allAUBoxes returns sorted array, auBox(i) returns box by index, count matches raw, box identity matches

  • Security hardening

    • Transport action enum validation (play, stop, toggle) — prevents JS injection

    • duplicate_effect chain_type enum validation (audio, midi)

    • _safe_filename() + _safe_path() helpers — os.path.basename() sanitization + path traversal protection on 6 render/export locations

    • _unwrap_eval bare except → json.JSONDecodeError

  • 245 total tools (no tool count change — refactoring only)

v1.9.1 (2026-07-03)

  • 2 new generic tools: Boolean & Integer effect parameter setters

    • set_effect_parameter_bool(unit_index, effect_index, parameter_name, value) — Generic boolean field setter. Covers Compressor (lookahead, automakeup, autoattack, autorelease), Gate (inverse), Maximizer (lookahead), StereoTool (invertL, invertR, swap), NeuralAmp (mono)

    • set_effect_parameter_int(unit_index, effect_index, parameter_name, value) — Generic integer field setter. Covers Vocoder (bandCount), StereoTool (panningMixing), Fold (overSampling), Crusher (bits), Delay (version). Device-specific tools are preferred when available.

  • 245 total tools

v1.9.0 (2026-07-03)

  • 6 new tools: Device-Specific Parameters & NeuralAmp Model Loading

    • set_neuralamp_model(unit_index, effect_index, model_json, label, pack_id) — Load NAM/Tone3000 model JSON directly into a NeuralAmp effect, bypassing the popup-based Select Flow. Creates NeuralAmpModelBox and links it via pointer

    • set_vocoder_modulator_source(unit_index, effect_index, source) — Set Vocoder modulator source: noise-white, noise-pink, noise-brown, self, or external

    • set_vocoder_band_count(unit_index, effect_index, band_count) — Set Vocoder filter band count (8-32)

    • set_stereo_tool_panning(unit_index, effect_index, panning_mixing) — Set StereoTool panning law (linear, equal-power)

    • set_fold_oversampling(unit_index, effect_index, oversampling) — Set Fold wavefolder oversampling (0=off, 1=2x, 2=4x)

    • set_crusher_bits(unit_index, effect_index, bits) — Set Crusher bit depth (1-16)

  • 255 total tools

v1.8.2 (2026-07-03)

  • 2 new tools: Audio Region Time Base & Waveform Offset

    • set_audio_region_time_base(unit_index, track_index, region_index, time_base) — Switch duration interpretation between 'musical' (PPQN, tempo-following) and 'seconds' (fixed wall-clock)

    • set_audio_region_waveform_offset(unit_index, track_index, region_index, offset) — Set waveform display offset for visual alignment

  • PR #280 closed — andremichelle confirmed it's our bundler setup issue, not upstream. Closing as requested.

  • 237 total tools

v1.8.1 (2026-07-03)

  • 3 new tools: Warp Marker CRUD — create_warp_marker, delete_warp_marker, update_warp_marker

    • create_warp_marker(unit_index, track_index, region_index, position_beats, seconds) — Add warp marker to stretched audio regions

    • delete_warp_marker(unit_index, track_index, region_index, marker_index) — Delete non-anchor warp marker

    • update_warp_marker(unit_index, track_index, region_index, marker_index, position_beats, seconds) — Update warp marker position/seconds (-1 = unchanged)

    • Enables agent-driven tempo matching: programmatically pin audio regions to musical positions

  • 235 total tools

v1.8.0 (2026-07-03)

  • 3 new tools: MP3/FLAC Audio Conversion — convert_audio, render_full_format, export_stems_format

    • convert_audio(filename, format, bitrate, quality) — WAV→MP3/FLAC via system ffmpeg

    • render_full_format(filename, format, bitrate) — render + convert in one step

    • export_stems_format(filename_prefix, format, bitrate) — stems + convert each

    • Uses system ffmpeg (4.4.2), not browser WASM — more reliable in headless mode

    • E2E: WAV 1.01MB → MP3 0.11MB (ratio 0.106) → FLAC 0.19MB (ratio 0.194) ✅

  • Bugfix: operator precedence in 14 division+nullish coalescing expressions

    • X / Quarter ?? 0 → (X ?? 0) / Quarter — prevents NaN→null for position/duration fields

  • Improvement: get_track_info now includes exclude_piano_mode field

  • 232 total tools

v1.7.4 (2026-07-03)

  • 3 new tools: Engine Sleep/Wake + Loading Check — engine_sleep, engine_wake, query_loading_complete

    • engine_sleep() — suspend audio processing to save CPU during non-audio operations

    • engine_wake() — resume audio processing

    • query_loading_complete() — check if all audio samples are loaded and ready

    • E2E: sleep ✅, wake ✅, loading (loaded=false, is_ready=true) ✅

  • Improvement: get_effect_chain + get_midi_effect_chain — now return short type names (Delay instead of DelayDeviceBox), plus class, minimized fields

v1.7.3 (2026-07-03)

  • 2 new tools: Instrument Automation — add_instrument_automation, list_automatable_fields

    • Automate any instrument parameter: Vaporisateur cutoff/volume/ADSR, Tape flutter/wow, Playfield sample mute

    • Per-sample targeting via sample_index for Playfield

    • list_automatable_fields introspects Pointers.Automation support (18/23 on Vaporisateur)

    • Addresses upstream #269 (playfield mute automation) via MCP

    • E2E: Vaporisateur cutoff automated (3 events) ✅, 18 automatable fields ✅

v1.7.2 (2026-07-03)

  • 3 new tools: Effect Duplication + Instrument Automation — duplicate_effect, add_instrument_automation, list_automatable_fields

    • duplicate_effect — duplicate single effect in-place with all params copied (audio or MIDI chain)

    • add_instrument_automation — automate any instrument parameter (Vaporisateur cutoff/volume, Tape flutter, Playfield sample mute, etc). Supports per-sample targeting via sample_index

    • list_automatable_fields — introspect which fields support Pointers.Automation (18/23 on Vaporisateur)

    • Addresses upstream issue #273 (Ctrl+D for audio effects) and #269 (playfield mute automation) via MCP

    • E2E tested: Delay duplicated with params ✅, Vaporisateur cutoff automated (3 events) ✅, 18 automatable fields detected ✅

  • Bugfix: transport(action) now respects action parameter — was always toggling, now correctly handles "play", "stop", "toggle"

  • Cleanup: removed unused region_type param from set_region_duration and set_region_mute

v1.7.1 (2026-07-03)

  • 4 new tools: Engine Control — engine_panic(), get_engine_status(), schedule_clip_play(clip_ids), schedule_clip_stop(track_ids)

    • Panic button for stuck audio, real-time engine monitoring (CPU load, position, BPM, playing state), session view clip triggering

    • E2E tested: get_engine_status ✅, engine_panic ✅

v1.7.0 (2026-07-03)

  • 2 new tools: DawProject Interop — export_dawproject(filename), import_dawproject(filename)

    • Export/import projects in .dawproject format (Bitwig, Ableton, rePitch compatible)

    • ZIP containing project.xml, metadata.xml, and audio samples

    • Enables cross-DAW workflow: create in openDAW → export to Bitwig, or import Bitwig project → render in openDAW

    • DawProject + DawProjectImport exposed as globals in headless-daw

    • E2E tested: export (2442 bytes, valid ZIP) → import (7 boxes, round-trip OK)

v1.6.2 (2026-07-03)

  • 2 new tools: Studio Settings — get_studio_settings(), set_studio_setting(category, key, value)

    • Read/write StudioPreferences: engine, visibility, editing, debug, storage, time-display, pointer

    • Control auto-create-output-maximizer, overlapping-regions-behaviour, enable-beta-features, auto-delete-orphaned-samples, note-audition-while-editing, and more

    • StudioPreferences exposed as DAW_StudioPreferences global in headless-daw

v1.6.1 (2026-07-03)

  • 4 new tools from DAW globals research — set_unit_minimized, list_aux_sends, capture_realtime, get_sample_info

    • Mixer minimize, aux send listing, realtime audio capture, sample metadata

v1.6.0 (2026-07-03)

  • DAW_HELPERS refactoring — all 180 tools with const p = window.DAW migrated to const h = window.DAW_HELPERS pattern

    • Eliminated boilerplate: AU list enumeration, sort, editing.modify wrapping

    • Fixed 19+ pre-existing bugs: setPosition (api→engine), 8x missing .sort() on AU lists, 9x Quarter=960 hardcode → h.ppqn.Quarter, 2x Python/JS scope leaks

    • DAW_HELPERS provides: h.au(i), h.track(), h.region(), h.modify(), h.allAUs(), h.ppqn, h.uuid, h.rootBox, h.api, h.editing, h.boxGraph, h.tempoMap, h.rootBoxAdapter, h.project

  • E2E verified: 23/23 tests passing

v1.5.2 (2026-07-02)

  • Sanitization: all string parameters sanitized against JS injection

  • Documentation: README badges, Docker, SSE, examples, mastering

  • CI: GitHub Actions with AST tool count verification

v1.5.0 (2026-07-01)

  • Modular system: 6 MCP tools for patchable modular synthesizer

  • PianoMode: 6 MCP tools for piano roll view control

  • Freeze/unfreeze: pre-render AU to save CPU

  • Preset save/load: export/import AU as base64 preset

  • Transfer regions/AUs: deep-copy with dependency tracking

Available Tools

515 tools
mcp_opendaw_accent_beatsA

Apply beat-aware velocity accents to notes based on their position.

Unlike apply_velocity_pattern (which cycles by note index), this determines accent strength from each note's beat position — downbeats get strong, off-beats get weak. This is how real drummers and musicians play.

Accent patterns:

  • "4/4" — beat 1 strong, 2 medium, 3 medium, 4 weak (classic rock/pop)

  • "backbeat" — beats 1+3 medium, 2+4 strong (rock, funk, soul)

  • "3/4" — beat 1 strong, 2 weak, 3 medium (waltz)

  • "6/8" — beats 1+4 strong, others weak (compound duple)

  • "off_beat" — downbeats weak, off-beats strong (syncopated, reggae skank)

  • "four_on_floor" — every quarter strong (house, techno)

Notes that fall on exact beat boundaries get accent levels. Notes between beats (e.g. 16th notes) get interpolated: closer to a strong beat → higher.

Use cases:

  • Make drum patterns feel groovy instead of flat

  • Add natural dynamics to programmed basslines

  • Emphasise downbeats in chord stabs

  • Create backbeat feel on snare/hihat

unit_index: AU index. track_index: Note track index. accent_pattern: Beat accent scheme (4/4, backbeat, 3/4, 6/8, off_beat, four_on_floor). strong_velocity: Velocity for strong beats (0-1). medium_velocity: Velocity for medium beats (0-1). weak_velocity: Velocity for weak beats (0-1). region_index: Region (-1 = first region).

Returns count of notes accented and per-level breakdown.

Example:

Backbeat feel — accent beats 2 and 4

accent_beats(0, 0, "backbeat", strong_velocity=1.0, weak_velocity=0.5)

Four-on-the-floor — every beat loud

accent_beats(0, 0, "four_on_floor", strong_velocity=0.95)

Inputs: unit_index (required), track_index (required), region_index, weak_velocity, +3 more. Returns: result

mcp_opendaw_add_anticipationA

Add anticipation notes before strong-beat notes.

Anticipation is the fourth classic non-chord tone technique: a note that arrives early — on the weak part of the beat before a strong beat — anticipating the pitch of the upcoming note. This creates forward rhythmic motion and is ubiquitous in jazz, pop, and Latin music.

Unlike passing tones (which connect two different pitches stepwise), suspensions (which hold a note into the next chord), and neighbor tones (which ornament a single note), anticipation reaches forward to the next melodic/harmonic goal before the beat arrives.

Structure: [original note shortened] → [anticipation on weak beat] → [strong beat note]

The tool finds notes on strong beats (integer beat positions) and inserts an anticipation note just before them. The anticipation has the same pitch as the target note (or a related scale tone if direction is set), placed on the weak portion of the beat.

Jazz syncopation, pop vocal anticipations, salsa montuno, and funk guitar stabs all rely on this device.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) scale: Scale for anticipation pitch selection ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues", "chromatic") root: Root note for scale (C, C#, D, ... B) anticipation_offset: How early the anticipation arrives, in beats before the strong beat (0.0625-0.5, default 0.25 = sixteenth note before). Smaller = more subtle, larger = more pronounced. anticipation_fraction: Duration of anticipation as fraction of the offset gap (0.1-1.0, default 0.33). Controls how long the anticipation note lasts relative to the gap before the strong beat. anticipation_velocity: Velocity of anticipation note (0-1, default 0.55 — softer than the main note, as it is on a weak beat). direction: Anticipation pitch direction — "auto": same pitch as target note (classic anticipation) "upper": one scale step above target "lower": one scale step below target "approach": scale step approaching target from the direction of the previous note min_duration_beats: Minimum note duration in beats to qualify (0.5-4.0, default 1.5). Ensures the target note is long enough to anticipate meaningfully. cross_track: If >= 0, place anticipations on this track index instead of source track (preserves original notes).

Inputs: unit_index (required), track_index (required), root, scale, +7 more. Returns: result

mcp_opendaw_add_automationA

Add parameter automation to an effect on an audio unit.

Creates an automation track + value clip + value events. Automation points control the parameter over time.

unit_index: Audio unit index. effect_index: Effect position in the chain. parameter_name: Parameter to automate (e.g. "cutoff", "volume", "mix"). points: JSON array of [position_beats, value_0_to_1] pairs. Example: "[[0, 0.5], [4, 1.0], [8, 0.5]]"

The parameter must be automatable (Field<Pointers.Automation>).

Inputs: points (required), unit_index (required), effect_index (required), parameter_name (required). Returns: result

mcp_opendaw_add_bass_chainA

Add a ready-made bass processing chain to an audio unit — EQ → Compressor (+ optional Waveshaper drive).

One call replaces 2-3 individual add_effect + set_effect_parameter calls. Designed for bass tracks but works on any low-frequency content.

unit_index: Target audio unit (the bass track). style: Preset character:

  • "deep" — sub boost, slow comp, thick low end (hip-hop, trap, 808s)

  • "round" — low-mid warmth, gentle comp (R&B, jazz, soul)

  • "driven" — low cut, mid boost, comp + drive (rock, punk bass)

  • "clean" — transparent, minimal coloration (electronic, house)

  • "tight" — fast comp, controlled, punchy (disco, funk, pop)

drive_amount: Waveshaper saturation (0-1, default 0 = off). Use 0.2-0.5 for grit.

Creates: Revamp EQ → Compressor (→ Waveshaper) on the target AU. Returns effect indices and parameter values set.

Example:

Deep sub bass chain

add_bass_chain(0)

Driven rock bass with grit

add_bass_chain(0, style="driven", drive_amount=0.4)

Clean electronic bass

add_bass_chain(0, style="clean")

Inputs: style, unit_index, drive_amount. Returns: result

mcp_opendaw_add_chord_tensionA

Add a tension/extension note to an existing chord — jazz harmony.

Adds an extension note (9th, 11th, 13th, or alterations) to a chord already on the timeline. This is how triads become jazz chords — stack a 9th on a C major triad and it becomes Cmaj9, add a b13 to a G7 and it becomes G7b13. The extension is calculated from the chord root, so you don't need to know the exact pitch.

extension: The tension note to add:

  • "9" — major 9th (2 semitones above root, +14 from root). Adds color and warmth. C → D. The most common jazz extension.

  • "b9" — minor 9th (1 semitone above root, +13). Dark, tense. Dominant chords in minor keys, flamenco, film scores. C → Db.

  • "#9" — augmented 9th (3 semitones, +15). The Hendrix chord sound. Bluesy, gritty. C → D#.

  • "11" — perfect 11th (5 semitones above root, +17). Suspended, open. C → F. Can clash with 3rd — use carefully.

  • "#11" — augmented 11th (6 semitones, +18). Lydian sound. Dreamy, floating. C → F#. Common in modal jazz.

  • "13" — major 13th (9 semitones above root, +21). Full, rich. The ultimate jazz extension. C → A. Adds completeness.

  • "b13" — minor 13th (8 semitones, +20). Dark, dramatic. Minor key dominants. C → Ab. Spanish/orchestral feel.

chord_position: Beat position of the chord (finds root = lowest note). octave: Which octave to place the extension in (3-7, default 5). Higher = more color, lower = more grounded. velocity: Velocity of the added note (0-1, default 0.6 = subtle).

Returns root pitch, extension pitch, extension name, chord size.

Example:

Add 9th to first chord — Cmaj → Cmaj9

add_chord_tension(0, 2, 0, 0.0, extension="9")

Add b13 for dark dominant — G7 → G7b13

add_chord_tension(0, 2, 0, 4.0, extension="b13")

Inputs: unit_index (required), track_index (required), region_index (required), chord_position (required), +3 more. Returns: result

mcp_opendaw_add_drum_chainA

Add a ready-made drum processing chain to an audio unit — Gate → EQ → Compressor (+ optional Reverb).

One call replaces 3-4 individual add_effect + set_effect_parameter calls. Designed for drum tracks but works on any rhythmic content.

unit_index: Target audio unit (the drum track). style: Preset character:

  • "punchy" — tight gate, bright EQ, fast comp (pop, rock drums)

  • "deep" — loose gate, sub boost, slow comp (hip-hop, trap, 808s)

  • "crisp" — bright EQ, fast attack comp (techno, house, electronic)

  • "roomy" — medium gate, warm EQ, lush reverb (rock, live drums)

  • "tight" — transparent, just cleanup (jazz, acoustic, lofi)

reverb_amount: Reverb wet/dry (0-1, default 0 = off). Use 0.1-0.3 for room sound.

Creates: Gate → Revamp EQ → Compressor (→ Reverb) on the target AU. Returns effect indices and parameter values set.

Example:

Punchy drum chain on track 0

add_drum_chain(0)

Deep 808 chain

add_drum_chain(0, style="deep")

Roomy rock drums with reverb

add_drum_chain(0, style="roomy", reverb_amount=0.25)

Inputs: style, unit_index, reverb_amount. Returns: result

mcp_opendaw_add_effectA

Add an audio effect to an audio unit's effect chain.

effect_type: One of the audio effect names from mcp_opendaw_list_effects: Compressor, Crusher, DattorroReverb, Delay, Fold, Gate, Maximizer, NeuralAmp (Tone3000), Reverb, Revamp, StereoTool, Tidal, Vocoder, Waveshaper, Werkstatt

Returns effect_index — use it with mcp_opendaw_set_effect_parameter.

Inputs: unit_index (required), effect_type (required). Returns: result

mcp_opendaw_add_instrument_automationA

Automate a parameter on the instrument connected to an audio unit.

Works with any automatable instrument field: Vaporisateur (cutoff, resonance, volume, etc), Playfield sample mute, Tape flutter/wow, Nano volume/release, and more.

For Playfield sample-level params (mute, volume, pan, etc), set sample_index to the sample slot index (0-based). For top-level instrument params, leave sample_index as -1.

unit_index: Audio unit index containing the instrument. parameter_name: Field name to automate (e.g. "cutoff", "mute", "flutter"). points: JSON array of [position_beats, value] pairs. Example: "[[0, 0.5], [4, 1.0]]" sample_index: For Playfield, which sample slot to target (-1 = top-level instrument field).

Returns automation track info and number of events created.

Inputs: points (required), unit_index (required), parameter_name (required), sample_index. Returns: result

mcp_opendaw_add_instrument_chainA

Add a ready-made instrument processing chain — EQ → Compressor → Reverb (+ optional Delay).

Universal chain for guitars, keys, synth leads, strings, pads — any melodic/harmonic instrument. One call replaces 3-4 individual add_effect + set_effect_parameter calls.

unit_index: Target audio unit (the instrument track). style: Preset character:

  • "clean" — transparent EQ, light comp, subtle reverb (keys, piano, clean guitar)

  • "warm" — low-mid warmth, tube-like comp (jazz guitar, Rhodes, warm synths)

  • "bright" — air boost, present mids, short reverb (lead guitar, synth lead, pop keys)

  • "ambient" — wide EQ, minimal comp, lush reverb (pads, strings, atmospheres)

  • "driven" — mid crunch, drive comp, room reverb (rock guitar, aggressive synths)

reverb_amount: Reverb wet/dry (0-1, default 0.15 = subtle). delay_amount: Optional delay wet/dry (0-1, default 0 = off).

Creates: Revamp EQ → Compressor → Reverb (→ Delay) on the target AU. Returns effect indices and parameter values set.

Example:

Clean keys chain

add_instrument_chain(0)

Ambient pad with lush reverb

add_instrument_chain(0, style="ambient", reverb_amount=0.4)

Driven rock guitar

add_instrument_chain(0, style="driven", reverb_amount=0.2)

Synth lead with delay

add_instrument_chain(0, style="bright", delay_amount=0.2)

Inputs: style, unit_index, delay_amount, reverb_amount. Returns: result

mcp_opendaw_add_markerA

Add a timeline marker at a position.

Markers label song structure points (Verse, Chorus, Bridge, etc.). Visible on the timeline ruler.

position_beats: Position in beats. label: Marker text (e.g. "Verse 1", "Chorus", "Drop").

Inputs: label (required), position_beats (required). Returns: result

mcp_opendaw_add_mastering_chainA

Add a ready-made mastering chain to the output bus — EQ + compressor + maximizer in one call.

target_lufs: Target loudness (-14 = Spotify, -16 = Apple, -10 = loud). style: Preset character:

  • "balanced" — transparent EQ, gentle comp, clean limiter

  • "warm" — low shelf boost, slower comp attack, soft saturation

  • "loud" — aggressive comp, fast release, hard limit

  • "transparent" — minimal EQ, light comp, true peak limiting

Creates: Revamp EQ → Compressor → Maximizer on the output/master AU. Returns the effect indices and parameter values set.

Inputs: style, target_lufs. Returns: result

mcp_opendaw_add_midi_effectA

Add a MIDI effect to an audio unit's MIDI effect chain.

MIDI effects process note data before the instrument. They are chained on au.midiEffects (separate from audio effects on au.audioEffects).

effect_type: One of: Arpeggio, Pitch, Velocity, Zeitgeist, Spielwerk

unit_index: Audio unit index (must be an instrument AU, not output). Returns effect_index in the MIDI chain.

Inputs: unit_index (required), effect_type (required). Returns: result

mcp_opendaw_add_modular_moduleA

Add a module to a Modular device.

au_index: Audio unit index. effect_index: Effect index within the AU. module_type: One of "gain", "delay", "multiplier", "audio-input", "audio-output". label: Optional label for the module. x, y: Position in the modular editor grid.

Returns the new module's index and info.

Inputs: au_index (required), module_type (required), effect_index (required), x, +2 more. Returns: result

mcp_opendaw_add_neighbor_tonesA

Add upper/lower neighbor tones to embellish existing notes.

A neighbor tone is a non-chord tone that steps away from the main note by one scale step (up or down) and then returns. Unlike passing tones which connect two different notes, neighbor tones ornament a single sustained note.

Structure: [main first part] → [neighbor (dissonance)] → [main return]

The original note is split into three parts:

  1. First part: original pitch from start to neighbor_offset

  2. Neighbor: one scale step away, duration = neighbor_fraction of original

  3. Return: original pitch for the remainder

This is the third of the four classic non-chord tone techniques: passing tones, suspensions, neighbor tones, and anticipation.

Bach ornaments, jazz ballad fills, country chicken pickin', and classical cadenzas all use neighbor tones extensively.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) scale: Scale for diatonic neighbor step ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues", "chromatic") root: Root note for scale (C, C#, D, ... B) direction: Neighbor direction — "upper": step up from main note (most common) "lower": step down from main note "alternating": alternate upper/lower per note neighbor_fraction: Duration of neighbor as fraction of original note (0.1-0.5, default 0.25 = quarter of original). Smaller values create subtle ornaments, larger create more prominent embellishments. neighbor_offset: Position of neighbor within the note (0.1-0.9, default 0.5 = middle). 0.15 = near start, 0.5 = middle, 0.85 = near end. neighbor_velocity: Velocity of neighbor note (0-1, default 0.6 — softer than the main note, as is traditional for ornaments). min_duration_beats: Minimum note duration in beats to embellish (0.5-4.0, default 1.0). Short notes are skipped — ornaments need room to breathe. cross_track: If >= 0, place neighbors on this track index instead of source track (preserves original notes).

Inputs: unit_index (required), track_index (required), root, scale, +7 more. Returns: result

mcp_opendaw_add_passing_tonesA

Add passing tones between existing notes for smoother melodic lines.

Inserting diatonic passing tones in gaps where consecutive notes have an interval larger than a 2nd. The passing tone is placed on the weak part of the beat, connecting the two notes stepwise through the scale.

This is a fundamental counterpoint technique — makes large melodic leaps sound smoother by filling them with scale steps. Bach inventions, jazz walking lines, and pop vocal melismas all use passing tones.

Passing tones are only added when:

  • The interval between consecutive notes is > 2 semitones

  • There is enough time gap between notes (at least 1/8 note)

  • The interval does not exceed max_interval semitones

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) scale: Scale for diatonic passing tones ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues", "chromatic") root: Root note for scale (C, C#, D, ... B) max_interval: Maximum interval (semitones) to fill with passing tones (3-12, default 7 = perfect 5th). Intervals larger than this are left as leaps. velocity: Velocity of passing tones (0-1, default 0.6 — slightly quieter than melodic notes, as is traditional) duration_fraction: Duration of passing tones as fraction of the gap between notes (0.25-1.0, default 0.5) direction: Passing tone direction — "auto": choose direction that fits scale better "ascending": always step up from lower to higher note "descending": always step down from higher to lower note "nearest": use nearest scale tone to midpoint cross_track: If >= 0, place passing tones on this track index instead of source track (preserves original melody)

Inputs: unit_index (required), track_index (required), root, scale, +6 more. Returns: result

mcp_opendaw_add_signature_changeA

Add a time signature change at a specific position in the track.

Unlike set_time_signature (which sets the global default), this creates a SignatureEventBox on the timeline's signature track, allowing time signature changes mid-track (e.g. 4/4 → 3/4 → 4/4).

position_beats: Position in beats where the change occurs. numerator: Number of beats per bar (top number). denominator: Note value per beat (bottom number: 4=quarter, 8=eighth).

Returns the created signature event details.

Inputs: numerator (required), denominator (required), position_beats (required). Returns: result

mcp_opendaw_add_suspensionA

Add suspension-resolutions to existing notes.

A suspension is a non-chord tone technique where a note from the previous chord is held over (suspended) into the next chord on a strong beat, creating dissonance, then resolves by step (usually downward) to a chord tone.

Structure: Preparation (held note) → Suspension (dissonance on strong beat) → Resolution (step down/up to chord tone).

This tool finds notes on strong beats (downbeats) and creates a suspension before them: a preparatory note a step above (or below) the target, held into the strong beat, then resolving to the target note.

This is one of the most expressive devices in Western music — Bach chorales, jazz ballads, film scores all rely on suspensions for emotional tension-release.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) scale: Scale for resolution step ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "chromatic") root: Root note for scale resolution: Resolution direction — "down": resolve downward by step (classic 4-3, 9-8, 7-6 suspension) "up": resolve upward by step (rare, retardation) "both": alternate down/up per note suspension_offset: Semitone offset of suspension from target (1-7, default 2 = step above for down resolution). The suspension is placed this many semitones above (for "down" resolution) or below (for "up" resolution) the target note, then snaps to nearest scale tone. preparation_beats: Duration of the preparation note in beats (0.25-2.0, default 0.5 = eighth note before strong beat). suspension_velocity: Velocity of suspension note (0-1, default 0.75 — slightly accented, it is on a strong beat). resolution_velocity: Velocity of resolution note (0-1, default 0.65 — resolution is typically softer). cross_track: If >= 0, place suspensions on this track index instead of source track (preserves original melody).

Inputs: unit_index (required), track_index (required), root, scale, +7 more. Returns: result

mcp_opendaw_add_tempo_changeA

Add a tempo (BPM) change at a specific position in the track.

Creates a ValueEventBox on the timeline's tempo track, allowing BPM automation mid-track (e.g. 120 BPM → 90 BPM → 140 BPM).

The tempo track uses normalized values (0..1) mapped to minBpm..maxBpm (default 60..240). This tool handles the conversion automatically.

position_beats: Position in beats where the tempo change occurs. bpm: Target BPM (60-240). interpolation: 'linear' for smooth transition, 'hold' for instant jump.

Returns the created tempo event and full tempo map.

Inputs: bpm (required), interpolation (required), position_beats (required). Returns: result

mcp_opendaw_add_vocal_chainA

Add a ready-made vocal processing chain to an audio unit — EQ + compressor + reverb (+ optional delay).

One call replaces 3-4 individual add_effect + set_effect_parameter calls. Designed for vocal tracks but works on any melodic content.

unit_index: Target audio unit (the vocal track). style: Preset character:

  • "balanced" — transparent EQ, gentle comp, medium reverb (pop)

  • "warm" — low-mid warmth, slower comp, lush reverb (R&B, soul)

  • "bright" — air boost, fast comp, short reverb (pop, radio)

  • "intimate" — minimal EQ, light comp, small room (ballad, acoustic)

  • "aggressive" — presence boost, hard comp, plate reverb (rock, rap)

reverb_amount: Reverb wet/dry (0-1, default 0.25 = subtle). delay_amount: Optional slap delay wet/dry (0-1, default 0 = off).

Creates: Revamp EQ → Compressor → Reverb (→ Delay) on the target AU. Returns effect indices and parameter values set.

Example:

Balanced vocal chain on track 0

add_vocal_chain(0)

Warm R&B vocal with lush reverb

add_vocal_chain(0, style="warm", reverb_amount=0.35)

Pop vocal with slap delay

add_vocal_chain(0, style="bright", delay_amount=0.15)

Inputs: style, unit_index, delay_amount, reverb_amount. Returns: result

mcp_opendaw_analyze_dynamicsA
Read-only

Dynamics analysis — crest factor, loudness range, transient density, segment RMS.

Measures the dynamic character of a track:

  • crest_factor_db: Peak/RMS ratio in dB (high = dynamic, low = compressed/squashed)

  • loudness_range_db: LRA — 95th-10th percentile of short-term RMS (high = varied dynamics)

  • dynamic_range_db: max-min window RMS (total loudness variation)

  • transient_density: energy spikes per second (high = percussive/transient-rich)

  • segment_variation_db: RMS variation across 10 segments of the track

  • segments: per-segment RMS (dB) with time positions

Compression decision guidance:

  • crest_factor < 6 dB → heavily compressed, low headroom

  • crest_factor > 15 dB → very dynamic, may need compression

  • loudness_range < 4 dB → flat/squashed, lacks dynamic interest

  • loudness_range > 12 dB → very dynamic, may need leveling

  • transient_density > 10 → percussive/transient-heavy content

  • segment_variation > 6 dB → significant level changes between sections

Args: filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns dynamics descriptors, 10-segment RMS contour, and compression suggestions.

Inputs: filename (required). Returns: result

mcp_opendaw_analyze_harmonic_rhythmA
Read-only

Analyze harmonic rhythm — how fast chords change and where.

Identifies chords from MIDI notes (same logic as identify_chords), then analyses the rhythm of chord changes:

  • Chord change positions: exact beat where each new chord starts

  • Chord durations: how long each chord lasts (in beats and bars)

  • Harmonic rhythm rate: fast (<2 bars), medium (2-4 bars), slow (>4 bars)

  • Harmonic density: chords per bar

  • Chord sequence: ordered list of chords with durations

  • Stable sections: where harmony stays the same for 4+ bars

  • Active sections: where chords change every bar or faster

  • Total harmonic events: number of distinct chord changes

This complements identify_chords (which lists chords) by focusing on the temporal pattern of harmony — essential for understanding arrangement, predicting where tension builds, and planning variations.

Use with:

  • analyze_song_structure (structure + harmonic rhythm = full form picture)

  • reharmonize_progression (know what to reharmonize and where)

  • create_arrangement_variation (match or contrast harmonic rhythm)

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = first, -2 = all regions on track). group_tolerance: Beats of tolerance for grouping notes (default 0.25). min_notes: Minimum notes for chord identification (default 3).

Returns harmonic rhythm analysis with chord timeline and section classification.

Inputs: unit_index (required), track_index (required), min_notes, region_index, +1 more. Returns: result

mcp_opendaw_analyze_melodyA
Read-only

Analyze melodic content — contour, intervals, direction, climax.

Returns a detailed melodic analysis of notes in a region:

  • Contour profile: direction (up/down/static) for each consecutive interval

  • Interval histogram: count of each interval size (semitones)

  • Step vs leap ratio: percentage of steps (≤2 semitones) vs leaps (>2)

  • Direction changes: how often melody changes direction

  • Climax: highest pitch and its position

  • Nadir: lowest pitch and its position

  • Phrase analysis: groups by rests (gaps > 1 beat) into phrases

  • Contour shape classification: ascending/descending/arch/v_shape/wave/static

  • Melodic range: semitone span between lowest and highest

  • Average interval size

Useful for:

  • Understanding a melody before variation/reharmonization

  • Comparing melodies (which is more jagged, which more stepwise?)

  • Identifying climax placement (is the high point early, middle, late?)

  • Feeding analysis to create_motif_variations

  • Evaluating AI-generated melodies for contour interest

unit_index: AU index. track_index: Note track index. region_index: Region (-1 = first region).

Returns analysis object.

Example: analysis = analyze_melody(0, 3)

contour_shape, climax_position, step_leap_ratio, interval_histogram

Inputs: unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_analyze_mixA
Read-only

Complete mix diagnosis in one call — combines track + spectrum + stereo + dynamics.

Runs all four analysis modules and synthesizes a single prioritized report:

  1. analyze_track: BPM, key, LUFS, duration

  2. analyze_spectrum: 7-band frequency balance, spectral centroid, rolloff

  3. analyze_stereo: width, L/R balance, phase correlation, mono compat

  4. analyze_dynamics: crest factor, LRA, transient density, segment contour

Produces prioritized mix_suggestions (sorted by severity) and a master_check with platform-specific LUFS targets:

  • Spotify: -14 LUFS

  • Apple Music: -16 LUFS

  • YouTube: -14 LUFS

  • CD: no target (full dynamics)

The agent can call this single tool instead of 4 separate calls, getting a complete picture for mix decisions: EQ, compression, stereo, mastering.

Args: filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns combined analysis + prioritized suggestions + master check.

Inputs: filename (required). Returns: result

mcp_opendaw_analyze_phaseA
Read-only

Per-band phase analysis — coherence, polarity, inter-channel delay.

Checks for phase problems that destroy mono compatibility:

  • Per-band phase correlation (sub, bass, mid, high)

  • Polarity check (inverted channels?)

  • Inter-channel sample delay (misaligned mics, plugin latency)

  • Mono compatibility score (what happens when L+R collapse to mono)

Low-frequency phase issues are critical: bass should be mono. High-frequency phase issues widen stereo but risk mono cancellation.

filename: WAV file in exports dir, or absolute path.

Returns per-band phase coherence + mono compatibility assessment.

Inputs: filename (required). Returns: result

mcp_opendaw_analyze_song_structureA
Read-only

Analyze song structure by segmenting MIDI content into structural parts.

Scans all note tracks bar-by-bar, computes per-bar features (note density, pitch range, average velocity, active track count), groups consecutive bars into segments, and classifies each segment as intro/verse/chorus/bridge/ outro/breakdown based on density and energy patterns.

Essential for: understanding existing arrangements, finding where sections change, verifying song form, and planning variations or extensions.

unit_index: AU index (-1 = all AUs). bars_per_segment: Minimum bars per structural segment (default 4). Groups of bars with similar density are merged into segments of at least this length.

Returns per-segment classification with bar range, density, energy, and feature summary.

Inputs: unit_index, bars_per_segment. Returns: result

mcp_opendaw_analyze_spectrumA
Read-only

Spectral analysis of audio across 7 ISO frequency bands.

Divides the spectrum into standard bands:

  • sub_bass (20-60 Hz), bass (60-250 Hz), low_mids (250-500 Hz), mids (500-2000 Hz), high_mids (2000-4000 Hz), presence (4000-6000 Hz), brilliance (6000-20000 Hz)

Per band: RMS (linear + dB), peak (dB), energy percentage. Global descriptors:

  • spectral_centroid_hz: brightness (weighted mean frequency)

  • spectral_spread_hz: frequency variance around centroid

  • spectral_rolloff_95_hz: frequency below which 95% of energy lies

  • low_high_ratio: energy <250 Hz / energy >250 Hz (tonal balance)

  • spectral_crest: peak/mean power ratio (tonal vs noisy)

Use after analyze_track for mix decisions:

  • High low_high_ratio → bass-heavy mix, may need EQ cut in low mids

  • Low spectral_centroid → dark/muffled, consider high shelf boost

  • High spectral_centroid → bright/harsh, consider high shelf cut

  • Dominant band energy_pct → where the mix lives

Args: filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns band-by-band analysis + global spectral descriptors + mix suggestions.

Inputs: filename (required). Returns: result

mcp_opendaw_analyze_stereoA
Read-only

Stereo analysis of audio — width, L/R balance, mono compatibility, mid/side energy.

Analyzes the stereo field of a track:

  • stereo_width: Side/Mid RMS ratio (0 = mono, 0.5+ = wide, 1.0 = hard panned)

  • lr_balance: L/R energy difference (-1 = fully left, 0 = centered, +1 = fully right)

  • phase_correlation: -1 to +1 (+1 = mono safe, 0 = uncorrelated, -1 = out of phase)

  • mono_compatible: True if phase correlation > 0 (collapses to mono without cancellation)

  • phase_issues_pct: % of samples where L and R have opposite polarity

  • Per-region width: low (<250Hz), mid (250-4000Hz), high (4000+Hz) Helps identify if stereo width is well-distributed or concentrated in one region

Mix decision guidance:

  • stereo_width < 0.1 → narrow/mono mix, consider widening

  • stereo_width > 0.8 → very wide, check mono compatibility

  • phase_correlation < 0 → phase issues, will cancel in mono

  • lr_balance > 0.2 → right-heavy, consider rebalancing

  • lr_balance < -0.2 → left-heavy, consider rebalancing

  • Low-freq width > 0.3 → bass is wide (usually undesirable, keep bass mono)

Args: filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns stereo descriptors, per-region width, and mix suggestions.

Inputs: filename (required). Returns: result

mcp_opendaw_analyze_trackA
Read-only

Full audio analysis in one call — BPM + key + LUFS + duration + dynamic range.

Composite tool that runs detect_bpm + detect_key + measure_lufs in a single call. Eliminates 3 separate calls for track analysis. Essential for Suno remix pipeline: download_audio → analyze_track → set_bpm + matching progression → import → mix → render.

filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns: bpm, bpm_confidence, key, mode, key_confidence, lufs_integrated, true_peak_db, duration_seconds, sample_rate, channels, dynamic_range, alternatives (key alternatives), chroma.

Examples: result = analyze_track("suno_track.wav")

→ {bpm: 128.0, bpm_confidence: 0.85, key: "A", mode: "minor",

lufs_integrated: -14.2, duration_seconds: 30.0, ...}

Then use results for remix:

set_bpm(result.bpm) create_progression_from_key(result.key, result.mode, "synthwave")

Inputs: filename (required). Returns: result

mcp_opendaw_apply_articulationA

Apply articulation to existing notes — staccato, legato, tenuto, accent.

Reshapes note durations relative to their grid position to change phrasing character. Unlike velocity_curve (dynamics) or humanize (random), this applies deterministic duration ratios — the fundamental dimension of musical articulation.

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all regions on the track). articulation: Articulation type:

  • "staccato" — shorten notes to fraction of their grid slot (default 50%)

  • "legato" — extend notes to nearly the next note's start (default 95%)

  • "tenuto" — hold notes to full grid slot (100%, no gap, no overlap)

  • "accent" — boost velocity on notes that fall on beat boundaries (downbeats) amount: Articulation depth 0-1 (default 0.5):

  • staccato: fraction of slot (0.3 = very short, 0.7 = moderate)

  • legato: overlap fraction (0.9 = near-full, 0.5 = half-fill)

  • tenuto: (unused, always full)

  • accent: velocity boost amount (0.3 = subtle, 1.0 = strong accent)

Returns per-region note counts and total notes reshaped.

Examples: apply_articulation(articulation="staccato", amount=0.3) # crisp, detached apply_articulation(articulation="legato", amount=0.95) # smooth, connected apply_articulation(articulation="accent", amount=0.8) # strong downbeat accents

Inputs: amount, unit_index, track_index, articulation, +1 more. Returns: result

mcp_opendaw_apply_contourA

Apply a melodic contour shape to existing notes.

Redistributes note pitches to follow a specified contour profile while keeping timing and duration unchanged. Unlike transpose_notes (uniform shift), this reshapes the melody direction — ascending, descending, arch, inverted arch, wave, or custom.

The tool calculates a target pitch for each note based on its position in the sequence (0..1 normalized) mapped through the contour function, then snaps to the nearest scale degree if requested. The original pitch range center is preserved.

Contours:

  • "ascending": low to high across the phrase

  • "descending": high to low

  • "arch": rise then fall (peak at midpoint)

  • "inverted_arch": fall then rise (valley at midpoint)

  • "wave": sinusoidal up-down-up

  • "escalating": stepwise ascending with plateaus

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) contour: Contour shape name range_semitones: Pitch range span in semitones (1-48, default 12=octave) snap_to_scale: Scale for snapping results (""=chromatic, "major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues") root: Root note for scale snapping preserve_first: Keep first note pitch unchanged preserve_last: Keep last note pitch unchanged

Inputs: unit_index (required), track_index (required), root, contour, +5 more. Returns: result

mcp_opendaw_apply_full_mixA

Apply a complete mix in one call — genre-aware processing chains on every track + mastering.

Replaces 5-6 separate calls (add_drum_chain + add_bass_chain + add_instrument_chain × N + add_mastering_chain). Each track gets the right chain with genre-appropriate style automatically.

genre: Determines chain styles per track. Supported: dnb, liquid_dnb, house, trap, techno, dubstep, afrobeat, rock, jazz, pop, funk, reggae, synthwave, trance, disco unit_index: Target audio unit. num_tracks: Number of note tracks in the unit (default 4). Track 0 = drums, Track 1 = bass, Track 2+ = melodic/instrument. master_lufs: Mastering LUFS target (-14 Spotify, -10 loud, -16 Apple).

Chain assignment per track: Track 0 → add_drum_chain (genre-aware style) Track 1 → add_bass_chain (genre-aware style) Track 2+ → add_instrument_chain (genre-aware style) Output → add_mastering_chain

Returns summary of all chains applied.

Example:

Full mix for a 4-track house project

apply_full_mix("house", unit_index=0, num_tracks=4)

Loud techno master

apply_full_mix("techno", num_tracks=3, master_lufs=-10)

Inputs: genre, num_tracks, unit_index, master_lufs. Returns: result

mcp_opendaw_apply_genre_humanizationA

Apply genre-aware humanization to arrangement tracks — makes programmed MIDI feel alive.

After creating an arrangement, notes are perfectly quantized — robotic. This tool applies genre-appropriate humanization: jazz gets loose timing and wide velocity variation, electronic genres stay tight with minimal variation, funk gets behind-the-beat pocket feel.

Each genre has a different humanization recipe:

  • Jazz: high timing variation (0.20), high velocity variation (0.20), swing 0.66 (classic jazz swing feel). Drums get the most humanization.

  • Funk: behind-the-beat timing (positive bias), medium velocity variation, swing 0.0 (straight 16ths but with pocket feel).

  • Rock: medium timing (0.10), medium velocity (0.12), no swing. Drums get slight push, bass stays tight.

  • Reggae: laid-back timing (positive bias, behind beat), medium velocity, no swing. Bass stays tight (it's the lead), drums get loose.

  • Pop: very subtle (0.05 timing, 0.08 velocity), no swing. Pop should sound polished, not loose.

  • DnB/House/Techno/Trance/Synthwave/Dubstep/Trap: minimal humanization. Electronic genres should sound tight and consistent. Timing 0.03, velocity 0.05, no swing.

  • Afrobeat: medium timing (0.12), medium velocity (0.15), no swing. Polyrhythms need some human feel but stay grounded.

  • Disco: subtle timing (0.06), medium velocity (0.10), no swing. Disco should sound tight but not robotic — live drummer feel.

genre: One of: dnb, house, trap, techno, dubstep, afrobeat, rock, jazz, pop, funk, reggae, synthwave, trance, disco unit_index: AU index with the arrangement tracks. drum_track / bass_track / harmony_track / melody_track: Track indices. has_4th_track: True if arrangement has 4 tracks (False for 3-track genres).

Returns humanization parameters applied per track.

Example:

After: create_jazz_arrangement(...)

apply_genre_humanization("jazz", unit_index=0)

After: create_dnb_arrangement(...)

apply_genre_humanization("dnb", unit_index=0, has_4th_track=False)

Inputs: genre (required), bass_track, drum_track, unit_index, +3 more. Returns: result

mcp_opendaw_apply_genre_mixA

Apply genre-specific mixing effects to tracks after creating an arrangement.

Closes the loop: create arrangement → apply genre mix → ready to render. One call replaces 10-20 manual add_effect + set_effect_parameter calls.

Each genre has a different effect chain recipe:

  • Drums: compressor (genre-specific ratio/threshold) + EQ

  • Bass: EQ (HPF + low boost) + saturation (genre-specific)

  • Chords/Melody: reverb (genre-specific decay) + delay (if applicable)

  • Extra track: genre-specific treatment

  • Sidechain: drums→bass (if applicable to genre)

genre: One of: dnb, house, trap, techno, dubstep, afrobeat, rock, jazz, pop, funk, reggae unit_index: AU index with the arrangement tracks. num_tracks: Number of tracks to mix (3 or 4, must match arrangement). sidechain: Whether to add sidechain drums→bass (True for electronic genres, False for organic).

Returns effects added per track and parameter values.

Example:

After: create_dnb_arrangement(...)

apply_genre_mix("dnb", unit_index=0, num_tracks=3, sidechain=True)

After: create_jazz_arrangement(...)

apply_genre_mix("jazz", unit_index=0, num_tracks=4, sidechain=False)

Inputs: genre (required), sidechain, num_tracks, unit_index. Returns: result

mcp_opendaw_apply_mix_presetA

Apply a mix preset to all audio units in one call — volume, pan, mute, solo.

Replaces 10-30 set_track_volume/set_track_panning/set_track_mute calls. Presets can be genre-specific or custom JSON.

preset: JSON object mapping unit indices to settings: {"0": {"volume_db": -3, "panning": 0.0, "mute": false}, "1": {"volume_db": -6, "panning": -0.3, "solo": false}, ...}

Alternatively, use a named preset: "lofi", "house", "balanced", "wide"

Returns applied settings per unit.

Example: preset='{"0":{"volume_db":-3,"panning":0},"1":{"volume_db":-6,"panning":-0.3}}' preset='lofi' (built-in: kicks +0, bass -3, synths -6, wide pans)

Inputs: preset (required). Returns: result

mcp_opendaw_apply_rhythm_patternA

Apply a rhythmic pattern to existing notes — reposition onsets to match a target grid.

Takes a rhythm pattern (either a rhythm_string like "x.x.x..x" or an onset_grid like "1,0,1,0,1,0,0,1") and repositions existing notes onto the onset positions. This is the inverse of extract_rhythm — it lets you stamp a groove onto any note content.

How it works:

  1. Reads existing notes and their pitches/velocities/durations

  2. Computes the target onset positions from the pattern (cycling if pattern is shorter than the region)

  3. Distributes notes across onset positions:

    • If fewer onsets than notes: extra notes are placed at the nearest onset

    • If more onsets than notes: notes are assigned round-robin to onsets

  4. Optionally adjusts velocity (accent onsets) and duration (staccato/legato)

velocity_mode:

  • "preserve": keep original velocities

  • "accent": strong beats (0,4,8,12 in 16th) get +20% velocity, weak get -10%

  • "flat": all notes get 0.8 velocity

  • "pattern": use onset_velocities from extract_rhythm if provided in onset_grid

duration_mode:

  • "preserve": keep original durations

  • "staccato": each note lasts 50% of the grid step

  • "legato": each note lasts until the next onset

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = first region). rhythm_string: Compact pattern "x.x.x..x" (x=onset, .=rest). Used if onset_grid is empty. onset_grid: Comma-separated "1,0,1,0,1,0,0,1" or "1;0.5;0;0.8" (value=velocity). Takes priority over rhythm_string. grid: Grid resolution (16th/8th/32nd/quarter). velocity_mode: How to handle velocities (preserve/accent/flat/pattern). duration_mode: How to handle durations (preserve/staccato/legato).

Returns modification summary with repositioned note count.

Example:

Extract groove from drums, apply to bass

rhythm = extract_rhythm(0, 0, grid="16th")

... parse rhythm_string from result ...

apply_rhythm_pattern(0, 1, rhythm_string="x...x...x...x...", grid="16th")

Inputs: unit_index (required), track_index (required), grid, onset_grid, +4 more. Returns: result

mcp_opendaw_apply_sidechainA

Apply sidechain ducking via volume automation — the classic pumping/breathing effect.

Simulates sidechain compression by creating volume automation that ducks on every kick beat and recovers. This is the signature sound of house, techno, EDM, and modern pop. Works by creating automation events on the target track's volume parameter.

unit_index: AU index whose volume will be automated. track_index: Track index (-1 = all tracks on the AU). bars: Number of bars to fill with sidechain (1-16). start_beat: Starting beat position. depth: Ducking depth 0-1 (0.6 = volume drops to 40% on each kick, 0.8 = drops to 20%). attack: Attack time in beats (how fast volume drops, 0.01 = instant, 0.05 = smooth). release: Release time in beats (how fast volume recovers, 0.3 = classic, 0.5 = slow pump). kick_interval: Kick spacing in beats (1.0 = every beat, 2.0 = every 2 beats, 0.5 = 16th kicks).

Returns total automation events created and ducking pattern info.

Example: apply_sidechain(unit_index=0, bars=8, depth=0.7, release=0.25, kick_interval=1.0)

Inputs: unit_index (required), bars, depth, attack, +4 more. Returns: result

mcp_opendaw_apply_swingA

Apply swing feel to existing notes without changing velocity or duration.

Swing shifts every other grid position later, creating a triplet/shuffle feel. Unlike humanize_notes (which couples swing with random velocity/timing changes), this tool applies pure swing — deterministic, no randomness, reversible.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). swing_amount: Swing depth 0-1 (0 = straight, 0.5 = light swing, 1.0 = full triplet). 0.55-0.66 = classic hip-hop/lofi swing. grid: Grid to swing against — "16th" (default, shifts odd 16ths) or "8th" (shifts odd 8ths).

Returns per-track note counts shifted.

Example: apply_swing(unit_index=0, track_index=0, swing_amount=0.58, grid="16th")

Inputs: grid, unit_index, track_index, swing_amount. Returns: result

mcp_opendaw_apply_velocity_curveA

Apply a velocity envelope across notes — ramp, arc, trough, or custom power curve.

Maps each note's position within its region to a velocity value via a mathematical curve. Unlike humanize_notes (random variation), this applies a deterministic envelope shape — useful for build-ups, fade-ins, crescendo rolls, and expressive phrasing.

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all regions on the track). curve_type: Curve shape:

  • "ramp_up" — linear increase from start_velocity to end_velocity

  • "ramp_down" — linear decrease from start_velocity to end_velocity

  • "arc" — rises to end_velocity then falls back to start_velocity (peak in middle)

  • "trough" — falls to start_velocity then rises to end_velocity (dip in middle)

  • "power" — exponential curve controlled by 'power' param (>1 = fast rise, <1 = slow rise) start_velocity: Velocity at curve start 0-1 (default 0.3). end_velocity: Velocity at curve end 0-1 (default 1.0). power: Exponent for "power" curve type (default 1.0 = linear). 2.0 = sharp attack, 0.5 = slow swell.

Returns per-region note counts and total notes shaped.

Examples: apply_velocity_curve(curve_type="ramp_up", start_velocity=0.2, end_velocity=1.0) # build-up apply_velocity_curve(curve_type="arc", start_velocity=0.4, end_velocity=0.95) # expressive phrase apply_velocity_curve(curve_type="power", power=2.0, start_velocity=0.1, end_velocity=1.0) # sharp attack

Inputs: power, curve_type, unit_index, track_index, +3 more. Returns: result

mcp_opendaw_apply_velocity_lfoA

Apply periodic velocity modulation — velocity LFO along note positions.

Oscillates note velocity cyclically based on each note's position, creating pumping, breathing, or wave-like dynamic motion. Unlike apply_velocity_curve (monotonic ramps), this creates REPEATING velocity patterns synced to beat positions.

Args: unit_index: Audio unit index track_index: Note track index rate: LFO cycles per beat (0.25=every 4 beats, 1.0=per beat, 2.0=twice per beat, 0.5=every 2 beats) depth: Modulation depth 0-1 (0=no change, 0.3=subtle breathing, 1.0=full swing from 0 to max) shape: LFO waveform — "sine" (smooth), "triangle" (linear), "saw" (ramp up), "square" (on/off), "random" (per-beat random) phase: Starting phase 0-1 (0=begin at peak, 0.25=begin at zero rising, 0.5=begin at trough, 0.75=begin at zero falling) center: Center velocity around which modulation oscillates (0-1). The LFO modulates ±depth*center around this value. region_index: Specific region (-1 = all regions)

Returns: JSON with notes_processed, modulation stats (min/max/avg velocity before and after), regions_processed, rate, depth, shape.

Inputs: unit_index (required), track_index (required), rate, depth, +4 more. Returns: result

mcp_opendaw_apply_velocity_patternA

Apply a cyclic velocity pattern to existing notes in a region.

The producer's accent pattern tool. Instead of a linear ramp (crescendo), this applies a repeating velocity pattern across notes — the foundation of groove. Examples: strong-weak-medium-weak (backbeat emphasis), staggered accents for syncopation, or dynamic intensity layers.

unit_index: AU index. track_index: Track index. pattern: JSON array of velocity multipliers 0.0-1.0. Cycled across notes in order of position. Example: [1.0, 0.5, 0.7, 0.5] = strong-weak-medium-weak. region_index: Region index (-1 = first region). mode: "cycle" (repeat pattern from start, default) or "stretch" (distribute pattern evenly across all notes — good for 2-note patterns on 16 notes). base_velocity: Base velocity 0-1 that multipliers are applied to (default 0.8). Final velocity = base_velocity * pattern[i % len].

Returns notes modified, pattern applied, and velocity preview.

Examples: apply_velocity_pattern(unit_index=0, track_index=0, pattern="[1.0, 0.5, 0.7, 0.5]") -> 4-note accent cycle: strong-weak-medium-weak on every group of 4 notes apply_velocity_pattern(unit_index=0, track_index=0, pattern="[1.0, 0.3]", base_velocity=0.9) -> Alternating strong/weak at 0.9 and 0.27 apply_velocity_pattern(unit_index=1, track_index=0, pattern="[0.8, 0.4, 0.6, 0.4, 0.9, 0.4, 0.7, 0.4]", mode="stretch") -> 8-note pattern stretched across all notes in region

Inputs: pattern (required), unit_index (required), track_index (required), mode, +2 more. Returns: result

mcp_opendaw_augment_notesA

Augment or diminish note durations — the fourth classical transformation.

Multiplies note durations by a factor. Combined with transpose, reverse, and invert, this completes the set of four fundamental motivic transformations used by Bach, Beethoven, and every composition teacher since.

  • factor > 1.0: augmentation (longer notes, slower feel). 2.0 = double duration.

  • factor < 1.0: diminution (shorter notes, faster feel). 0.5 = half duration.

  • factor = 1.0: no change (useful for testing).

Think Beethoven 5th: the opening G-G-G-Eb motif returns augmented (twice as slow) in the recapitulation. Or Bach fugues where the subject appears in diminution (twice as fast) in the finale.

factor: Duration multiplier (0.25-4.0). 2.0 = augmentation, 0.5 = diminution. unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all regions on the track). mode: How to handle note positions — "scale" (default): multiply both duration AND position relative to region start. The entire phrase slows down or speeds up — notes stay in sequence. "stretch": multiply only duration, leave positions unchanged. Notes become longer/shorter but don't move — may overlap or leave gaps.

Returns count of notes augmented and notes skipped (duration too short/long).

Inputs: factor (required), unit_index (required), track_index (required), mode, +1 more. Returns: result

mcp_opendaw_auto_gainA

Auto-adjust output volume to hit a target LUFS.

Iterative loop: render → measure LUFS → adjust Maximizer threshold → re-render. Converges within ±1 LUFS of target.

target_lufs: Target loudness (Spotify -14, YouTube -14, Apple -16). filename: Output filename (without .wav). sample_rate: Export sample rate (default 48000). max_iterations: Max refinement loops (default 3).

Returns final LUFS, threshold applied, iterations, and WAV path.

Inputs: target_lufs (required), filename, sample_rate, max_iterations. Returns: result

mcp_opendaw_automation_sweepA

Create a smooth automation sweep (ramp) between two values over a beat range.

Generates multiple automation events with interpolated values, creating smooth parameter transitions (filter sweeps, volume fades, pitch drops, etc.) in one call. Automatically creates the automation track if it doesn't exist yet.

unit_index: AU index. parameter_name: Instrument parameter to automate (e.g. "cutoff", "volume", "resonance"). start_beat: Start position in beats. end_beat: End position in beats. start_value: Starting normalized value (0.0-1.0). end_value: Ending normalized value (0.0-1.0). steps: Number of interpolation points (default 16, more = smoother). curve: "linear" (even spacing), "exp" (exponential, good for filter sweeps), "log" (logarithmic).

Returns the number of events created and a preview of the first few points.

Example: Filter sweep from closed (0.1) to open (0.9) over 16 beats: automation_sweep(unit_index=0, parameter_name="cutoff", start_beat=0, end_beat=16, start_value=0.1, end_value=0.9, steps=32, curve="exp")

Inputs: end_beat (required), end_value (required), start_beat (required), unit_index (required), +4 more. Returns: result

mcp_opendaw_balance_track_velocitiesA

Balance velocities across multiple tracks — MIDI mix leveling.

Sets relative velocity levels across multiple note tracks so they sit correctly in the mix. Unlike scale_velocity (one track at a time), this operates on multiple tracks simultaneously and establishes the relative balance between them.

Presets:

  • "mix_balanced" — all tracks equal (~0.75). Neutral starting point.

  • "drums_forward" — drums loudest (0.95), bass (0.80), harmony (0.65), lead (0.70). Hip-hop, rock, electronic.

  • "vocal_forward" — vocal/lead loudest (0.95), pads (0.60), bass (0.75), drums (0.80). Pop, ballad, singer-songwriter.

  • "pads_quiet" — pads very quiet (0.50), arp (0.65), bass (0.80), drums (0.90), lead (0.85). Ambient, cinematic.

  • "bass_heavy" — bass loudest (0.95), drums (0.85), lead (0.70), harmony (0.55). Reggae, dub, trap.

  • "custom" — use target_velocities parameter (comma-separated 0-1 values, one per track in track_indices order).

The tool reads current average velocities, computes scale factors to reach targets, and applies them. Original relative dynamics within each track are preserved (multiply mode).

track_indices: Comma-separated track indices (e.g. "0,1,2,3"). preset: One of the presets above, or "custom". target_velocities: For custom mode — comma-separated target avg velocities (e.g. "0.9,0.7,0.6,0.8"). Must match track_indices count. region_index: Region (-1 = first, -2 = all regions).

Returns per-track velocity stats before/after.

Example:

Balance 4 tracks: drums, bass, pads, lead

balance_track_velocities(0, "0,1,2,3", preset="drums_forward")

Custom: drums=0.9, bass=0.7, pads=0.5, lead=0.8

balance_track_velocities(0, "0,1,2,3", preset="custom", target_velocities="0.9,0.7,0.5,0.8")

Inputs: unit_index (required), track_indices (required), preset, region_index, +1 more. Returns: result

mcp_opendaw_batch_diagnosticA

Run full diagnostic on multiple stems in one call — problems + phase + profile comparison.

Phantom's batch_diagnostic equivalent. For each stem runs:

  1. detect_problems (clipping, DC offset, mud, harshness, sibilance, resonance)

  2. analyze_phase (polarity, correlation, mono compat) — stereo files only

  3. compare_to_profile (if genre specified)

Produces a prioritized triage report:

  • dealbreaker: clipping, phase inversion, DC offset

  • significant: mud, harshness, resonance

  • moderate: sibilance risk, width issues

  • minor: slight deviations from profile

filenames: JSON array or comma-separated list of WAV filenames. genre: Optional genre profile for comparison (pop, rock, lo-fi, etc.).

Returns per-stem results + global summary + prioritized fix list.

Example: batch_diagnostic('["vocals.wav","bass.wav","drums.wav","mix.wav"]', genre="rock")

→ {triage: [{stem: "vocals", severity: "significant", problems: [...]}]}

Inputs: filenames (required), genre. Returns: result

mcp_opendaw_capture_realtimeA

Capture realtime audio output from the DAW engine.

Records the live audio output for a specified duration. The engine must be running (call start_engine first). Useful for capturing live playback with effects, automation, and real-time processing.

duration_seconds: How long to record (float, e.g. 10.0). filename: Output WAV filename (without extension).

Returns file path and size, or error if engine not running.

Inputs: filename (required), duration_seconds (required). Returns: result

mcp_opendaw_change_base_signatureA

Change the base time signature of the project.

This changes the initial signature (default 4/4). All existing signature change events are recalculated to preserve their approximate absolute positions.

nominator: Number of beats per bar (e.g. 4 for 4/4, 3 for 3/4, 6 for 6/8). denominator: Beat unit (1=whole, 2=half, 4=quarter, 8=eighth, 16=sixteenth).

Returns success or error.

Inputs: nominator (required), denominator (required). Returns: result

mcp_opendaw_classify_drum_patternA

Classify a drum pattern from MIDI notes in a region.

Analyzes drum note positions, pitches (GM drum map: 36=kick, 38=snare, 42=closed hat, 46=open hat, 50=high tom, 45=low tom, 49=crash, 51=ride), and velocities to classify the pattern as one of: four-on-the-floor, breakbeat, boom-bap, trap, shuffle, half-time, military/march, amen, unknown.

Essential for: understanding existing drum patterns, matching genre expectations, verifying generated patterns, and suggesting variations.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks). region_index: Region index (-1 = all regions on track).

Returns pattern classification with confidence, features, and per-bar breakdown.

Inputs: unit_index, track_index, region_index. Returns: result

mcp_opendaw_clear_region_notesA
Destructive

Clear all notes from a region while keeping the region on the timeline.

Removes every note event from the specified region(s) but preserves the region itself — its position, duration, and track placement stay intact. This is the "erase and rewrite" operation: the producer wants to clear a region to start fresh, without deleting and recreating the region container.

Different from delete_note_region (which removes the entire region from the timeline) and delete_note (which removes one note at a time).

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all note regions on the track).

Returns notes cleared and remaining region info.

Examples: clear_region_notes(unit_index=0, track_index=0, region_index=0) -> Erase all notes in region 0, region stays on timeline clear_region_notes(unit_index=0, track_index=0, region_index=-1) -> Erase all notes in ALL regions on track 0

Inputs: unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_clone_clipA

Clone a clip (note or value) on the same track. Optionally consolidate (make event collection unique).

unit_index: AU index. track_index: Track index within the AU. clip_index: Clip index to clone. consolidate: If true, the clone gets its own independent event collection (not shared).

Returns success, or error.

Inputs: clip_index (required), unit_index (required), track_index (required), consolidate. Returns: result

mcp_opendaw_clone_effect_chainA

Copy all effects from one audio unit to another, including parameter values.

Useful for applying the same vocal chain (EQ → compressor → reverb) to doubled vocal tracks.

src_unit: Source audio unit index. dst_unit: Destination audio unit index (effects appended to existing chain).

Returns list of cloned effects with their new indices.

Inputs: dst_unit (required), src_unit (required). Returns: result

mcp_opendaw_clone_trackA

Clone a track — full duplication of notes, regions, and structure.

Creates a new track within the same audio unit (or a new audio unit) with all notes from the source track copied over. Optionally transposed, velocity-scaled, and time-shifted.

Unlike copy_notes_to_track (which copies notes between existing tracks), clone_track creates the destination track from scratch with the correct track type (note/audio), then populates it with a region and all notes from the source.

Essential for:

  • Doubling: same notes on two instruments for thicker sound

  • Octave layering: transpose +12 for octave above

  • Parallel harmony: transpose +7 for fifths, +3 for thirds

  • Call-and-response: time_offset to shift the copy later

  • Counterpoint layer: same rhythm, different transposition

Args: unit_index: Source audio unit index track_index: Source track index within the unit name: Optional name for the cloned track (default: same as source) transpose: Semitone transposition applied to cloned notes (-24 to +24, default 0 = same pitch) velocity_scale: Multiply note velocities by this factor (0.1-2.0, default 1.0 = same velocity) time_offset_beats: Shift all notes by this many beats (-16 to +16, default 0.0 = same position) new_unit: If true, create a new audio unit for the clone (requires same instrument type). If false (default), adds a new track to the source audio unit.

Inputs: unit_index (required), track_index (required), name, new_unit, +3 more. Returns: result

mcp_opendaw_compact_tracksA

Remove empty tracks from an audio unit (or all AUs).

Calls ProjectApi.compactTracks() — removes tracks with no regions. Useful cleanup after deleting regions or editing.

unit_index: Audio unit index (-1 = all AUs).

Inputs: unit_index (required). Returns: result

mcp_opendaw_compare_to_profileA

Compare your mix against a professional genre reference profile.

Tells you exactly where your mix deviates from genre standards:

  • LUFS: too loud/quiet for this genre?

  • Spectrum: which frequency bands are off?

  • Stereo width: appropriate for genre?

  • Dynamics: too compressed or too wild?

  • Spectral centroid: too dark or too bright?

Gives per-dimension deviation + specific recommendations.

filename: WAV file in exports dir, or absolute path. genre: One of: pop, rock, hip_hop, electronic, edm, metal, lo-fi, ambient, cinematic

Returns deviation analysis with severity-ranked suggestions.

Example: compare_to_profile("my_mix.wav", "lo-fi")

→ {lufs_deviation: +3.4, spectral_deviations: [...], suggestions: [...]}

Inputs: genre (required), filename (required). Returns: result

mcp_opendaw_compare_to_referenceA

A/B compare your mix against a reference track across all dimensions.

Shows exactly where your mix differs from a professional reference:

  • LUFS difference (loudness gap)

  • Spectral curve deviation per band

  • Stereo width comparison

  • Dynamic range comparison

  • Spectral centroid (brightness) comparison

This is how you learn how pros mix your genre. Drop in a reference track you admire and see exactly what's different.

filename: Your mix WAV (exports dir or absolute path). reference: Reference track WAV (exports dir or absolute path).

Returns per-dimension comparison + actionable deltas.

Example: compare_to_reference("my_mix.wav", "pro_reference.wav")

→ {lufs_delta: +2.3, spectral_deltas: [...], suggestions: [...]}

Inputs: filename (required), reference (required). Returns: result

mcp_opendaw_connect_modular_modulesA

Connect two modules in a Modular device (create a patch cable).

au_index: Audio unit index. effect_index: Effect index within the AU. source_module_index: Index of the source module. source_output_name: Name of the output connector (e.g. "Output", "Result"). target_module_index: Index of the target module. target_input_name: Name of the input connector (e.g. "Input", "X", "Y").

Returns success or error.

Inputs: au_index (required), effect_index (required), target_input_name (required), source_output_name (required), +2 more. Returns: result

mcp_opendaw_connect_sidechainA

Connect one audio unit's output as sidechain source to a Compressor/Gate on another unit.

source_unit_index: Audio unit whose output triggers the sidechain (e.g. drums). target_unit_index: Audio unit with the Compressor/Gate effect (e.g. bass). effect_index: Effect position on the target unit (must have a sideChain field).

The target effect must be Compressor, Gate, Vocoder, or any effect with Pointers.SideChain.

Inputs: effect_index (required), source_unit_index (required), target_unit_index (required). Returns: result

mcp_opendaw_consolidate_clipA

Consolidate a clip's event collection — make it unique (not shared/mirrored).

If a clip shares its event collection with other clips (mirrored), this creates a new independent copy so edits don't affect other clips.

unit_index: AU index. track_index: Track index within the AU. clip_index: Clip index to consolidate.

Returns success, or error.

Inputs: clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_consolidate_noteA

Consolidate a repeated note (playCount > 1) into individual separate notes.

If a note has playCount > 1, it represents N repeats controlled by playCurve. This expands it into N independent notes, each with playCount=1, positioned according to the curve. The original note is deleted.

unit_index: AU index. track_index: Note track index. region_index: Note region index. note_index: Note index within the region.

Returns the number of notes created, or error if note has playCount=1.

Inputs: note_index (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_consolidate_regionA

Consolidate a region's event collection — make it unique (not shared/mirrored).

If a region shares its event collection with other regions (mirrored), this creates a new independent copy so edits don't affect other regions.

unit_index: AU index. track_index: Track index within the AU. region_index: Region index to consolidate.

Returns success or error.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_constrain_note_rangeA

Constrain notes to a pitch range — clamp or octave-wrap out-of-range notes.

After AI generation, transcription, or aggressive transposition, notes can land outside the playable range of an instrument. This tool brings them back inside.

Two modes:

  • "clamp" — notes below min_pitch are set to min_pitch, notes above max_pitch are set to max_pitch. Preserves the note but loses pitch information. Use when exact range matters (e.g. MIDI 0-127 safety).

  • "octave_wrap" — notes are shifted by octaves (±12 semitones) until they fall within [min_pitch, max_pitch]. Preserves pitch class and musical relationship. Use for instrument range constraints (violin, guitar, vocal, flute). If a note can't fit even after wrapping (range < 12 semitones), it's clamped.

Common instrument ranges (MIDI note numbers):

  • Guitar (standard tuning): E2(40) to E6(88)

  • Bass guitar: E1(28) to G4(67)

  • Violin: G3(55) to A7(105)

  • Cello: C2(36) to C6(84)

  • Flute: C4(60) to D7(98)

  • Vocal soprano: C4(60) to A5(81)

  • Vocal bass: E2(40) to E4(64)

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). min_pitch: Minimum allowed MIDI pitch (0-127, default 0 = no lower bound). max_pitch: Maximum allowed MIDI pitch (0-127, default 127 = no upper bound). mode: "clamp" (hard limit) or "octave_wrap" (shift by octaves to fit).

Returns per-track notes adjusted, clamped count, wrapped count.

Example:

Constrain to guitar range with octave wrapping

constrain_note_range(unit_index=0, track_index=2, min_pitch=40, max_pitch=88, mode="octave_wrap")

Safety clamp to MIDI range

constrain_note_range(mode="clamp", min_pitch=0, max_pitch=127)

Inputs: mode, max_pitch, min_pitch, unit_index, +2 more. Returns: result

mcp_opendaw_convert_audioA

Convert an exported WAV file to MP3 or FLAC using system ffmpeg.

filename: Source WAV filename (without .wav extension, in the export dir). format: 'mp3' or 'flac' (default 'mp3'). bitrate: MP3 bitrate for CBR mode (default '320k'). Ignored for FLAC. quality: MP3 VBR quality 0-9 (0=best, 9=worst). Use -1 for CBR (default).

Requires system ffmpeg (not browser WASM). Falls back gracefully if missing. Returns path to the converted file and size info.

Inputs: filename (required), format, bitrate, quality. Returns: result

mcp_opendaw_copy_notes_to_trackA

Copy notes from one track/region to another track — MIDI layering and doubling.

Copies all notes from a source region to a destination track's first region. Optional transpose (semitones), time offset (beats), and velocity scaling.

Use cases:

  • Layer drums: copy drum track to second track with different instrument

  • Create harmony: copy melody +12 (octave) or +7 (fifth)

  • Call-and-response: copy with time_offset to create echo

  • Doubles: copy to same track position with slight transpose for thickening

source_unit_index: Source AU index. source_track_index: Source note track index. dest_track_index: Destination note track index. source_region_index: Source region (-1 = first region). dest_unit_index: Destination AU index (-1 = same as source). transpose: Semitone offset (-127 to 127, 0 = same pitch). time_offset: Beat offset for copied notes (0 = same position, 2 = two beats later). velocity_scale: Multiply velocity of copied notes (1.0 = same, 0.7 = quieter layer).

Returns count of notes copied.

Example:

Layer drums — copy track 0 to track 2

copy_notes_to_track(0, 0, 2)

Create octave harmony — copy melody +12

copy_notes_to_track(0, 3, 4, transpose=12, velocity_scale=0.7)

Echo effect — copy 2 beats later at half velocity

copy_notes_to_track(0, 0, 1, time_offset=2, velocity_scale=0.5)

Inputs: dest_track_index (required), source_unit_index (required), source_track_index (required), transpose, +4 more. Returns: result

mcp_opendaw_copy_playfield_sampleA

Copy a Playfield (drum machine) sample to a new index slot.

Duplicates the sample with all its parameters (mute, solo, pitch, attack, release, sampleStart, sampleEnd, gate, exclude, polyphone) to a new slot.

unit_index: AU index containing the Playfield instrument. sample_index: Source sample slot index. target_index: Destination slot index.

Returns success or error.

Inputs: unit_index (required), sample_index (required), target_index (required). Returns: result

mcp_opendaw_copy_region_fadesA

Copy fade in/out settings from one audio region to another.

Copies fadeIn, fadeOut, fadeInSlope, fadeOutSlope from the source region's Fading object to the destination region's Fading object.

src_unit/src_track/src_region: Source region coordinates. dst_unit/dst_track/dst_region: Destination region coordinates.

Returns the copied fade values.

Inputs: dst_unit (required), src_unit (required), dst_track (required), src_track (required), +2 more. Returns: result

mcp_opendaw_copy_region_to_trackA

Copy a region to a different track (or same track at new position).

Works with note, audio, and automation regions. The copy includes all content — notes, audio content, or automation events.

src_unit/src_track/src_region: Source region coordinates. dst_unit/dst_track: Destination track coordinates. position: New position in PPQN (omit to use source position).

Returns new region position and duration.

Inputs: dst_unit (required), src_unit (required), dst_track (required), src_track (required), +2 more. Returns: result

mcp_opendaw_create_acid_arrangementA

Create an acid house arrangement — TB-303 squelch bassline.

Acid house is a subgenre of house music born in Chicago (1985-87) defined by the Roland TB-303 bass synthesizer with its distinctive squelchy, resonant filter sweeps. Key characteristics:

  • TB-303 bassline: monophonic, sequenced 16th notes with filter cutoff sweeps (open↔closed), accent and glide (slide) between notes. The signature "squelch" sound.

  • 909 drum machine: 4-on-floor kick, open hat on offbeats, clap on 2&4, ride cymbal

  • 125 BPM, 4/4 time

  • Minimal, hypnotic, repetitive structure with gradual evolution

  • Often in minor key with chromatic bassline movement

Creates 3 tracks:

  1. Drums (track_index): 909-style — kick on every beat, clap on 2&4, open hat on offbeats, closed hat on 16ths, ride on quarter notes

  2. Bass (track_index+1): TB-303-style 16th note pattern with chromatic movement, octave jumps, and accent patterns. Notes have varied velocity to simulate filter envelope.

  3. Lead (track_index+2): Sparse, hypnotic stab on beat 1 of every 4 bars, minor key pad-like sustained note

Default key: A minor (classic acid key).

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_additive_rhythmA

Create an additive rhythm — unequal groupings within a bar.

The defining technique of Messiaen, Stravinsky, Bartok, Ligeti, and modern math rock / prog metal. Instead of dividing a bar into equal parts (eighth-eighth-eighth-eighth), the bar is divided into unequal groups (3+2+2 = 7 eighths, 2+3+2 = shifting accent, 5+3 = 8 eighths).

The resulting accent pattern creates a sense of irregular meter within a nominal time signature — the pulse "turns" inside the bar.

Examples: create_additive_rhythm("3+2+2", "eighth") -> 7 eighth notes grouped as 3-2-2, accents on notes 1, 4, 6 (Bartok "Bulgarian Rhythm", Math rock 7/8 feel) create_additive_rhythm("2+3+2", "eighth", repeats=4) -> shifting accent pattern, 4 bars create_additive_rhythm("5+3", "eighth", pitch="scale_up") -> 8 eighths in 5+3 grouping, ascending scale create_additive_rhythm("3+2+2", "sixteenth", repeats=2, decay=0.1) -> 7 sixteenths per bar, velocity decay within groups

Args: grouping: Plus-separated group sizes (e.g. "3+2+2", "5+3", "2+1+2"). Each number = count of notes in that group. Sum = total notes per bar. 2-6 groups, 2-16 notes total. unit: Note value — "eighth", "quarter", "sixteenth", "thirty_second". repeats: Number of bars (1-16). pitch: Pitch mode — "root" (same note), "scale_up" (ascending scale), "scale_down" (descending), "alternating" (up/down per note), "octave_bounce" (root->octave->root). scale: Scale for pitch modes (minor, major, dorian, phrygian, etc.). root: Root note (C, C#, D, ...). octave: Base octave (1-6). accent_mode: Where to place accents — "group_start" (first note of each group gets accent), "group_end" (last note), "every_note" (all same velocity). accent_velocity: Velocity for accented notes (0-1). normal_velocity: Velocity for non-accented notes (0-1). decay: Velocity decay within each group (0-0.3). Each subsequent note in a group gets slightly softer. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, grouping structure, accent pattern, and bar layout.

Inputs: grouping (required), root, unit, decay, +10 more. Returns: result

mcp_opendaw_create_afrobeat_arrangementA

Create a full afrobeat arrangement — polyrhythmic drums + bass + horns + guitar across 4 tracks.

Fela Kuti-style afrobeat with all elements locked in polyrhythmic interlock:

  • Track 0: Drums — layered polyrhythm: kick pattern, shaker pattern, clave-like accents. The foundation is 12/8 feel in 4/4 time — triplets over straight beats, the African polyrhythmic heartbeat.

  • Track 1: Bass — repetitive ostinato bassline, rooted in the key, driving and hypnotic. Afrobeat bass doesn't rest — it's the engine alongside the drums, locking with the kick.

  • Track 2: Horns — brass section stabs and sustained chords. Call-and-response between horn hits and space. Minor key, soulful.

  • Track 3: Guitar — rhythmic chord stabs on the off-beats, the "chanka" pattern that defines the groove. Two-note voicings, percussive and tight.

At 120 BPM (default), this creates the classic afrobeat feel — not too fast, not too slow, with room for polyrhythmic layering. The 4-track arrangement (first non-electronic genre) is the key difference: horns and guitar add organic texture that electronic arrangements don't have.

bpm: Tempo (100-130, default 120 = classic afrobeat). bars: Arrangement length (8-32, default 8). Afrobeat needs long forms. root: Root note (F is the classic afrobeat key — Fela's preference). octave: MIDI octave for bass (2 = C2=36, audible low end). unit_index: AU index with note tracks. drum_track / bass_track / horn_track / guitar_track: Track indices.

Returns notes created per track and total.

Example: create_afrobeat_arrangement(bpm=120, root="F", bars=8) create_afrobeat_arrangement(bpm=110, root="Ab", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_ambient_arrangementA

Create an ambient arrangement — 70 BPM atmospheric soundscape.

Ambient music (Brian Eno, Stars of the Lid, Aphex Twin Selected Ambient Works) focuses on atmosphere, texture, and sustained sound over rhythm and melody. Key characteristics:

  • 60-80 BPM (or no clear pulse), 4/4 time

  • Long sustained pad notes with slow evolution

  • Sparse, minimal percussion (or none)

  • Drifting melodic fragments, no clear phrase structure

  • Reverb-drenched, wide stereo, cinematic

  • Modal harmony (sustained chords, slow changes)

Creates 4 tracks:

  1. Pad (track_index): Long sustained chord notes (8 bars each), mode-based (major/minor/dorian/lydian), very slow harmonic rhythm. Root, fifth, octave — open voicings.

  2. Melody (track_index+1): Sparse, drifting melodic fragments — long notes (2-4 bars), wide intervals, lots of space. Starts after 8 bars.

  3. Drums (track_index+2): Extremely sparse — single kick on bar 1 of every 8 bars, occasional shaker. Almost subliminal pulse.

  4. Bass (track_index+3): Sustained sub-bass drone, root note only, changes with pad harmony. Very low octave.

Default key: C major (most common ambient key). Default 32 bars for proper ambient evolution length.

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_appoggiaturaA

Create an appoggiatura — leaning grace note that resolves to the main note.

The appoggiatura is the fourth and final essential baroque ornament (trill, mordent, turn, appoggiatura). Unlike a mordent (quick flick), the appoggiatura is expressive: it plays a neighbor note FIRST (usually longer), then resolves into the main note. The approach note creates harmonic tension that the main note releases. Think Bach cello suites, Mozart operas, Chopin nocturnes.

An appoggiatura above approaches from higher (e.g. D → C). An appoggiatura below approaches from lower (e.g. B → C). The approach note typically takes 2/3 of the total duration, leaving 1/3 for the resolution — but this is adjustable.

main_pitch: The resolution note (default 60 = C4). This is where tension releases. approach_pitch: The grace note played first (default 62 = D4). Can be above or below main. duration_beats: Total length of both notes combined (0.5-8, default 1.0 = quarter). appoggiatura_ratio: Fraction of duration for the approach note (0.5-0.9, default 0.67 = 2/3). Higher = more tension (longer grace, shorter resolution). 0.5 = equal split. velocity: Base velocity 0-1 (default 0.85). Approach note is slightly accented. unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the appoggiatura begins.

Returns notes created, pitches used.

Inputs: velocity, main_pitch, start_beat, unit_index, +4 more. Returns: result

mcp_opendaw_create_arabic_percussionA

Create an Arabic/Middle Eastern percussion ensemble — darbuka, daf, and zills.

Middle Eastern percussion is built on the interplay between the darbuka (tabla, goblet drum) playing the core rhythm with dum (low) and tek/ka (high) strokes, the daf (frame drum) providing sustained resonance and rolls, and zills (sagat, finger cymbals) adding shimmering accents. The rhythms are cyclical with distinctive asymmetry — maqsum has a characteristic gap between dum strokes that creates tension.

The stroke vocabulary: DUM — Low, resonant center stroke on darbuka (bass register) TEK — High, ringing rim stroke (right hand, accented) KA — High, snapping rim stroke (left hand, lighter) SLAP — Sharp, accented stroke (mid register)

rhythms: "maqsum" — The most common Arabic rhythm: D-T- -T-D- -T-. 4/4, 8 beats. Dum on 1 and 4.5, tek on 2, 3, 5.5, 7. The "mother of all Arabic rhythms". Used in almost all Arabic pop, classical, and folk music. "baladi" — Urban Egyptian version of maqsum: D-D- -T-D- -T-. Dum on 1 and 1.5 (double dum), tek on 3, 5.5, 7. Heavier, more driving. The "baladi groove" of Cairo. "saidi" — Upper Egyptian rhythm: D-T- -T-D-D- -T-. 4/4. Dum on 1, 4.5, and 5 (double dum). Tek on 2, 3, 6.5, 7. From the Said region. Used in Saidi dance and music. "ayoub" — 2/4 cyclical rhythm: D- -T- -D-D-. 4 beats. Dum on 1, 3, 3.5. Tek on 2. Used in Sufi trance, zar ceremonies, and religious processions. "malfouf" — 2/4 fast rhythm: D- -T- -T-. 3 beats. Dum on 1, tek on 2, 2.5. Used in fast entrances, processions, and folk dances. "Running" feel. "chiftetelli" — 8/4 slow rhythm: D- -T- -T- -D- -T-. 8 beats. Dum on 1 and 5.5, tek on 2.5, 3.5, 7.5. Used in Turkish and Greek music, belly dance slow sections.

Args: bars: Pattern length in bars (2-16, even). rhythm: Rhythm name (maqsum, baladi, saidi, ayoub, malfouf, chiftetelli). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. darbuka_pitch: Darbuka MIDI pitch (36 = C1). daf_pitch: Daf (frame drum) MIDI pitch (42 = F#1). zills_pitch: Zills (finger cymbals) MIDI pitch (50 = D2).

Returns notes created, instrument breakdown, stroke types, and rhythm info.

Inputs: bars, rhythm, velocity, daf_pitch, +5 more. Returns: result

mcp_opendaw_create_arpeggiated_progressionA

Create an arpeggiated chord progression — synthwave/trance arp engine.

Takes a chord progression string (same format as create_chord_pads: "Am-F-C-G") and generates arpeggiated notes cycling through chord tones. This is the synthwave arpeggiated bass, the trance supersaw arp, the house plucked chord stab — all from a simple progression string.

Unlike create_arpeggio (which takes a single chord), this cycles through a full progression, changing chord tones every bars_per_chord bars.

progression: Hyphen-separated chords (same as create_chord_pads). "Am-F-C-G" = i-VI-III-VII in A minor. "C-G-Am-F" = I-V-vi-IV in C major (pop).

pattern: Arpeggio pattern: "up" — root, third, fifth, root(oct) — classic synthwave "down" — oct root, fifth, third, root — descending "updown" — root, third, fifth, oct, fifth, third — full cycle "random" — random chord tones — dreamy, unpredictable "bass" — root only, 8th notes — driving bass arp (synthwave bass)

bars_per_chord: Bars per chord (default 4). octave: MIDI octave (3 = bass arp, 4 = mid arp, 5 = lead arp). velocity: Note velocity (0-1). step_duration: Note length in beats (0.25 = 16th, 0.5 = 8th, 0.125 = 32nd). track_index: Track for arp notes (typically melody track = 3).

Returns chords arpeggiated, total notes, pattern used.

Example:

Synthwave bass arp (16th notes, octave 2)

create_arpeggiated_progression("Am-F-C-G", pattern="bass", octave=2, step_duration=0.25, track_index=1)

Trance supersaw arp (16th up, octave 4)

create_arpeggiated_progression("Fm-Db-Ab-Eb", pattern="up", octave=4, step_duration=0.25, track_index=3)

Pop arp (8th updown, octave 5)

create_arpeggiated_progression("C-G-Am-F", pattern="updown", octave=5, step_duration=0.5, track_index=3)

Inputs: octave, pattern, velocity, start_beat, +5 more. Returns: result

mcp_opendaw_create_arpeggioA

Create an arpeggio from a chord name — one call instead of 8-32 create_note calls.

chord: Chord name in format RootType, e.g. "Cmin7", "F#maj", "Abmin7", "Ddim". Root: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (or flats Db, Eb, Gb, Ab, Bb). Type: maj, min, dom7, maj7, min7, sus2, sus4, add9, dim, aug. pattern: Arpeggio direction/pattern:

  • "up" — bottom to top, repeat

  • "down" — top to bottom, repeat

  • "updown" — up then down (includes top and bottom twice)

  • "downup" — down then up

  • "random" — random chord tones

  • "chord" — play full chord on each step (block chords) rate: Note rate: "32" (32nd), "16" (16th), "8" (8th), "4" (quarter), "16t" (16th triplet). octave: MIDI octave for the chord root (4 = C4=60). steps: Number of arpeggio steps (default 16 = one bar of 16th notes). unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the arpeggio starts (0 = bar 1). velocity: Note velocity 0-1 (default 0.65 for arpeggios).

Returns the total notes created and pitches used.

Inputs: chord (required), rate, steps, octave, +5 more. Returns: result

mcp_opendaw_create_arrangement_variationA

Create a musically varied section — not a repeat, a real variation.

Unlike create_genre_sections (which repeats the same loop at different velocities), this tool applies actual musical transformations to each track independently:

  • Drums: density control (0.3 = sparse, 1.0 = full, 1.5 = busy with ghosts)

  • Bass: octave shift (bass_octave_shift = +1/-1/-2)

  • Melody: inversion, transposition, retrograde, or fragment

  • Track inclusion: skip drums/bass/harmony/melody independently

This lets you build a song where each section has real musical variation, not just energy changes. The drop has full drums, the breakdown has inverted melody + no bass, the bridge has sparse drums + octave-up bass.

genre: Any of the 14 arrangement genres (dnb/house/trap/techno/dubstep/ synthwave/trance/disco/afrobeat/rock/jazz/pop/funk/reggae). section_name: Label for this section (e.g. "verse2", "bridge", "drop2"). bpm: Override tempo (None = genre default). root: Override key (None = genre default). bars: Section length in bars (4-32, default 8). start_beat: Where this section starts in the timeline. velocity: Base velocity 0-1. drum_density: 0.3 = sparse (half notes removed), 1.0 = normal, 1.5 = busy (extra ghost notes between hits). bass_octave_shift: 0 = normal, +1 = octave up, -1 = octave down, -2 = sub. melody_transform: "none", "invert", "transpose:5", "transpose:-7", "reverse", "fragment", "octave_up", "octave_down". include_drums/include_bass/include_harmony/include_melody: Set False to skip that track (e.g. breakdown = no drums, no bass).

Returns notes per track and transformations applied.

Example:

Breakdown section: sparse drums, no bass, inverted melody

create_arrangement_variation("dnb", section_name="breakdown", drum_density=0.3, include_bass=False, melody_transform="invert", velocity=0.6)

Bridge: octave-up bass, retrograde melody

create_arrangement_variation("house", section_name="bridge", bass_octave_shift=1, melody_transform="reverse", start_beat=64, bars=4)

Inputs: genre (required), bpm, bars, root, +15 more. Returns: result

mcp_opendaw_create_audio_busB

Create a new audio bus (aux bus) with its own audio unit and track.

Follows the upstream AudioBusFactory.createAudioBus pattern: creates AudioUnitBox (Aux) + AudioBusBox + TrackBox, wires them together. Uses separate editing.modify() blocks — pointer refer() inside box constructor fails due to deferred pointer update resolution.

name: Bus label.

Returns the new bus index.

Inputs: name (required). Returns: result

mcp_opendaw_create_audio_clipA

Create an audio clip in the session view (clip launcher).

Audio clips are the session-view counterpart to audio regions. They appear in the clip launcher and can be triggered independently.

sample_id: The ID returned by mcp_opendaw_load_audio. unit_index: Audio unit index (default 0). clip_index: Slot index in the clip launcher (0, 1, 2, ...). track_index: Track index within the audio unit (default 0). bpm: Source BPM of the sample (for warp marker calculation).

Returns clip UUID and index.

Inputs: bpm (required), sample_id (required), clip_index (required), unit_index (required), +1 more. Returns: result

mcp_opendaw_create_audio_trackB

Create a new audio track on the primary audio unit.

Inputs: no named parameters. Returns: result

mcp_opendaw_create_automation_eventA

Create a single automation event at a specific position on a value track.

Adds a point to the automation curve with the given interpolation type. If an event already exists at the same position, its value is updated.

unit_index: AU index. track_index: Value (automation) track index. position_beats: Position in beats (float). value: Normalized value 0.0-1.0. interpolation: "none" (step), "linear" (ramp), or "curve" (custom slope). curve_slope: Slope for curve interpolation (0.0-1.0, 0.5 = linear). Only used if interpolation="curve".

Returns the created/updated event info, or error.

Inputs: value (required), unit_index (required), track_index (required), position_beats (required), +2 more. Returns: result

mcp_opendaw_create_balkan_meterA

Create a Balkan additive meter pattern — asymmetric time signatures with unequal beat groupings.

Balkan music uses "additive" meters: time signatures like 7/8, 9/8, 11/8, 13/8 where the measure is divided into unequal groups of 8th notes. Unlike Western "odd time" (which counts uniformly), Balkan music groups beats into patterns like 2+2+3 (7/8), 2+2+2+3 (9/8), 2+2+3+2+2 (11/8). Each group has a distinct accent pattern, creating the characteristic "limping" feel.

The tapan (large frame drum, similar to daire/def) plays the bass pattern: a low hit at the start of each group, high hits on the internal beats. The accent structure is the defining feature — the groups are not equal, so the listener perceives a lopsided, driving rhythm.

meters: "7_8" — 7/8: groups 2+2+3. The most common Balkan meter. Found in Macedonian, Bulgarian, Greek folk music. Accents on 1, 3, 5. "9_8" — 9/8: groups 2+2+2+3. Used in Bulgarian horo, Greek kalamatianos. Accents on 1, 3, 5, 7. Longer "limp" at the end. "11_16" — 11/16: groups 2+2+3+2+2. Bulgarian krivo horo. Very asymmetric. "13_8" — 13/8: groups 2+2+3+2+2+2. Bulgarian elenino horo. Longest common additive meter. "7_8_sand" — 7/8: groups 3+2+2 (reversed). Sandansko oro, Macedonian. Different accent placement, "backwards" feel. "9_8_ska" — 9/8: groups 2+3+2+2. Deviationska variant.

variations: "classic" — Traditional tapan pattern. Kick on group starts, snare on internal beats, hi-hat on all 8ths. "modern" — Modern Balkan fusion (Shantel, Balkan Beat Box). Kick patterns more syncopated, added ghost snares. "wedding" — Wedding band style. Denser hi-hat, more snare fills, tapan rolls at cycle end.

Args: meter: Meter name (7_8, 9_8, 11_16, 13_8, 7_8_sand, 9_8_ska). cycles: Number of measure cycles (1-32). variation: Pattern variation (classic, modern, wedding). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. kick_pitch: Kick/tapan low MIDI pitch (36 = C1). snare_pitch: Snare/tapan high MIDI pitch (40 = E1). hh_pitch: Hi-hat MIDI pitch (42 = F#1). tapan_pitch: Tapan roll MIDI pitch (45 = A1).

Returns notes created, meter grouping, accent positions, and pattern info.

Inputs: meter, cycles, hh_pitch, velocity, +7 more. Returns: result

mcp_opendaw_create_bariolageA

Create a bariolage — rapid alternation between a fixed pedal pitch and moving notes.

Bariolage is a Baroque string technique (Bach, Vivaldi, Handel) where a fixed note (typically an open string) rapidly alternates with moving notes that ascend, descend, or follow a melodic pattern. This creates a layered, cross-register texture — two streams of sound perceived simultaneously.

Unlike arpeggiator (cycles chord tones) or montuno (syncopated chord stabs), bariolage creates a two-voice illusion from a single voice: the pedal pitch acts as a drone/anchor while the moving notes create melodic interest above or below it.

Moving patterns: scale_asc — ascending scale notes scale_desc — descending scale notes scale_wave — alternating ascending/descending arpeggio — chord tones rotating chromatic — chromatic approach notes

Subdivisions: 8th, 16th, 32nd — determines speed of alternation

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, mixolydian, harmonic_minor). bars: Number of bars (1-8). octave: Starting MIDI octave (2-6). pedal_pitch: MIDI pitch for the fixed pedal note. If -1, uses root at the specified octave (e.g., G4 = 67). moving_pattern: Pattern for moving notes (scale_asc, scale_desc, scale_wave, arpeggio, chromatic). subdivision: Note subdivision (8th, 16th, 32nd). velocity: Base velocity for moving notes 0-1. pedal_velocity: Velocity for pedal notes 0-1 (usually louder). accent_pedal: If True, pedal notes get accent (slightly louder). unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, pedal/moving note counts, and pattern info.

Inputs: bars, root, scale, octave, +9 more. Returns: result

mcp_opendaw_create_bass_dropA

Create a bass drop — descending pitch sweep into sustained sub bass.

Generates a pitched sweep downward (the "wub" or "fall") followed by a sustained low note. The quintessential dubstep/bass music drop. Also works for EDM build-and-drop, trap bass falls, and impact transitions.

The tool creates two phases:

  1. Sweep phase: notes descend from start_pitch to end_pitch over sweep_beats

  2. Hold phase: a single sustained note at end_pitch for hold_beats

start_pitch: Starting MIDI pitch for the sweep (default 48 = C3). end_pitch: Landing pitch for the sustained bass (default 24 = C1, sub bass). sweep_beats: Duration of the descending sweep in beats (0.5-8, default 2). hold_beats: Duration of the sustained bass after landing (0-16, default 4). sweep_curve: Pitch curve — "linear" (even), "exp" (fast start, slow landing), "log" (slow start, fast landing). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the drop begins. velocity: Base velocity (0-1, default 1.0 = maximum impact).

Returns notes created, sweep/hold details.

Inputs: velocity, end_pitch, hold_beats, start_beat, +5 more. Returns: result

mcp_opendaw_create_bass_from_progressionA

Create a bass line from a chord progression string.

The harmonic trio: create_chord_pads (sustained harmony) + create_arpeggiated_progression (melodic movement) + THIS (bass foundation). All three take the same "Am-F-C-G" string.

pattern: Bass pattern: "root" — root notes on beat 1 + 3, quarter notes (universal) "root_fifth" — root on 1, fifth on 3 (rock, pop) "walking" — 4 quarter notes per bar: root → passing → chord tone → approach to next root (jazz) "pedal" — one sustained root per chord (techno, house sub-bass) "octave" — root + octave in 8th notes (disco, funk) "root_octave" — root on 1, octave up on 3 (pop, rock power)

bars_per_chord: Bars per chord (default 4). octave: MIDI octave for bass (2 = C2=36, typical bass range). velocity: Note velocity (0-1, default 0.9 = strong bass). track_index: Track for bass (typically bass track = 1).

Example:

Jazz walking bass from ii-V-I-vi

create_bass_from_progression("Dm7-G7-Cmaj7-Am7", pattern="walking", octave=2)

Rock root-fifth from I-IV-V

create_bass_from_progression("A-D-E", pattern="root_fifth", octave=2, velocity=0.95)

House pedal sub-bass

create_bass_from_progression("Fm-Fm-Db-Ab", pattern="pedal", octave=1, bars_per_chord=4)

Disco octave bass

create_bass_from_progression("C-Am-F-G", pattern="octave", octave=2, velocity=0.9)

Inputs: octave, pattern, velocity, start_beat, +4 more. Returns: result

mcp_opendaw_create_basslineA

Create a bassline from root note + rhythmic pattern — one call instead of 8-20 create_note calls.

Basslines use low octaves (default octave 2 = C2=36) and high velocity (default 0.9).

root: Root note name (C, C#, D, D#, E, F, F#, G, G#, A, A#, B or flats Db, Eb, Gb, Ab, Bb). pattern: Rhythmic pattern using scale degrees and special chars. Each step = one 16th note:

  • Numbers 1-7 = scale degree (1 = root, 5 = fifth, etc.)

  • 0 = rest

  • '-' = sustain previous note (tie)

  • '+' = octave up for next note

  • '_' = octave down for next note

  • Example: "1 - - - 5 - - - 1 - - - 4 - - -" = root-fifth-root-fourth bassline

  • Example: "1 0 1 0 5 0 5 0 1 0 1 0 3 0 3 0" = syncopated bass unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the bassline starts (0 = bar 1). octave: MIDI octave for the root (2 = C2=36, typical bass range). velocity: Note velocity 0-1 (default 0.9 for strong bass). scale: Scale type for degree mapping (default "minor"). Same scales as create_melody.

Returns the total notes created and pitches used.

Inputs: root (required), pattern (required), scale, octave, +4 more. Returns: result

mcp_opendaw_create_binary_formA

Create binary form — two contrasting sections (A|B) with optional repeats.

Binary form is the simplest structural form in Western music: two self-contained sections, each typically repeated. The A section establishes the tonic, the B section departs and returns. Found in Baroque dance suites (Bach, Handel), folk tunes, early jazz, and many pop structures.

Modulation types (how B section relates to A):

  • dominant: B section in the dominant key (V). Classical approach — Bach two-part inventions, Baroque dance movements.

  • relative: B section in the relative minor/major. Romantic and folk approach — gentler contrast.

  • subdominant: B section in the subdominant (IV). Church hymns, modal folk tunes.

  • parallel: B section stays in same key but uses contrasting melodic material. Minimalist/folk approach.

  • no_modulation: B section identical key, same harmonic center.

With repeat=True, each section is played twice (AABB structure), matching the traditional binary form with repeat marks.

A section: stepwise melody around tonic, I-V-I harmony. B section: contrasting melody in modulated key, wider intervals, returns to tonic at end.

Creates melody on track_index, bass on track_index+1.

Inputs: repeat, key_root, velocity, modulation, +5 more. Returns: result

mcp_opendaw_create_blues_arrangementA

Create a full blues arrangement — shuffle drums + walking bass + dominant 7th chords + blues scale lead.

Classic 12-bar blues — the foundation of American popular music:

  • Track 0: Drums — shuffle/blues groove: kick on 1 and 3, snare on 2 and 4, shuffled hi-hats (triplet feel). The blues shuffle is the heartbeat — not straight 8ths, not full triplets, but the in-between "swing" that makes blues feel like blues.

  • Track 1: Bass — walking bass: quarter notes outlining the chord changes. I-I-I-I | IV-IV-I-I | V-IV-I-V. Each beat walks to the next chord tone — the jazz/blues lineage.

  • Track 2: Chords — dominant 7th voicings (I7, IV7, V7). The blues doesn't use triads — every chord is a 7th. Stab pattern on beats 1 and 3, with shuffle feel.

  • Track 3: Lead — blues scale (root, b3, 4, b5, 5, b7) with blue notes. Bends, slides, long held notes. The "crying guitar" quality — pentatonic minor with the flat 5 blue note for tension.

At 120 BPM (default), this is the classic Chicago blues tempo. At 90 BPM, it's a slow blues (B.B. King). At 140, it's a fast shuffle (Stevie Ray Vaughan).

The 12-bar form: I-I-I-I-IV-IV-I-I-V-IV-I-V. This is the most important chord progression in popular music — the DNA of rock, jazz, soul, and R&B.

bpm: Tempo (70-160, default 120 = classic Chicago blues). bars: Arrangement length (must be multiple of 12 for full blues form. 12 = one chorus, 24 = two choruses, default 12). root: Root note (A is the most common blues key — guitar-friendly). octave: MIDI octave for bass (2 = A2=45, standard blues bass register). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_blues_arrangement(bpm=120, root="A", bars=12) create_blues_arrangement(bpm=90, root="E", bars=24) # slow blues, 2 choruses

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_boom_bapA

Create a boom-bap hip-hop drum pattern — the foundational beat of hip-hop.

Boom-bap: "boom" = kick drum, "bap" = snare. The pattern places kicks on beats 1 and 3, snares on beats 2 and 4 — the backbone of hip-hop from Run-DMC to Nas to Kendrick Lamar. Hi-hats fill the 8th or 16th notes between. The feel comes from swing/groove and kick placement variations.

boom_bap_type: "classic" — 90s boom-bap: kick on 1 and 3, snare on 2 and 4, hats on every 8th. The "Untitled" / Nas "Illmatic" feel. 2-bar cycle with kick variation on bar 2. "old_school" — 80s old school: simpler, kick strictly on 1 and 3, snare on 2 and 4, hats on quarter notes. Run-DMC / LL Cool J style. Less syncopation. "trap" — Trap: rolling hi-hats (16ths with occasional triplets), kick on 1 and "and of 2" and 3.5, snare on 4 only. Faster hats. Migos / Future style. "lofi" — Lo-fi hip-hop: laid-back, kick slightly behind beat (0.95 and 2.95), snare on 2 and 4, hats on 8ths with subtle swing. J Dilla / Nujabes feel. "drill" — UK drill: sliding bass kicks, snare on 3 only, chaotic hi-hat patterns with rolls. Headie One / Central Cee style. More aggressive kick patterns.

bars: Pattern length (2-16, 2 = one boom-bap cycle). kick_pitch: MIDI pitch for kick (36 = C1). snare_pitch: MIDI pitch for snare (38 = D1, acoustic snare). hat_pitch: MIDI pitch for hi-hats (42 = F#1, closed hat). velocity: Base velocity 0-1. Ghost hats -0.2, snares -0.05.

Returns notes created, boom-bap type, and stroke breakdown.

Example: create_boom_bap(boom_bap_type="classic", track_index=0) create_boom_bap(boom_bap_type="lofi", track_index=1, bars=4)

Inputs: bars, velocity, hat_pitch, kick_pitch, +5 more. Returns: result

mcp_opendaw_create_bordunA

Create a bordun — continuously sustained drone chord as a textural layer.

A bordun (bourdon) is a continuously sounding tone or chord that provides a harmonic foundation beneath changing melody. Unlike pedal_point (which is a single repeated/anchored note), the bordun is a sustained textural layer — often an open fifth, octave, or drone chord. Found in Scottish bagpipes, Indian tanpura, hurdy-gurdy, ambient drone music, and folk.

root: Root note name (e.g. "C", "Ab", "F#"). octave: Octave for the bordun (1-6, default 3 = low register). intervals: Comma-separated semitone intervals from root (e.g. "0,7" = open fifth, "0,7,12" = octave+fifth, "0,3,7" = minor triad drone, "0,5" = open fourth). bars: Total length in bars (1-16, default 4). beats_per_bar: Time signature beats (3/4=3, 4/4=4, 6/8=6, default 4). velocity: Velocity of bordun notes (0-1, default 0.55 — softer than melody). retrigger_bars: If >0, re-triggers the bordun every N bars (e.g. 2 = retrigger every 2 bars). If 0, one continuous sustained note for entire duration. unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the bordun begins.

Returns notes created, pitches, total duration.

Inputs: bars, root, octave, velocity, +6 more. Returns: result

mcp_opendaw_create_breakA

Create a classic drum break — the foundation of jungle, DnB, hip-hop, breakbeat.

Generates iconic drum break patterns from presets, with optional variation and swing. Each preset is a 1-bar pattern that can be repeated for multiple bars.

break_type: Classic break pattern preset.

  • "amen" — Amen Break (The Winstons, 1969). The most sampled break in history. Kick on 1 and 3, snare on 2 and 4, with syncopated ghost.

  • "think" — Think Break (Lyn Collins, 1972). Kick on 1, 1.75, 3.25 — distinctive off-beat kick pattern.

  • "ashanti" — Ashanti Roosevelt break. Kick on 1, 2, 3.25 — funky displaced kicks.

  • "funky_drummer" — Clyde Stubblefield break (James Brown). Straight kicks, dense 16th hi-hats.

  • "when_the_levee" — When the Levee Breaks (Led Zeppelin). Heavy kick/snare, sparse hi-hat. The boom-bap template.

  • "synthetic" — Electronic breakbeat. Off-beat hi-hats, four-on-the-floor kick. bars: Number of bars to generate (1-8, default 1). Each bar is a repeat with optional variation. variation: Per-bar variation mode.

  • "none" — exact repeat

  • "fill" — last bar gets a fill (denser snare/hihat)

  • "humanize" — subtle timing/velocity variation per bar

  • "drop" — last bar drops the kick (tension before drop) unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the break starts. swing: Swing amount (0.0-0.65, 0 = straight, 0.58 = classic hip-hop swing).

Returns notes created, break type, and bars.

Inputs: bars, swing, variation, break_type, +3 more. Returns: result

mcp_opendaw_create_breakbeatA

Create a breakbeat pattern — the syncopated skeleton of jungle, DnB, big beat, and breakbeat hardcore.

Breakbeats are "broken" drum patterns where the snare and kick don't sit on clean quarter notes. Instead they syncopate, stutter, and displace — creating the forward-leaning momentum that powered hip-hop's early years (Amen break), then jungle/DnB (160-180 BPM chopped breaks), big beat (Fatboy Slim, Prodigy), and UK garage/2-step.

breakbeat_type: "amen" — The Amen break: G.C. Coleman's performance in The Winstons "Amen, Brother" (1969). The most sampled 6-second loop in history. Kick at 0, 2.66; snare at 1, 3; ghost snare at 2.66. Hats on 8ths. The DNA of jungle and DnB. "dnb" — Drum & bass: chopped Amen-style at DnB tempo. Kick on 0 and 2.5, snare on 1 and 3, rapid 16th hats, ghost snares on the "e" and "a". Rolling, driving. Andy C / Noisia style. "big_beat" — Big beat: mid-tempo (120-130) fat breaks. Kick on 0 and 2.66, snare on 1 and 3, with a kick+snare syncopation on beat 2. Big, swaggering. Fatboy Slim / Prodigy "Firestarter". "2_step" — UK garage 2-step: kick on 1 and 3, snare on 2 and 4, but the second kick is shifted to 2.66 and there's a ghost snare on 3.5. Swung 16ths. The "skipping" feel. MJ Cole / Disclosure style. "funky_drummer" — Clyde Stubblefield's break from James Brown "Funky Drummer" (1970). Kick at 0, 2, 2.66; snare at 1, 3; hats throughout with ghost notes. The most funk-sampled break. Public Enemy, NWA, LL Cool J all built on this.

bars: Pattern length (2-16, 2 = one breakbeat cycle). kick_pitch: MIDI pitch for kick (36 = C1). snare_pitch: MIDI pitch for snare (38 = D1). hat_pitch: MIDI pitch for hi-hats (42 = F#1). ghost_pitch: MIDI pitch for ghost snares (37 = F#1, side-stick). velocity: Base velocity 0-1. Snares -0.05, hats -0.15, ghosts -0.3.

Returns notes created, breakbeat type, and stroke breakdown.

Example: create_breakbeat(breakbeat_type="amen", track_index=0) create_breakbeat(breakbeat_type="dnb", track_index=1, bars=4)

Inputs: bars, velocity, hat_pitch, kick_pitch, +6 more. Returns: result

mcp_opendaw_create_buildupA

Create a complete build-up — riser + snare roll in one call.

Combines two transition elements for a full build-up before a drop/chorus:

  1. Pitch riser (ascending notes with velocity ramp)

  2. Snare roll (increasing density + velocity crescendo)

style: Build-up character:

  • "edm" — 1/4 snare → 1/8 → 1/16 → 32nd roll, exp riser C2→C6

  • "trap" — 1/4 snare → triplets → 32nd roll, exp riser C1→C5

  • "techno" — ride cymbal buildup + open hat crescendo, exp riser C2→C4

  • "rock" — tom roll buildup, linear riser C2→C4

  • "minimal" — just riser, no snare roll (subtle build)

unit_index: AU index (-1 = find first AU with note tracks). track_index: Note track index for riser. start_beat: Where the build-up begins. length_beats: Total build-up length (default 8 = 2 bars). velocity: Base velocity (0-1, ramped up during build).

Returns notes created for riser and snare roll.

Example:

8-beat EDM build-up before a drop

create_buildup(start_beat=0, length_beats=8, style="edm")

Then drop

create_impact(start_beat=8, impact_type="sub_boom")

Inputs: style, velocity, start_beat, unit_index, +2 more. Returns: result

mcp_opendaw_create_cadenzaA

Create a cadenza — an unmeasured virtuosic solo passage with rubato.

A cadenza is a solo passage where the performer has rhythmic freedom. Unlike all other tools that use quantized beat grids, cadenzas use irregular, speech-like rhythm — accelerando, rallentando, fermatas, and dramatic pauses. The notes follow a virtuosic contour: rapid runs, wide leaps, trills, and dramatic peaks.

Styles: classical — Mozart/Beethoven style: balanced phrases, cadential trills romantic — Liszt/Chopin style: dramatic octaves, cascading runs jazz — Coltrane/Parker style: bebop lines, chromatic turns modern — Ligeti/Berio style: extreme registers, clusters

The cadenza is built from segments, each with its own tempo character:

  • Flourish: rapid ascending/descending run

  • Leap: dramatic wide interval jump

  • Trill: alternating two pitches rapidly

  • Fermata: held note with pause after

  • Cascade: descending arpeggio pattern

  • Climb: gradual ascending with crescendo

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, harmonic_minor, etc.). duration_beats: Approximate total duration in beats (4-64). octave: Starting MIDI octave (2-6). style: Cadenza style (classical, romantic, jazz, modern). virtuosic: If True, more rapid passages and wider leaps. breath_marks: Comma-separated beat positions for pauses/breaths. velocity: Base velocity 0-1 (cadenzas have wide dynamic range). unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, segment breakdown, and cadenza statistics.

Inputs: root, scale, style, octave, +7 more. Returns: result

mcp_opendaw_create_call_and_responseB

Create call-and-response — two phrases in musical dialogue.

Call-and-response is the most fundamental musical conversation: a leader phrase (call) followed by a response phrase. Root of blues, gospel, African music, jazz, work songs, and hip-hop.

Response types:

  • echo: exact repeat of the call (African tradition, gospel)

  • transpose: repeat transposed by response_interval semitones (blues, jazz — response at IV or V)

  • variation: same pitches, varied rhythm (jazz, bebop)

  • complementary: contrasting phrase using scale degrees (gospel, soul — response "answers" the call)

  • fill: shorter response — last note only, or 2-note fill (blues turnaround, funk fills)

Call pattern: space-separated scale degrees (0=root, 2=2nd, etc.). Call rhythm: space-separated durations in beats. Response interval: for transpose type, semitones to shift (5 = perfect 4th up, 7 = perfect 5th up, -5 = 4th down). Pairs: number of call-response pairs. Gap beats: silence between call and response.

Creates call on track_index, response on track_index+1.

Inputs: pairs, key_root, velocity, gap_beats, +8 more. Returns: result

mcp_opendaw_create_call_responseA

Create a call-and-response pattern — antecedent/consequent phrase structure.

The call (antecedent) poses a musical question, the response (consequent) answers it. This is the foundation of blues, jazz, hip-hop, electronic, and folk music. The pattern alternates: call → response → call → response, with the response starting after the call ends.

scale: Scale type (major, minor, blues, dorian, etc. — 14 types from music_theory). root: Root note name (C, C#, D, ... B). call_pattern: Scale degrees for the call phrase, space-separated (1-7, 0=rest, -=sustain). Example: "1 3 5 3" — rising and falling 4-note motif response_pattern: Scale degrees for the response phrase, space-separated. Example: "5 4 3 2" — descending answer repeats: Number of call+response pairs (1-8). 2 = call-response-call-response. octave: Starting octave (1-7, default 4). velocity: Note velocity 0-1. step_duration: Duration of each step in beats (0.25 = 16th, 0.125 = 8th triplet).

Returns total notes created and phrase structure.

Example: create_call_response(scale="blues", root="A", call_pattern="1 3 5 3", response_pattern="5 4 3 2", repeats=4)

Inputs: root (required), scale (required), call_pattern (required), response_pattern (required), +7 more. Returns: result

mcp_opendaw_create_canonA

Create a canon — strict melodic imitation with delayed voice entries.

The foundation of contrapuntal music: a single melody is repeated in multiple voices, each entering after a delay, optionally transposed. Think Pachelbel's Canon, "Row Row Row Your Boat", Bach's fugue subjects, or modern call-and-response layers in film scores. Unlike create_counterpoint (which generates a new line), a canon copies the SAME melody into each voice — just shifted in time and pitch.

melody: Comma-separated MIDI pitches of the lead voice (e.g. "60,62,64,67"). voices: Number of imitating voices (2-6, default 3). Voice 1 enters first. entry_delay_beats: Beats between each voice entry (1-16, default 4 = one bar in 4/4). transposition: Comma-separated semitone offsets per voice (e.g. "0,7,12" = unison, fifth, octave). Must have exactly voices values. "0,0,0" = all at same pitch (round/canon). velocity_decay: Velocity reduction per voice (0-0.3, default 0.15). Later voices are quieter, simulating natural ensemble hierarchy. direction: Voice entry order — "up" (low to high) or "down" (high to low). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the first voice begins. velocity: Base velocity for the first voice (0-1, default 0.85).

Returns notes created, voice count, total length, transpositions used.

Inputs: melody, voices, velocity, direction, +6 more. Returns: result

mcp_opendaw_create_cascaraA

Create an Afro-Cuban cáscara pattern — the timbale shell rhythm that fills space around the clave.

Cáscara ("shell") is played on the sides of the timbale drums. It weaves between the clave and tumbao, filling the rhythmic gaps with a flowing, continuous feel. Together with clave and tumbao, it forms the three pillars of the Afro-Cuban rhythm section. The pattern uses two stroke heights: high (rim/edge, accented) and low (shell body, unaccented), creating a call-and-response within the pattern.

cascara_type: "son_3_2" — Son cáscara, 3-2 direction (forward clave). Bar 1: &2 high, 3 low, &3 high, &4 low Bar 2: &2 high, 3 low, &3 high, 4 low "son_2_3" — Son cáscara, 2-3 direction (reverse clave). Bar 1: &2 high, 3 low, &3 high, 4 low Bar 2: &2 high, 3 low, &3 high, &4 low "guaguanco" — Rumba guaguancó cáscara. Adds ghost strokes on beat 1 and &1 of each bar for a denser, more driving feel. "mambo" — Mambo cáscara. Adds syncopated accents on &4 of bar 2 and a fill on beat 4 of bar 2. Brighter, more showy.

bars: Pattern length (2 = one cáscara cycle, repeat for longer). high_pitch: MIDI pitch for high strokes (rim/edge of timbale, 76 = high wood block). low_pitch: MIDI pitch for low strokes (shell body, 60 = mid tom). velocity: Base velocity 0-1. High strokes +0.1, low strokes -0.05.

Returns notes created, cáscara type, direction, and stroke breakdown.

Example: create_cascara(cascara_type="son_3_2", track_index=0) create_cascara(cascara_type="guaguanco", track_index=1, bars=4)

Inputs: bars, velocity, low_pitch, high_pitch, +4 more. Returns: result

mcp_opendaw_create_chaconneA

Create a chaconne — repeating bass + chord progression + developing variations.

A chaconne is a set of variations over a repeating bass line and harmonic progression. Unlike ground bass (bass only) or passacaglia (bass + variations), a chaconne explicitly repeats both the bass AND the chord progression, building variations on top of this fixed harmonic framework.

Bass pattern: space-separated note names (e.g. "C2 G2 A2 E2"). Bass rhythm: space-separated durations in beats (e.g. "1 1 1 1"). Chord pattern: comma-separated chord names aligned with bass notes (e.g. "C,Em,Am,G"). Supports major, minor, dim, aug, maj7, m7, 7. Variation styles:

  • baroque: descending stepwise lines with suspensions, ornaments accumulate

  • romantic: wide intervals, expressive phrases, rubato-like timing

  • jazz: syncopated, chromatic passing tones, swing-like rhythm

  • minimalist: repeating cells with gradual phase shift

  • contemporary: dissonant clusters, intervallic leaps, pointillistic

Creates bass on track_index, chord pads on track_index+1, variation on track_index+2.

Inputs: repeats, velocity, start_beat, unit_index, +5 more. Returns: result

mcp_opendaw_create_chopA

Create a chop — slice source pitches into segments and rearrange them.

The quintessential hip-hop/EDM sampling technique: take a sequence of pitches, cut it into equal segments, then rearrange (reverse, stutter, shuffle, ping-pong). Think Dilla chops, Madlib sample flips, Virtual Riot bass chops, or glitch-hop stutter effects. Each segment becomes a self-contained musical cell.

pitches: Comma-separated MIDI pitches to use as source material (e.g. "60,62,64,67"). chop_mode: How to rearrange segments — "reverse" (play segments backwards), "stutter" (repeat each segment N times — glitch/stutter effect), "shuffle" (random segment order, seeded), "ping-pong" (forward then backward — ABBA pattern), "gate" (silence every other segment — chopped break feel). segment_beats: Duration of each segment in beats (0.25-4, default 0.5 = 8th note). stutter_count: For stutter mode, times to repeat each segment (2-8, default 2). octave_shift: Shift all pitches by N octaves (default 0). -1 = down an octave for bass chops. velocity_variation: Vary velocity between segments (0-0.5, default 0.2). Adds human feel. reverse_pitch_in_segment: If true, reverse pitch order within each segment (inner chop). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the chop begins. velocity: Base velocity (0-1, default 0.9). seed: Random seed for reproducibility.

Returns notes created, segment count, mode used.

Inputs: seed, pitches, velocity, chop_mode, +8 more. Returns: result

mcp_opendaw_create_choraleA

Create a 4-voice SATB chorale with voice-leading rules.

Generates soprano, alto, tenor, and bass voices from a chord progression with proper voice leading: common tones preserved, smooth voice movement (no unnecessary leaps), no parallel fifths or octaves between adjacent chords, and voices stay within their ranges (S: 60-81, A: 55-74, T: 48-67, B: 36-62). The soprano voice gets the melody line (chord roots or nearest chord tones). Classic Bach chorale style — foundational for vocal harmonies, string arrangements, synth pad layering.

chord_pattern: Comma-separated chord names (e.g. "C,Am,F,G"). Supports: maj, min, m7, maj7, dom7, sus2, sus4, dim, aug. beats_per_chord: Duration of each chord in beats (default 4 = 1 bar in 4/4). beats_per_bar: Time signature beats (3/4=3, 4/4=4, 6/8=6, default 4). key_root: Key root note for voice-leading context (e.g. "C", "F#", "Bb"). key_mode: Key mode — "major" or "minor" (affects voice assignment). soprano_velocity: Velocity of soprano voice (0-1, default 0.7). alto_velocity: Velocity of alto voice (0-1, default 0.6). tenor_velocity: Velocity of tenor voice (0-1, default 0.6). bass_velocity: Velocity of bass voice (0-1, default 0.65). note_duration: Note duration as fraction of chord length (0-1, default 0.9). voice_spread: Extra spacing between voices in semitones (0-12, default 0). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the chorale begins.

Returns notes created, chord count, voice ranges, voice-leading info.

Inputs: key_mode, key_root, start_beat, unit_index, +10 more. Returns: result

mcp_opendaw_create_chord_padsB

Create chord pads from a human-readable progression string.

Unlike create_chord_progression (which takes JSON arrays), this takes a simple hyphen-separated string like "Am-F-C-G" — much easier for agents and humans to write. Generates sustained chord pads with configurable octave, velocity, and bars per chord.

progression: Hyphen-separated chords. Each chord is root+type: "Am" = A minor, "F" = F major, "Cmaj7" = C major seventh, "G7" = G dominant 7, "Dm7" = D minor 7, "Esus4" = E suspended 4. Supported types: maj, min, dom7, maj7, min7, sus2, sus4, add9, dim, aug. Default "Am-F-C-G" = i-VI-III-VII in A minor (synthwave/trance). "C-Am-F-G" = I-vi-IV-V in C major (pop). "Dm7-G7-Cmaj7-Am7" = ii-V-I-vi in C (jazz).

bars_per_chord: How many bars each chord lasts (default 4 = one chord per 4-bar phrase). 2 = faster changes, 8 = slow pads.

octave: MIDI octave for chord voicing (3 = C3=48, typical pad range). velocity: Note velocity (0-1, default 0.65 = soft pad). unit_index: AU index with note tracks. track_index: Track for chord pads (typically harmony track = 2). start_beat: Where the progression starts. note_duration: Note length in beats (default 3.8 = almost full bar with small gap for articulation).

Returns chords created, pitches per chord, total notes.

Example:

i-VI-III-VII in A minor (synthwave pads)

create_chord_progression("Am-F-C-G", bars_per_chord=4, octave=3)

ii-V-I-vi in C (jazz comping under)

create_chord_progression("Dm7-G7-Cmaj7-Am7", bars_per_chord=2, octave=3)

I-V-vi-IV in C (pop progression)

create_chord_progression("C-G-Am-F", bars_per_chord=4, octave=4, track_index=2, velocity=0.6)

Inputs: octave, velocity, start_beat, unit_index, +4 more. Returns: result

mcp_opendaw_create_chord_progressionA

Create a chord progression from chord names — one call instead of 15-50 note creations.

chords: JSON array of chord specs. Each chord is [root_note_name, chord_type]. Root names: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (or flats: Db, Eb, Gb, Ab, Bb) Chord types: maj, min, dom7, maj7, min7, sus2, sus4, add9, dim, aug

Example: '[["C","min"],["F","min"],["G","dom7"],["C","min"]]'

unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the progression starts (0 = bar 1). chord_duration: Length of each chord in beats (4 = one bar at 4/4).

Returns the total notes created and chord voicings used.

Inputs: chords (required), start_beat, unit_index, track_index, +1 more. Returns: result

mcp_opendaw_create_claveA

Create an Afro-Cuban clave pattern — the 5-note rhythmic skeleton that defines the feel.

The clave is not a drum pattern — it's a timeline pattern that all other rhythms align to. Every Afro-Cuban rhythm has a clave direction (3-2 or 2-3) that determines where the downbeats fall relative to the clave strokes.

clave_type: "son_3_2" — Son clave, 3-side first (forward clave). Beats: 0, 0.5, 1, 2.5, 3 "son_2_3" — Son clave, 2-side first (reverse clave). Beats: 0, 1.5, 3, 3.5, 4 "rumba_3_2" — Rumba clave, 3-side first. Last stroke shifted to 3.5 (and 2.5→2.66) "rumba_2_3" — Rumba clave, 2-side first. "bossa_nova" — Bossa nova clave. Beats: 0, 2.5, 3, 4.5, 5 (over 2 bars) "6_8" — 6/8 Afro-Cuban clave. 5 strokes across 2 bars of 6/8.

bars: Pattern length in bars (2 for son/rumba, 2 for bossa, 2 for 6/8). pitch: MIDI pitch for clave strokes (76 = high wood block). velocity: Velocity 0-1. duration: Note duration in beats.

Returns notes created, clave type, and direction (3-2 or 2-3).

Example: create_clave(clave_type="son_3_2", track_index=0) create_clave(clave_type="bossa_nova", track_index=1)

Inputs: bars, pitch, duration, velocity, +4 more. Returns: result

mcp_opendaw_create_colotomicA

Create a colotomic structure — interlocking gong layers marking cyclic time.

Gamelan music uses colotomic instruments (gongs of different sizes) to mark the cyclic structure of a piece. Each gong level has its own periodicity, creating an interlocking temporal grid. The largest gong (gong ageng) marks the end of a full cycle, while smaller gongs subdivide it into sections. The melodic instruments (saron, bonang) fill in between the gong strikes.

Unlike polyrhythm (simultaneous conflicting meters) or additive rhythm (unequal groupings), colotomic structure is hierarchical: each layer subdivides the cycle at a different level, creating a nested temporal hierarchy. This is the foundation of Indonesian gamelan, Javanese klenengan, and Balinese ritual music.

Structures: slendro — 8-beat gong cycle (gongan): gong at beat 8, kenong at 4, kempul at 2+6, kethuk at every odd beat. Slendro scale. pelog — 16-beat gong cycle: gong at 16, kenong at 8+12, kempul at 4+12, kethuk at every 2 beats. Pelog-inspired. lancaran — 8-beat with doubled kethuk (faster surface rhythm) ketawang — 16-beat with half-speed gong (longer cycle feel)

Tempo density: sparse — gong layers only, no melodic fill medium — gong layers + basic saron (elaboration) dense — gong layers + saron + bonang (full interlock)

Args: root: Root note name (C, C#, D, ...). scale: Scale name (pentatonic_minor, pentatonic_major, major, minor). Default pentatonic_minor for slendro-like feel. cycles: Number of gongan cycles (1-8). octave: Starting MIDI octave (2-5). structure: Structure type (slendro, pelog, lancaran, ketawang). tempo_density: Density level (sparse, medium, dense). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, gong layer breakdown, and cycle info.

Inputs: root, scale, cycles, octave, +6 more. Returns: result

mcp_opendaw_create_comparsaA

Create Cuban comparsa — carnival procession percussion.

Comparsa is the percussion ensemble that accompanies Cuban carnival street processions (conga line). Rooted in Afro-Cuban tradition, it is the ancestor of salsa and modern Latin pop. The driving energy comes from layered conga drums with interlocking patterns.

Instruments (GM percussion mapping):

  • Conga low (54) — tumbadora, bass tone

  • Conga high (63) — quinto, slap tone

  • Conga open (64) — conga open tone

  • Clave (75) — wooden claves, the timeline

  • Cowbell (56) — cencerro, driving pulse

  • Maracas (70) — shaker

  • Guiro (73) — scraped gourd

Styles:

  • habanera: Classic Havana carnival. Conga pattern with clave 3-2, cowbell steady 8ths, maracas on offbeats. The street procession feel. 90-110 BPM.

  • santiago: Eastern Cuba, rumba-influenced. More syncopated conga patterns, guiro scrapes, claves 2-3. Looser feel.

  • matanzas: Rumba columbia roots. Quinto improvisation feel, open conga tones, sparse cowbell. Afro-Cuban spiritual energy.

  • conga_line: Street procession — marching feel. Steady bass conga on every beat, quinto syncopation, cowbell accent pattern. Designed for dancing in a line.

  • comparsa_moderna: Modern carnival — faster, denser, 16th-note maracas, driving cowbell, layered congas. Salsa-influenced energy.

Creates notes on track_index using GM percussion.

Inputs: bars, style, velocity, tempo_bpm, +3 more. Returns: result

mcp_opendaw_create_compingA

Create comping — rhythmic chordal accompaniment.

The most common accompaniment style in modern music: play chords in a rhythmic pattern rather than sustained blocks. Jazz piano comping, funk guitar chops, reggae skanks, country boom-chick, Neo-soul chords. Unlike create_chord_progression (sustained blocks) or create_stab (house stabs), comping gives each chord a rhythmic identity — the chord follows the groove.

chords: JSON array of chord specs, same as create_chord_progression. Each chord is [root_note_name, chord_type]. Root names: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (or flats: Db, Eb, Gb, Ab, Bb) Chord types: maj, min, dom7, maj7, min7, sus2, sus4, add9, dim, aug Example: '[["C","min7"],["F","min7"],["G","dom7"],["C","min7"]]' rhythm: Rhythmic pattern string. Each char = one step of note_spacing beats: 'x' = play chord, '-' = rest, '.' = ghost (quiet chord) Default "x-x-x-x-" = off-beat eighths (classic jazz comping) "x--x--x-" = syncopated funk "x...x..." = boom-chick (country) "x-x-x-x-x-x-x-x" = reggae skank (every off-beat 16th) unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Where comping starts. chord_octave: MIDI octave for chord root (4 = C4=60). velocity: Base velocity (0-1, default 0.7). note_spacing: Duration of each rhythm step in beats (0.25=16th, 0.5=8th, default 0.5). syncopation: Probability of pushing a note slightly off-grid (0-0.5, default 0). Adds human feel — 0.1 = subtle, 0.3 = pronounced.

Returns notes created, chords played, rhythm pattern used.

Inputs: chords (required), rhythm, velocity, start_beat, +5 more. Returns: result

mcp_opendaw_create_counter_melody_from_progressionA

Create a counter-melody (second melodic line) from a chord progression.

A counter-melody is a secondary melodic line that plays alongside the primary melody. It provides harmonic depth and contrapuntal interest without competing for the listener's attention.

This completes the harmonic quintet: chord_pads + arpeggiated_progression + bass_from_progression + melody_from_progression + THIS (counter-melody). Place on track 4 (default) to avoid clashing with melody (track 3).

pattern: Contrapuntal pattern: "contrary" — moves opposite to chord root motion (if root goes up, counter goes down). Classic species-1 counterpoint feel. "oblique" — one note sustained across the chord, changes only when the harmony forces it. Minimalist, drone-like. "parallel_third" — parallels the chord tones a third above. Sweet, consonant, pop/folk counter-melody. "parallel_sixth" — parallels the chord tones a sixth above. Open, spacious, cinematic. More independent than parallel third. "call_response" — answers after the melody would play: rests on beats 1-2, plays on beats 3-4. Antiphonal, gospel/soul feel.

bars_per_chord: Bars per chord (default 4). octave: MIDI octave (default 4 = below typical melody at 5). velocity: Lower than melody (0-1, default 0.6 = supportive, not competing). track_index: Track for counter-melody (default 4, above melody track 3).

Example:

Counter-melody below the lead

create_counter_melody_from_progression("Am-F-C-G", pattern="contrary", octave=4, velocity=0.6)

Cinematic parallel sixths

create_counter_melody_from_progression("Dm-G-C-Am", pattern="parallel_sixth", octave=4, velocity=0.55)

Gospel call-and-response

create_counter_melody_from_progression("C-Am-Dm-G", pattern="call_response", octave=5, velocity=0.65)

Inputs: octave, pattern, velocity, start_beat, +4 more. Returns: result

mcp_opendaw_create_counterpointA

Generate a counter-melody in contrary motion to existing notes.

Reads notes from a melody and creates a counterpoint that moves in the opposite direction: when the melody goes up, the counterpoint goes down, and vice versa. Each note is offset by a fixed interval from the melody's midpoint pitch, then mirrored.

unit_index: Source AU index. track_index: Source note track index. region_index: Source region index. interval: Base interval in semitones between melody and counterpoint (default 7 = fifth). The counterpoint is placed interval semitones below the melody's average pitch, then each note is mirrored around that center. new_unit_index: Target AU index (-1 = create new synth track). new_track_index: Target note track index on the target AU. velocity: Velocity for counterpoint notes (default 0.6, quieter than melody).

Returns source notes read and counterpoint notes created.

Inputs: unit_index (required), interval, velocity, track_index, +3 more. Returns: result

mcp_opendaw_create_country_arrangementA

Create a full country arrangement — boom-chick guitar + root-five bass + major pentatonic fiddle lead.

Classic country/Americana — the foundation of American roots music:

  • Track 0: Drums — straight 8th backbeat: kick on 1 and 3, snare on 2 and 4, steady 8th hi-hats. Country drums are straight, not shuffled like blues — the groove comes from the guitar, not the drums.

  • Track 1: Bass — root-five pattern: root on beat 1, fifth on beat 3. The classic country bass — simple, steady, and unmistakable.

  • Track 2: Chords — boom-chick guitar: alternating bass note (beat 1) + chord strum (beat 2), bass note (beat 3) + chord strum (beat 4). Triads, not 7ths — country harmony is cleaner than blues. The boom-chick is the Carter Family/Johnny Cash pattern.

  • Track 3: Lead — major pentatonic (root, 2, 3, 5, 6) with occasional blue notes (b3, b7). Fiddle-style: long sustained notes, fast scale runs, and bends. The crying fiddle quality.

At 120 BPM (default), this is a classic country two-step tempo. At 90 BPM, it's a country ballad. At 140, it's a fast bluegrass breakdown feel.

The I-IV-V progression: I-I-IV-I-V-I-IV-I (8 bars). Simple, direct, and the backbone of country, folk, and Americana.

bpm: Tempo (80-160, default 120 = classic country two-step). bars: Arrangement length (must be multiple of 8, default 8). root: Root note (G is the most common country key — guitar/capo friendly). octave: MIDI octave for bass (2 = G2=43, standard country bass register). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_country_arrangement(bpm=120, root="G", bars=8) create_country_arrangement(bpm=90, root="D", bars=16) # ballad, 2 verses

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_crescendoA

Apply a crescendo or decrescendo to existing notes in a region.

Gradually changes note velocities from start_velocity to end_velocity across all notes in the region. Useful for building tension or fading out.

unit_index: AU index. track_index: Track index. region_index: Region index (-1 = first region). start_velocity: Starting velocity 0-1 (low = quiet beginning). end_velocity: Ending velocity 0-1 (high = loud end). curve: "linear", "exp" (exponential, starts slow), "log" (logarithmic, starts fast).

Returns number of notes modified and velocity range applied.

Inputs: unit_index (required), track_index (required), curve, end_velocity, +2 more. Returns: result

mcp_opendaw_create_cross_rhythmA

Create a cross-rhythm — multiple voices with independent period lengths creating shifting alignment.

Unlike polyrhythm (which divides one bar into n and m equal parts), cross-rhythm gives each voice its own period length in beats. The voices cycle independently, creating continuously shifting alignment patterns that only realign after the LCM of all periods.

African cross-rhythms, Steve Reich, Talking Heads, minimalism.

voices: Comma-separated period lengths per voice. E.g., "5,7,3" creates 3 voices with period 5, 7, and 3 beats respectively. 2-6 voices supported. bars: Total length in bars (1-16). The pattern cycles until bars×4 beats is filled. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. duration: Note duration in beats. base_velocity: Base velocity 0-1. Each voice gets slightly attenuated (voice 0 = full).

Returns total notes created, voice periods, and alignment interval (LCM).

Common cross-rhythms: "5,7" — 5-beat vs 7-beat (African, shifts every 35 beats) "3,4,5" — triple cross-rhythm (minimalism) "4,5,6" — dense shifting pattern "3,5,7" — prime cross-rhythm (longest alignment cycle = 105 beats)

Example: create_cross_rhythm(voices="5,7", bars=8, track_index=0)

Inputs: voices (required), bars, duration, start_beat, +3 more. Returns: result

mcp_opendaw_create_dembowA

Create a dembow rhythm — the foundational beat of reggaeton and Latin dancehall.

The dembow is a 3-3-2 syncopated pattern that drives virtually all reggaeton and Latin dancehall music. It derives from the "Dembow" riddim by Bobby Dixon (1990, Jamaica) and was popularized in Puerto Rico. The pattern creates a distinctive galloping feel through its uneven grouping of 3+3+2 within a 4/4 bar. Every reggaeton track from Daddy Yankee's "Gasolina" to Bad Bunny's "Tití Me Preguntó" is built on this rhythm.

dembow_type: "classic" — Classic reggaeton dembow. Kick on 1 and 3, snare on 3.5, 4.5, 5.5 (the 3-3-2 gallop). 1-bar cycle. "dancehall" — Dancehall variant. Sparser, kick on 1 and 3, snare on 3.5 and 4.5. Less gallop, more pulse. "trap_latino" — Latin trap variant. Kick on 1, 3.5, and 4.75 (syncopated), snare on 2.5 and 4.5. More modern, less rigid. "perreo" — Perreo (old-school reggaeton). Denser snare pattern with ghost hits on 2.75 and 6.75. Rougher, underground feel. "urbano" — Urbano latino (modern fusion). Kick on 1, 3, 4.75, snare on 3.5, 4.5, 5.5. Blends reggaeton with trap.

bars: Pattern length (1-16, 1 = one bar cycle). kick_pitch: MIDI pitch for kick (36 = C1, acoustic bass drum). snare_pitch: MIDI pitch for snare (40 = E1, electronic snare). velocity: Base velocity 0-1. Ghost hits -0.2, main hits +0.05.

Returns notes created, dembow type, and stroke breakdown.

Example: create_dembow(dembow_type="classic", track_index=0) create_dembow(dembow_type="trap_latino", track_index=1, bars=4)

Inputs: bars, velocity, kick_pitch, start_beat, +4 more. Returns: result

mcp_opendaw_create_disco_arrangementA

Create a full disco arrangement — four-on-floor + octave bass + string sustains + wah guitar across 4 tracks.

Classic 70s disco with the signature groove — fundamentally different from house (its descendant):

  • Track 0: Drums — four-on-floor with 16th OPEN hats (not closed 8ths like house). Kick on every quarter, clap on 2 & 4. The 16th-note open hi-hat pattern is the disco signature — busier and more open than house's closed 8th hats. The groove that launched dance music.

  • Track 1: Bass — SYNCOPATED OCTAVE bass: the "good times" bass line. Root on beat 1, then syncopated octave jumps on the "and" of beats 2 and 4. Not off-beat 8ths like house, not arpeggiated like synthwave — it's a melodic bass line with octave leaps. The bass IS the hook in disco.

  • Track 2: Strings — sustained chord pads with octave doubling. Full bar sustain, lush and smooth. The orchestral element that separates disco from house — house uses stabs, disco uses sustained strings. Minor or major triad depending on chord.

  • Track 3: Guitar — wah-wah chops: 16th-note rhythmic scratching with accent pattern. Root + minor seventh voicing (funk-influenced). The "chukka-chukka" that drives the groove. Different from reggae skank (off-beat only) — disco guitar plays ALL 16ths with accents.

Uses I-vi-IV-V progression (G-Em-C-D in G major) — the classic disco four-chord loop. Different from house (minor vamp), pop (I-V-vi-IV), rock (I-IV-V). Disco's progression is major-key and optimistic — the "feel good" sound of the 70s.

At 120 BPM (default), this creates the classic disco groove — the tempo that defined the genre. The syncopated octave bass and 16th open hats are the fundamental differences from all 13 other arrangements: house has off-beat bass stabs with closed 8th hats, disco has melodic octave bass with 16th open hats.

bpm: Tempo (110-130, default 120 = classic disco). bars: Arrangement length (4-16, default 8). Must be multiple of 4. root: Root note (G is a classic disco key — G major). octave: MIDI octave for bass (2 = G2=43, standard disco bass register). unit_index: AU index with note tracks. drum_track / bass_track / string_track / guitar_track: Track indices.

Returns notes created per track and total.

Example: create_disco_arrangement(bpm=120, root="G", bars=8) create_disco_arrangement(bpm=115, root="C", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_djembe_ensembleA

Create a West African djembe/dunun ensemble — cyclical ostinato with call-and-response.

West African drumming (Mali, Guinea, Senegal) is built on layered cyclical patterns. Three bass drums (dununs) play interlocking ostinato patterns that define the rhythmic foundation. The kenkeni (highest) plays the fastest cycle, the sangban (middle) plays the core pulse, and the dundunba (lowest) plays the slow anchor. A bell (kenken) plays the timeline — the reference pattern all drummers orient to. Two djembes play lead and accompaniment parts: djembe 1 improvises calls and echauffements (heating-up sections), djembe 2 plays a fixed accompaniment (accompagnement) that interlocks with the dununs.

Unlike samba (parade ensemble) or songo (drum kit), West African drumming is cyclical: the accompaniment loops indefinitely while the lead djembe improvises on top. The structure is call-and-response: the lead plays a signal (appel) and the ensemble responds, then the groove continues.

styles (traditional rhythms): "danza" — Malian welcoming rhythm. Kenkeni steady 8ths, sangban pulse on 1+3, dundunba on 2+4. Bell timeline E(3,2,3). Djembe 2 accompagnement: slap-tone-slap-bass. "kuku" — Guinean celebration rhythm. Kenkeni offbeat pattern, sangban syncopated, dundunba sparse. Bell E(7,12). Djembe 2: rolling 16th tone-slaps. "djole" — Sierra Leonean rhythm (originally on sikko drums). Kenkeni 16ths, sangban 3-3-2, dundunba on 1. Bell E(3,2,3). Djembe 2: spaced bass-slap pattern. "doundounba" — The "dance of the strong men" (Guinea). Sangban drives with a dense 16th pattern, dundunba on downbeats, kenkeni sparse. Bell E(3,2,3). Aggressive djembe 2.

bars: Pattern length (4-16, even). style: Rhythm name (danza, kuku, djole, doundounba). velocity: Base velocity (0-1). kenkeni_pitch: Kenkeni (high dunun) MIDI pitch (35 = B0). sangban_pitch: Sangban (mid dunun) MIDI pitch (36 = C1). dundunba_pitch: Dundunba (low dunun) MIDI pitch (38 = D1). djembe1_pitch: Lead djembe MIDI pitch (42 = F#1). djembe2_pitch: Accompaniment djembe MIDI pitch (46 = A#1). bell_pitch: Bell (kenken) timeline MIDI pitch (50 = D2).

Args: bars: Pattern length in bars (4-16, even). style: Rhythm style (danza, kuku, djole, doundounba). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. kenkeni_pitch: Kenkeni MIDI pitch. sangban_pitch: Sangban MIDI pitch. dundunba_pitch: Dundunba MIDI pitch. djembe1_pitch: Lead djembe MIDI pitch. djembe2_pitch: Accompaniment djembe MIDI pitch. bell_pitch: Bell timeline MIDI pitch.

Returns notes created, instrument breakdown, and rhythm info.

Inputs: bars, style, velocity, bell_pitch, +8 more. Returns: result

mcp_opendaw_create_dnb_arrangementA

Create a full drum & bass arrangement — drums + bass + pad across 3 tracks in one call.

This is the first multi-track genre arrangement tool. Instead of creating individual patterns, it generates a complete DnB section with all elements locked together:

  • Track 0: Drums — chopped Amen-style breakbeat with kick, snare, hats, ghost notes

  • Track 1: Bass — Reese-style bassline with sustained notes and syncopated stabs

  • Track 2: Pad — sustained minor chord pad that creates harmonic foundation

The arrangement is tempo-aware: at 174 BPM (default), the patterns are optimized for the classic 170-180 DnB feel. The bass and drums lock rhythmically — bass sustains when drums break, stabs when drums roll.

bpm: Tempo (160-185, default 174 = classic DnB). bars: Arrangement length (4-32, default 8 = typical section). root: Root note for bass and pad. octave: MIDI octave for bass (2 = C2=36). unit_index: AU index with note tracks. drum_track: Track index for drums. bass_track: Track index for bass. pad_track: Track index for pad. velocity: Base velocity 0-1.

Returns notes created per track and total.

Example: create_dnb_arrangement(bpm=174, root="A", bars=8) create_dnb_arrangement(bpm=170, root="F#", bars=16, drum_track=2, bass_track=3, pad_track=4)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_downtempo_arrangementB

Create a downtempo/trip-hop arrangement — 85 BPM Bristol sound.

Downtempo/trip-hop emerged from Bristol, UK (early 1990s) — a fusion of hip-hop breaks, dub bass, atmospheric samples, and melancholic vocals. Key characteristics:

  • 80-90 BPM, laid-back, heavy groove

  • Boom-bap drums with swing, vinyl crackle aesthetic

  • Deep, melodic sub-bass with long notes

  • Minor key, dark/jazzy harmony (m7, m9, half-diminished)

  • Atmospheric pads, Rhodes piano, sparse melodies

  • Sample-based, cinematic, nocturnal mood

Creates 5 tracks:

  1. Drums (track_index): Boom-bap pattern — kick on 1 & 3, snare on 2 & 4, swung hats, ghost notes, occasional fills

  2. Bass (track_index+1): Deep sub-bass with long sustained notes, melodic movement, octave drops

  3. Chords (track_index+2): Minor 7th/9th Rhodes-style chords, sparse, on beat 1 of every 2 bars

  4. Melody (track_index+3): Sparse, melancholic minor key melody with wide intervals and long rests

  5. Atmosphere (track_index+4): Sustained pad notes, root and fifth, very low velocity, cinematic texture

Default key: D minor (classic trip-hop key — Portishead, Massive Attack).

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_drum_fillA

Create a drum fill or transition pattern — one call replaces 10-30 note creations.

Generates rhythmic fills between song sections with increasing/decreasing density. Useful for transitions: verse→chorus, breakdown→drop, outro buildup.

fill_type: Type of fill:

  • "build" — density increases toward end (leading into a drop/chorus)

  • "break" — density decreases (winding down after a section)

  • "roll" — sustained snare/tom roll with accents

  • "crash" — crash + sparse hits for impact

  • "tom" — descending tom pattern

bars: Length in bars (1-4). Each bar = 4 beats = 16 sixteenth steps. start_beat: Position in beats where the fill begins. density: Note density — "sparse", "medium", "dense".

unit_index: AU index with a note track (-1 = find first AU with note tracks).

Returns notes created per lane and total.

Inputs: bars, density, fill_type, start_beat, +1 more. Returns: result

mcp_opendaw_create_drum_patternA

Create a drum beat from compact step-sequencer notation — one call replaces 10-20 note creations.

pattern: JSON object with drum lanes, each lane is a string where each char is a 16th-note step:

  • 'x' = hit (velocity 0.9)

  • 'o' = soft hit (velocity 0.5)

  • '.' = rest

  • 'X' = accent (velocity 1.0)

Lanes: kick, snare, hihat, clap, perc (each optional).

Example (4/4 house beat): '{"kick":"x...x...x...x...","snare":"....x.......x...","hihat":"....o...o...o..."}'

unit_index: AU index with a note track (-1 = find first AU with note tracks).

Returns the number of notes created per lane.

Inputs: pattern (required), unit_index. Returns: result

mcp_opendaw_create_drum_soloA

Create a genre-specific drum solo with rudimental vocabulary.

Generates a complete drum solo using vocabulary appropriate to the chosen style. Unlike create_drum_fill (short transition), this tool creates a full multi-bar solo with phrasing, build-ups, climax, and genre-specific rudimental patterns:

  • rock: Thunderous 16th-note double kick patterns, crash accents, tom fills, snare ghost notes, building intensity. John Bonham, Neil Peart, Danny Carey.

  • jazz: Brushes + sticks, comping patterns, ride bell, press rolls, polyrhythmic phrasing, trading 4s feel. Max Roach, Elvin Jones, Tony Williams.

  • funk: Ghost-note heavy 16th-note grooves, hi-hat splashes, pocket fills, James Brown/Bootsy aesthetic. Clyde Stubblefield, Jabo Starks, Bernard Purdie.

  • latin: Cascara, mambo bell, timbale fills, clave-based phrasing, 6/8 feel options. Tito Puente, Mongo Santamaria.

  • marching: Rudimental solo — paradiddles, flams, drags, roll building, double-stroke open rolls. DCI, snare line vocabulary.

solo_type: rock | jazz | funk | latin | marching bars: Solo length (2-16, default 4) velocity: Base velocity 0-1 (drum solos are loud, default 0.9) seed: PRNG seed for reproducibility

Returns notes created and solo characteristics.

Example: create_drum_solo(solo_type="rock", bars=4) create_drum_solo(solo_type="jazz", bars=8) create_drum_solo(solo_type="marching", bars=4, seed=100)

Inputs: bars, seed, velocity, solo_type, +3 more. Returns: result

mcp_opendaw_create_dubstep_arrangementA

Create a full dubstep arrangement — half-time drums + wobble bass + lead arp across 3 tracks.

Dubstep with all elements locked in half-time feel:

  • Track 0: Drums — half-time at 140 BPM (feels like 70): kick on 1, snare on 3, with percussive fills and ghost notes. The signature dubstep swing.

  • Track 1: Bass — wobble bass: sustained sub notes with rhythmic pitch shifts between root and octave/fifth, creating the "wub-wub" that defines the genre. Cutoff-sweep style pitch modulation via note offsets.

  • Track 2: Lead — minor arpeggio that runs through the arrangement, atmospheric and dark, complementing the wobble bass.

At 140 BPM (default), half-time means the groove feels at 70 BPM — kick on beat 1, snare on beat 3 of each bar. This is the fundamental difference from all other electronic arrangements: the half-time feel creates the heavy, swinging groove.

bpm: Tempo (135-150, default 140 = classic dubstep). bars: Arrangement length (4-16, default 8). root: Root note (G is a classic dubstep key). octave: MIDI octave for wobble bass (1 = C1=24, sub-bass territory). unit_index: AU index with note tracks. drum_track / bass_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_dubstep_arrangement(bpm=140, root="G", bars=8) create_dubstep_arrangement(bpm=145, root="F", bars=16)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_edm_arrangementA

Create a full EDM arrangement — festival/mainstage 4-on-floor + supersaw + pluck + lead.

Electronic Dance Music — festival/mainstage sound:

  • Track 0: Drums — 4-on-the-floor kick (every beat), claps on 2+4, open hats on offbeats, 16th closed hats for energy. Riser/snare buildup at end of 8-bar phrases.

  • Track 1: Bass — offbeat bass (root on the "and" of each beat). Sub-bass frequency, driving, syncopated.

  • Track 2: Supersaw synth — wide chord stabs on beats 1 and 3. Root position triads with spread voicings. The "wall of sound" — mainstage synth.

  • Track 3: Lead synth — melody using scale degrees. Arpeggiated pattern with rhythmic repetition. The "hook".

F minor default — the most common EDM key (nice for both male and female vocals, sits well in club systems). 128 BPM (house/EDM standard). vi-IV-I-V progression (Fm-Db-Ab-Eb) — the "pop punk" progression that drives most festival anthems.

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_electronic_bassA

Create an electronic bassline pattern — genre-specific bass for dance music.

Electronic basslines are fundamentally different from melodic basslines: they're rhythmic engines that lock with the kick drum. Each genre has a characteristic bass technique that defines its sound.

bass_type: "house_offbeat" — House off-beat bass: sustained notes on the "&" of each beat (between kicks). The classic house bass that creates the "untz-untz-untz" feel. Frankie Knuckles / Detroit house. "techno_sub" — Techno sub-bass: one long sustained root per bar, minimal. Pure low-end energy. Berlin techno / Marcel Dettmann. "dnb_reese" — DnB Reese bass: sustained note on beat 1, then syncopated stabs on the "e" and "a" of beats 2-4. Dark, detuned. Noisia. "dubstep_wobble" — Dubstep wobble: quarters on 1+3, wub pattern on 2+4 with repeated 16ths and fifth movement. Skrillex / Excision. "acid_303" — Acid 303: fast 16ths alternating root/octave with fifth drops. TB-303 squelch. Phuture / Hardfloor. "garage_2step" — UK garage 2-step bass: notes on 1 and 2.66, ghost on 3.5. Bouncy, syncopated. MJ Cole / Disclosure.

bars: Pattern length (1-16). root: Root note name (C, C#, D, etc. or flats Db, Eb). octave: MIDI octave (2 = C2=36). velocity: Base velocity 0-1.

Returns notes created, bass type, and pitch info.

Example: create_electronic_bass(bass_type="house_offbeat", root="C", track_index=0) create_electronic_bass(bass_type="dnb_reese", root="A", track_index=1, bars=4)

Inputs: bars, root, octave, velocity, +4 more. Returns: result

mcp_opendaw_create_euclidean_rhythmA

Create a Euclidean rhythm — distributes k onsets across n steps as evenly as possible.

The Euclidean algorithm (BJK algorithm) generates most of the world's classic rhythms: E(3,8) = tresillo (Cuban, Arabic, 3-3-2) E(5,8) = cinquillo (Cuban) E(7,16) = samba, rumba E(7,12) = bembé (West African) E(2,5) = tresillo variant E(4,9) = Aksak (Balkan) E(3,7) = Persian/Arabic

onsets: Number of hits (k). 1-32. steps: Total number of steps (n). 2-64. Must be >= onsets. rotation: Rotate the pattern clockwise by N steps. 0 = no rotation. bars: Number of bars to repeat. Each step = one (4/steps)th of a bar. pitch: MIDI pitch for all hits. velocity: Velocity 0-1. Accents (first onset of each group) get +0.15. duration: Note duration in beats.

Returns notes created, pattern as binary string (1=hit, 0=rest), and Euclidean notation E(k,n).

Example: create_euclidean_rhythm(onsets=3, steps=8, track_index=0) # tresillo create_euclidean_rhythm(onsets=7, steps=16, pitch=38, track_index=1) # samba

Inputs: bars, pitch, steps, onsets, +6 more. Returns: result

mcp_opendaw_create_filter_sweepA

Create a filter sweep on a Vaporisateur instrument's cutoff parameter with smart defaults.

The most common transition technique in EDM/techno/house. Sweeps the filter cutoff from closed to open (build-up) or open to closed (breakdown). Optionally boosts resonance during the sweep for that classic "talking filter" effect. Uses exponential curve by default (matches how human hearing perceives frequency changes).

unit_index: AU index with a Vaporisateur instrument. direction: "open" (low→high, build-up) or "close" (high→low, breakdown). start_beat: Start position in beats. duration_beats: Sweep length in beats (default 8 = 2 bars). start_cutoff: Starting cutoff value 0.0-1.0 (default: 0.05 for open, 0.85 for close). end_cutoff: Ending cutoff value 0.0-1.0 (default: 0.9 for open, 0.05 for close). resonance: Fixed resonance value 0.0-1.0 during sweep. Default: current value unchanged. resonance_boost: If True, automates resonance from current to +0.3 at sweep midpoint, then back down — classic filter sweep "whistle" effect. curve: "exp" (exponential, default — natural for filters), "linear", "log". steps: Number of automation points (default 32 = smooth).

Returns events created, sweep config, and a preview of the curve.

Examples: create_filter_sweep(unit_index=0, direction="open", duration_beats=16) → 16-bar filter open from 0.05 to 0.9, exp curve, resonance boost at midpoint create_filter_sweep(unit_index=2, direction="close", duration_beats=4, resonance_boost=False) → Quick 4-beat filter close, no resonance boost

Inputs: unit_index (required), curve, steps, direction, +6 more. Returns: result

mcp_opendaw_create_flamenco_compasA

Create a Flamenco compás — the cyclical rhythmic foundation of Flamenco.

Flamenco compás is the rhythmic cycle that defines each palo (form). Unlike Western meter (uniform bars), Flamenco uses a 12-beat cycle with accents on specific beats (typically 3, 6, 8, 10, 12). The accents create the characteristic Flamenco feel — a tension between the expected downbeat and where the accents actually fall.

The compás is marked by three layers:

  1. PALMAS SECAS — Sharp, dry handclaps on accented beats. The "skeleton" of the compás. Loud, precise.

  2. PALMAS SORDAS — Muffled handclaps on unaccented beats. The "flesh" — fills the gaps between secas. Softer, cupped hands.

  3. CAJÓN — Peruvian box drum adapted to Flamenco. Plays the bass pulse, usually on beats 1 and the main accents. Resonant, deep.

  4. GOLPE — Table tap / footwork accent. Sharp percussive hits for dramatic moments, often at the end of a compás cycle.

palos (forms): "bulerias" — 12 beats, accents on 12, 3, 6, 8, 10. Fast, festive. The most modern and popular palo. Starts on 12. "solea" — 12 beats, accents on 3, 6, 8, 10, 12. Slow, solemn. The "mother of Flamenco". Deep, expressive. "alegrias" — 12 beats, accents on 3, 6, 12 (lighter), 8, 10. Joyful. From Cádiz. Mid-fast tempo. "siguiriyas" — 12 beats, accents on 3, 6, 8, 11 (asymmetric grouping 3+2+3+2+2). Slow, tragic. The most jondo (deep) palo. "tangos" — 4 beats, accents on 1, 3. Simple 4/4 feel, the most accessible palo. Rhythmic, earthy. "rumba" — 4 beats, accents on 1, 2.5, 3 (syncopated). The most accessible Flamenco-pop form. Gypsy Kings style.

Args: palo: Flamenco form (bulerias, solea, alegrias, seguiriyas, tangos, rumba). cycles: Number of compás cycles (1-16). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. palmas_secas_pitch: Palmas secas (sharp clap) MIDI pitch (39 = D#1). palmas_sordas_pitch: Palmas sordas (muffled clap) MIDI pitch (42 = F#1). cajon_pitch: Cajón (box drum) MIDI pitch (36 = C1). golpe_pitch: Golpe (tap) MIDI pitch (50 = D2).

Returns notes created, instrument breakdown, accent positions, and palo info.

Inputs: palo, cycles, velocity, start_beat, +6 more. Returns: result

mcp_opendaw_create_four_on_floorB

Create a four-on-the-floor pattern — the foundational beat of house, techno, and disco.

Four-on-the-floor: kick drum on every quarter note (beats 1, 2, 3, 4). This is the pulse that defined dance music from disco (1970s) through Chicago house (1980s) to Berlin techno and beyond. The variation comes from what happens BETWEEN the kicks: off-beat hi-hats, claps on 2+4, percussion, and swing.

floor_type: "classic_house" — Chicago/Detroit house: kick on every quarter, open hat on off-beats (the "&" of each beat), clap on 2 and 4. The Frankie Knuckles / Roland TR-909 sound. 1-bar cycle. "deep_house" — Deep house: kick on quarters, shuffled hats, rimshot on 2/4, sparse percussion on the "e" and "a". Soulful swing. Larry Heard / Kerri Chandler style. "techno" — Detroit/Berlin techno: relentless kick on quarters, 16th hats, industrial clap on 2+4, metallic percussion on off-beats. Driving, minimal. Jeff Mills / Surgeson. "disco" — 70s disco: kick on quarters, open hat on off-beats, tambourine 16ths, conga fills. Giorgio Moroder / Donna Summer "I Feel Love" feel. "tech_house" — Tech house fusion: kick on quarters, swung hats, clap on 2/4, occasional vocal-style percussion stabs. Groovy but driving. Solardo / Fisher style.

bars: Pattern length (1-16, 1 = one bar cycle). kick_pitch: MIDI pitch for kick (36 = C1). hat_pitch: MIDI pitch for closed hi-hat (42 = F#1). open_hat_pitch: MIDI pitch for open hi-hat (46 = A#1). clap_pitch: MIDI pitch for clap (39 = D#1). perc_pitch: MIDI pitch for percussion (75 = high wood block / rim). velocity: Base velocity 0-1. Claps -0.05, hats -0.15, open hats -0.1, ghost -0.3.

Returns notes created, floor type, and stroke breakdown.

Example: create_four_on_floor(floor_type="classic_house", track_index=0) create_four_on_floor(floor_type="techno", track_index=1, bars=4)

Inputs: bars, velocity, hat_pitch, clap_pitch, +7 more. Returns: result

mcp_opendaw_create_fugatoA

Create a fugato — a fugal passage with subject entries and imitation.

A fugato is a fugal section (not a full fugue) that features subject entries in imitation: the subject is stated, then answered at a different pitch level, with optional countersubject and episodic material between entries. This is the building block of fugue writing — Bach, Handel, Shostakovich fugato passages.

Unlike create_voice_exchange (transforms existing notes between tracks), fugato generates the entire fugal texture from scratch:

  • Subject: the main theme (custom or auto-generated)

  • Answer: subject restated at answer_interval (real or tonal)

  • Countersubject: a counter-melody against the answer

  • Episode: connecting material between entries (sequenced motives)

Answer modes: real — exact transposition of the subject tonal — adjusted to stay within the key (5th scaled down)

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, etc.). subject_notes: Custom subject as JSON array of [pitch_offset, duration_beats]. If empty, auto-generates a subject. pitch_offset is semitones from root. Example: [[0, 0.5], [2, 0.5], [5, 1.0], [4, 0.5], [2, 0.5], [0, 1.0]] bars: Total length in bars (4-16). octave: Starting MIDI octave (2-6). voices: Number of voices (2-4). answer_interval: Transposition interval for the answer in semitones. Default 7 = perfect fifth (standard fugue answer). answer_mode: Answer type (real or tonal). include_countersubject: If True, generates a countersubject. countersubject_interval: Starting interval of countersubject from answer pitch (semitones, can be negative). include_episode: If True, generates episodic material between entries. episode_bars: Length of episode sections in bars (1-4). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, subject preview, voice entries, and fugato structure.

Inputs: bars, root, scale, octave, +12 more. Returns: result

mcp_opendaw_create_fugueA

Create a fugue — polyphonic composition with subject, answer, and countersubject.

The most complex contrapuntal form. A subject (main theme) is stated in one voice, then imitated in others with a tonal or real answer. Optional countersubject provides contrasting counterpoint. Stretto mode overlaps voice entries for climactic density. Unlike create_canon (strict imitation), a fugue uses tonal answers (adjusted intervals) and independent countersubjects.

subject: Comma-separated MIDI pitches of the fugue subject (e.g. "60,62,64,65"). voices: Number of voices (2-5, default 3). More voices = denser counterpoint. entry_delay_beats: Beats between voice entries (2-8, default 4). answer_type: "tonal" (fifth up, adjusted) or "real" (exact transposition). countersubject: Comma-separated MIDI pitches of countersubject (optional). If empty, no countersubject. Must be same length as subject. key_root: Key root for tonal answer calculation (e.g. "C", "F#", "Bb"). key_mode: "major" or "minor" — affects tonal answer adjustment. note_duration: Note duration as fraction of beat (0-1, default 0.9 = legato). velocity: Base velocity for first voice (0-1, default 0.75). velocity_decay: Velocity reduction per voice (0-0.3, default 0.1). stretto: If true, later voices enter before previous finishes subject. unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the first voice begins.

Returns notes created, voice count, subject length, answer type, stretto status.

Inputs: voices, stretto, subject, key_mode, +10 more. Returns: result

mcp_opendaw_create_full_genre_pipelineA

Create a complete genre track from zero to render-ready in one call.

Full pipeline: setup tracks → arrangement → harmonic layers (optional) → genre mix → mastering chain. One call replaces 5-10 individual tool calls with correct parameters.

Steps performed:

  1. Set BPM to genre-appropriate default

  2. Create a synth track + 4 note tracks

  3. Create regions on all tracks

  4. Call the genre arrangement (rhythm across all tracks)

  5. If progression provided: add harmonic layers (arp + melody on top of genre rhythm; pads/bass skipped since genre already has them)

  6. Apply genre-specific mix (compressor, EQ, saturation, reverb per track)

  7. Apply sidechain (for electronic genres)

  8. Add mastering chain (genre-appropriate LUFS target)

After this call, the project is ready for export_audio / render.

genre: One of: dnb, liquid_dnb, house, trap, techno, dubstep, afrobeat, rock, jazz, pop, funk, reggae, synthwave, trance, disco bpm: Override tempo (None = genre default). bars: Arrangement length (default 8, pop min 16). root: Override key (None = genre default). master_lufs: Mastering target (-14 Spotify, -10 loud, -16 Apple). progression: Chord progression string (e.g. "Am-F-C-G"). If non-empty, adds arp + melody harmonic layers on top of the genre rhythm. Pads and bass are skipped (genre arrangement already has them). Default "" = no harmonic layers (rhythm only). add_counter_melody: If True and progression is set, also adds a counter-melody layer (contrary motion). Default False. add_track_chains: If True, applies genre-appropriate processing chains to each track (drum chain on rhythm tracks, bass chain on bass, instrument chain on melodic). Default False.

Returns complete pipeline status: tracks created, notes per track, effects added, mastering chain, harmonic layers.

Example:

Full DnB track in one call

create_full_genre_pipeline("dnb")

Custom techno

create_full_genre_pipeline("techno", bpm=135, bars=16, master_lufs=-10)

House with harmonic layers

create_full_genre_pipeline("house", progression="Fm-Db-Ab-Eb")

Synthwave with full harmonic quintet

create_full_genre_pipeline("synthwave", progression="Am-F-C-G", add_counter_melody=True)

Inputs: genre (required), bpm, bars, root, +4 more. Returns: result

mcp_opendaw_create_funk_arrangementA

Create a full funk arrangement — funky drummer + slap bass + scratch guitar + horn stabs across 4 tracks.

James Brown / Parliament-Funkadelic style funk — vamp-based, not chord-progression-based:

  • Track 0: Drums — "Funky Drummer" pattern (Clyde Stubblefield, most sampled break in history): syncopated kick with ghost notes, snare with strong ghost accents, hi-hat with 16th-note syncopation. The groove that built hip-hop.

  • Track 1: Bass — slap bass: thumb (root, low) + pluck (octave/fifth, high) alternating, with dead notes (ghost) for percussive attack. The signature Larry Graham technique.

  • Track 2: Guitar — "scratch guitar" / "chank": 16th-note muted strumming on a single chord, with accents on specific 16ths. The rhythmic glue that makes funk tick — Niles Rodgers style.

  • Track 3: Horns — stabs: short, tight horn hits on the "and" of beats, responding to the vocal/instrumental lead. Brown-style section horn hits.

At 100 BPM (default), this creates the classic funk pocket — not too fast, deep in the groove. The vamp (one chord groove, not progression) is the fundamental difference from all other arrangements: pop/rock/jazz change chords, funk stays on one and makes it groove. 16th-note syncopation is the rhythmic DNA — every instrument plays 16ths with different accent patterns.

bpm: Tempo (90-115, default 100 = classic funk pocket). bars: Arrangement length (4-16, default 8). Funk vamps can go long. root: Root note (D is a classic funk key — D minor/D dominant). octave: MIDI octave for bass (2 = D2=38, standard funk bass register). unit_index: AU index with note tracks. drum_track / bass_track / guitar_track / horn_track: Track indices.

Returns notes created per track and total.

Example: create_funk_arrangement(bpm=100, root="D", bars=8) create_funk_arrangement(bpm=108, root="G", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_future_bass_arrangementA

Create a full future bass arrangement — 4 tracks: drums + bass + chords + lead.

Future bass (Flume, San Holo, Illenium, ODESZA) blends electronic production with melodic/emotional sensibility. Key characteristics:

  • 130-160 BPM, often major key (uplifting feel)

  • Pitching snare rolls before drops (rising pitch + velocity crescendo)

  • Big supersaw chords — wide, detuned, layered

  • Sub-bass under chords, syncopated with kicks

  • Vocal chop aesthetic — short rhythmic melodic fragments

  • Sidechain pumping feel

  • Bright, shimmering, nostalgic

Creates 4 tracks:

  1. Drums (drum_track): Punchy kick on 1 and 3, snare on 2 and 4, 16th hats with rolls, and pitching snare roll at end of phrase (8 bars) — simulated by ascending pitch notes.

  2. Bass (bass_track): Sub-bass following chord roots, syncopated gaps, octave drops. Sustained under chords.

  3. Chords (chord_track): Big supersaw-style chords — major 7th / add9 voicings, wide voicings (root/third/seventh/ninth/octave), 2 bars per chord. I-V-vi-IV progression.

  4. Lead (lead_track): Vocal-chop style melodic fragments — short rhythmic notes in major scale, catchy phrases, starts after 4 bars.

bpm: Tempo (120-170, default 150). bars: Arrangement length (4-32, default 8). root: Root note (default C = common future bass key). octave: MIDI octave for chords (3 = C3=48).

Example: create_future_bass_arrangement(bpm=150, root="C", bars=8) create_future_bass_arrangement(bpm=140, root="G", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_garage_arrangementA

Create a UK garage arrangement — 130 BPM 2-step swing.

UK garage (UKG) is a British electronic genre evolving from US garage house with drum & bass influence. Key characteristics:

  • 2-step drum pattern: kick on 1, snare on 2 & 4, skip beats

  • Swing/shuffle feel (16th note swing)

  • Chopped vocal stabs and chord stabs

  • Deep bassline with melodic movement

  • 130-138 BPM, 4/4 time

  • Smooth, bumping, after-hours energy

Creates 4 tracks:

  1. Drums (track_index): 2-step kick (beat 1, sometimes 3), snare on 2 & 4, swung hats, skip-beat ghost notes

  2. Bass (track_index+1): Melodic bassline with octave jumps and syncopation, walking-ish movement

  3. Chords (track_index+2): Stab chords on offbeats, major 7th and minor 9th voicings, Rhodes-style

  4. Lead (track_index+3): Vocal-chop-style melodic stabs, short rhythmic phrases

Default key: G minor (common UKG key).

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_genre_sectionsA

Create a multi-section electronic track from loop-based arrangements — intro → buildup → drop → breakdown → outro.

Transforms loop-based arrangements into song structure. Each section is a separate arrangement call with different start_beat and velocity, creating dynamic energy progression. For electronic genres only (dnb/house/techno/ trance/dubstep/synthwave/trap/disco).

Section energy progression:

  • Intro (bars 0-N): drums only (kick + hat), no bass/melody. velocity * 0.5. Builds anticipation. Sparse and atmospheric.

  • Buildup (bars N-2N): drums + bass, no harmony/melody. velocity * 0.7. Energy rising, groove established.

  • Drop (bars 2N-3N): ALL tracks at full velocity. The climax — full arrangement with maximum energy. This is where the hook hits.

  • Breakdown (bars 3N-4N): harmony + melody only, no drums/bass. velocity * 0.6. Pull back, breathe, create contrast before final drop.

  • Outro (bars 4N-5N): drums + bass fading. velocity * 0.4. Wind down.

section_lengths: Comma-separated bar counts for each section. Default "4,8,8,8,4" = intro(4) + buildup(8) + drop(8) + breakdown(8) + outro(4) = 32 bars total. For a shorter track: "2,4,8,4,2" = 20 bars. For a longer track: "8,16,16,16,8" = 64 bars.

genre: Electronic genre only: dnb, house, techno, trance, dubstep, synthwave, trap, disco bpm: Override tempo (None = genre default). root: Override key (None = genre default). section_lengths: Comma-separated bar counts (5 sections, must sum to multiple of 4).

Returns sections created, notes per section, total notes, and energy profile.

Example:

32-bar DnB track with song structure

create_genre_sections("dnb", section_lengths="4,8,8,8,4")

64-bar trance epic

create_genre_sections("trance", section_lengths="8,16,16,16,8")

Inputs: genre (required), bpm, root, bass_track, +5 more. Returns: result

mcp_opendaw_create_genre_trackA

Create a genre-specific starting track with synth, beat, and basic mix — one call builds a full section.

genre: Musical genre preset:

  • "house" — 4/4 kick, offbeat hat, stab bass, 128 BPM

  • "techno" — driving kick, ride hat, acid bass, 130 BPM

  • "lofi" — swing kick/snare, soft keys, 80 BPM

  • "dnb" — breakbeat drums, sub bass, 174 BPM

  • "trap" — 808 kick, hat rolls, melodic lead, 140 BPM

  • "ambient" — pad chord, no drums, 70 BPM

  • "coldwave" — driving kick, dark bass, 110 BPM

  • "hiphop" — boom bap kick/snare, 90 BPM

bpm: Override tempo (default per genre).

Returns created AU indices, note counts, and suggested next steps.

Inputs: genre (required), bpm. Returns: result

mcp_opendaw_create_ghost_notesA

Add ghost notes (quiet grace notes) to existing drum/MIDI patterns.

Ghost notes are very quiet notes placed between main hits, adding groove and complexity. Essential for funk, R&B, neo-soul, and hip-hop drumming. They fill spaces between snare/kick hits with subtle taps that make the beat feel alive.

Inserts new low-velocity notes at off-beat positions where no notes currently exist. Works on the first note track of the specified AU/track.

unit_index: AU index. track_index: Note track index (-1 = first note track). region_index: Region index (-1 = first region). density: Probability of adding a ghost note at each empty 16th position (0.2 = sparse, 0.5 = busy). velocity: Ghost note velocity 0-1 (0.25 = very quiet, 0.4 = audible). seed: Random seed for reproducibility.

Returns number of ghost notes added and positions.

Example: create_ghost_notes(unit_index=0, density=0.35, velocity=0.3, seed=99)

Inputs: seed, density, velocity, unit_index, +2 more. Returns: result

mcp_opendaw_create_glissandoA

Create a glissando — smooth scale run between two pitches.

A continuous-sounding slide through intermediate pitches. Unlike riser/bass_drop (which are pitch sweeps), glissando plays every intermediate note at a fixed rate, creating a true scale run feel. Works chromatically (every semitone) or diatonically (scale tones only) or pentatonically.

start_pitch: Starting MIDI note (default 60 = C4). end_pitch: Ending MIDI note (default 72 = C5). Can be higher or lower. scale_type: "chromatic" (every semitone), "major" (diatonic major scale), "minor" (natural minor), "pentatonic_minor", "pentatonic_major", "whole_tone". duration_beats: Total duration in beats (0.5-16, default 2). rate: Note rate — "32nd", "16th", "8th", "32t", "16t". velocity: Base velocity 0-1 (default 0.8). velocity_curve: "flat" (constant), "ramp_up" (crescendo into landing), "ramp_down" (decrescendo), "arc" (peak in middle). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the glissando begins.

Returns notes created, pitch list, scale type.

Inputs: rate, velocity, end_pitch, scale_type, +6 more. Returns: result

mcp_opendaw_create_gospel_arrangementA

Create a full gospel arrangement — shuffle drums + walking bass + Hammond organ + choir.

Gospel music — the foundation of soul, R&B, and modern pop:

  • Track 0: Drums — gospel shuffle. Kick on 1, snare on 2+4 with ghost notes, hi-hats with triplet shuffle feel. The "pocket" is deep — slightly behind the beat. Dynamics are expressive.

  • Track 1: Bass — walking bass line through I-IV-V-I progression. Root → 3rd → 5th → approach note. Warm, supportive.

  • Track 2: Hammond B3 organ — chord stabs with Leslie rotation feel. Triadic voicings, 2nd inversion common. The Hammond is the signature sound of gospel — drawbar harmonics.

  • Track 3: Choir — sustained SATB voicings. Call-and-response with organ. Long notes, rich harmony, the "church" sound.

Ab major default — flat keys are traditional for gospel singers. I-IV-V-I progression (Ab-Db-Eb-Ab) with passing diminished approach. 6/8 or 4/4 at 70-85 BPM (slow groove).

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_ground_bassA

Create a ground bass — a repeating ostinato bass line with optional melody.

The ground bass (basso ostinato) is one of the oldest composition techniques: a short bass pattern repeats throughout the piece while melodies above it change and develop. Used in baroque (Purcell's Dido's Lament, Bach's Crucifixus), chaconne/passacaglia tradition, jazz modal vamps, and film scoring (repeating tension ostinati).

Unlike passacaglia (which generates variations above the bass), ground_bass creates the pure repeating bass ostinato + a melody line that develops over the repetitions. The melody changes character per repetition cycle.

melody_styles: "baroque" — Stepwise descending lines over the ground. chromatic passing tones, suspensions on strong beats. Purcell/Bach style. Melody descends gradually across repetitions. "modal" — Modal jazz vamp style. Long sustained notes, sparse placement, emphasis on chord tones. Miles Davis / Kind of Blue aesthetic. Melody floats above the bass. "minimalist" — Steve Reich / Philip Glass style. Phase-shifted melodic fragments, repetitive cells, gradual transformation. Melody uses small intervals and repeating patterns. "film_tension" — Dark film scoring style. Minor 2nd and tritone intervals, dissonant suspensions, gradual crescendo. Melody builds tension across repetitions. "folk" — Strophic folk variation style. Pentatonic-leaning melody, simple rhythmic values, phrase repetition with slight variation. Celtic / English folk tradition.

Args: bass_pattern: Space-separated bass notes (e.g. "A2 E2 C2 G2"). Can use note names (A2, C3) or MIDI numbers (45, 52). bass_rhythm: Space-separated durations in beats for each bass note (e.g. "2 2 2 2" = 4 notes each lasting 2 beats = 8-beat cycle). repeats: Number of bass repetitions (2-32). melody_style: Melody character above the ground. unit_index: AU index. track_index: Note track index (bass goes here, melody on track_index+1). start_beat: Starting beat position. velocity: Base velocity 0-1.

Returns bass notes created, melody notes, cycle info, and style.

Inputs: repeats, velocity, start_beat, unit_index, +4 more. Returns: result

mcp_opendaw_create_hardstyle_arrangementB

Create a hardstyle arrangement — 150 BPM festival hard dance.

Hardstyle is a Dutch electronic dance genre characterized by:

  • Hard, distorted kick drum with a pitched tail (the signature sound)

  • Reverse bass (off-beat bass that "reverses" the kick pattern)

  • Screechy/sawtooth lead synth with wide unison

  • 150 BPM, 4/4 time

  • Aggressive, festival/headbanger energy

Creates 4 tracks:

  1. Drums (track_index): Hard kick on every beat, snare on 2&4, closed hats on offbeats, open hat occasionally

  2. Bass (track_index+1): Reverse bass pattern — bass on offbeats between kicks, creating the signature "boom-BM-boom-BM" feel

  3. Lead (track_index+2): Screechy sawtooth lead playing a minor melody with wide intervals and octave jumps

  4. Chords (track_index+3): Stab chords on beat 1 and 3, minor key

Default key: F minor (common hardstyle key).

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_harmonic_arrangementA

Create all five harmonic layers from one progression string in one call.

Replaces 5 separate calls (chord_pads + arpeggiated_progression + bass_from_progression + melody_from_progression + counter_melody_from_progression) with a single call. All layers take the same "Am-F-C-G" progression and are placed on separate tracks: pads (track 2), arp (track 3), bass (track 1), melody (track 3 or 4), counter-melody (track 4 or 5).

By default arp and melody share track 3 (melody track). Set melody_pattern to "" to skip melody, arp_pattern to "" to skip arp, bass_pattern to "" to skip bass, pad_octave to -1 to skip pads, counter_melody_pattern to "" to skip counter-melody (default).

progression: Hyphen-separated chords (same format as the quartet tools). pad_octave: Octave for chord pads (default 3). arp_pattern: Arp pattern: up/down/updown/random/bass, or "" to skip. arp_octave: Octave for arp (default 4). arp_step: Arp step duration in beats (default 0.25 = 16th). bass_pattern: Bass pattern: root/root_fifth/walking/pedal/octave/root_octave. bass_octave: Octave for bass (default 2). melody_pattern: Melody pattern: chord_tones/sustained/syncopated/triadic/stepwise. melody_octave: Octave for melody (default 5). counter_melody_pattern: Counter-melody pattern: contrary/oblique/parallel_third/ parallel_sixth/call_response, or "" to skip (default ""). counter_melody_octave: Octave for counter-melody (default 4). bars_per_chord: Bars per chord (default 4). velocity: Base velocity for all layers (0-1).

Example:

Full synthwave harmonic arrangement in one call

create_harmonic_arrangement("Am-F-C-G", arp_pattern="up", bass_pattern="root", melody_pattern="chord_tones")

Jazz: walking bass + sustained pads, skip arp

create_harmonic_arrangement("Dm7-G7-Cmaj7-Am7", arp_pattern="", bass_pattern="walking", melody_pattern="sustained", bars_per_chord=2)

House: pedal sub-bass + pads, skip melody

create_harmonic_arrangement("Fm-Fm-Db-Ab", arp_pattern="bass", bass_pattern="pedal", bass_octave=1, melody_pattern="", pad_octave=3)

Full quintet with counter-melody

create_harmonic_arrangement("Am-F-C-G", arp_pattern="up", bass_pattern="root", melody_pattern="chord_tones", counter_melody_pattern="contrary")

Inputs: arp_step, velocity, arp_octave, pad_octave, +11 more. Returns: result

mcp_opendaw_create_harmonyA

Generate harmony parts from existing notes — thirds, fifths, sixths, octaves.

Reads notes from an existing region and creates harmonized copies at a fixed interval. Supports diatonic (scale-aware) and chromatic (fixed semitone) intervals. Output goes to a new or existing track.

unit_index: Source AU index. track_index: Source note track index. region_index: Source region index. interval: Harmony interval type:

  • "thirds" — diatonic third above/below (3rd scale degree)

  • "fifths" — diatonic fifth (5th scale degree)

  • "sixths" — diatonic sixth (6th scale degree)

  • "octave" — octave up/down (12 semitones)

  • "fifth_chromatic" — perfect fifth (7 semitones, fixed)

  • "fourth_chromatic" — perfect fourth (5 semitones, fixed)

  • "third_major" — major third (4 semitones, fixed)

  • "third_minor" — minor third (3 semitones, fixed) direction: "up" or "down" (harmony above or below the melody). new_unit_index: Target AU index (-1 = create new synth track for harmony). new_track_index: Target note track index on the target AU. velocity: Velocity for harmony notes (default 0.65, slightly quieter than melody).

Returns source notes read and harmony notes created.

Inputs: unit_index (required), interval, velocity, direction, +4 more. Returns: result

mcp_opendaw_create_harmony_lineA

Create a harmony line from an existing melody using diatonic intervals.

Reads notes from a source melody and creates a parallel harmony line at a specified diatonic interval. The harmony stays in key — each note is shifted by N scale steps (not semitones), producing consonant harmony automatically.

Harmony intervals (diatonic):

  • third: +2 scale steps — the most common harmony (Lennon-McCartney, Everly Brothers, country duets). Sweet and consonant.

  • sixth: +5 scale steps — wider, jazzier. Creates open, airy harmony.

  • fifth: +4 scale steps — power harmony, medieval/organum sound.

  • fourth: +3 scale steps — suspended, ambiguous. Gregorian/modal.

  • octave: +7 scale steps (or -7) — doubling, not true harmony but useful for layering.

Essential for: vocal harmonies, string pads behind melody, guitar harmonies, counter-melody foundation, thickening lead lines.

source_unit/track/region: Location of the source melody. target_unit/track/region: Where to write the harmony. -1 = create new track/region automatically. interval: third, sixth, fifth, fourth, octave. root_note + scale: The key for diatonic interval calculation. The harmony notes are guaranteed to be in this scale. direction: "above" or "below" — place harmony above or below the melody. velocity_scale: Multiply source velocities by this (default 0.8 = harmony slightly quieter than melody).

Returns the created harmony notes.

Inputs: scale, interval, direction, root_note, +7 more. Returns: result

mcp_opendaw_create_hemiolaA

Create a hemiola — 3:2 rhythmic displacement creating cross-rhythm illusion.

A hemiola superimposes a 3-note grouping over a 2-note grouping (or vice versa) within the same time span, creating the illusion of a different meter. The classic 3-against-2 pattern is fundamental to West African, Afro-Cuban, jazz, and minimalist music. Brahms, Bernstein, and Glass used it extensively.

The pattern string defines which beats get primary vs secondary emphasis: "3:2" — 3 primary notes in the time of 2 secondary (classic hemiola) "2:3" — 2 primary notes in the time of 3 secondary (inverse hemiola)

Creates notes on a single track: primary group uses primary_pitch, secondary group uses secondary_pitch. Both span the same total duration.

pattern: "3:2" (3 against 2) or "2:3" (2 against 3). bars: Total length in bars (1-4). Each bar = 4 beats. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. primary_pitch: MIDI pitch for primary group (default 60 = C4). secondary_pitch: MIDI pitch for secondary group (default 64 = E4). primary_velocity: Velocity for primary notes 0-1. secondary_velocity: Velocity for secondary notes 0-1. duration: Note duration in beats.

Returns total notes created and hemiola ratio.

Example: create_hemiola(pattern="3:2", bars=2, primary_pitch=60, secondary_pitch=67)

Inputs: pattern (required), bars, duration, start_beat, +6 more. Returns: result

mcp_opendaw_create_hocketA

Create a hocket — single melodic line split between voices/tracks.

Hocket (from Latin "hoquet" = hiccup) is a technique where a single melody is divided between two or more voices. Each voice plays only every other (or every Nth) note, creating an interlocking texture. Found in medieval polyphony (Notre Dame school), African mbira music, Balinese gamelan, and modern minimalist composition (Steve Reich).

melody: Comma-separated MIDI pitches forming the complete melodic line. voices: Number of voices to split between (2-4, default 2). split_mode: How notes are distributed: "alternate" — round-robin (note 0→voice 0, note 1→voice 1, ...) "pairs" — pairs of notes per voice (2 per voice, then switch) "phrase" — 4-note phrases per voice unit_index: AU index with note tracks (-1 = find AU with enough note tracks). track_index: Starting note track index (uses consecutive tracks for voices). start_beat: Position in beats where the hocket begins. note_duration: Duration of each note in beats (default 0.5 = eighth notes). velocity: Velocity of all notes (0-1, default 0.7).

Returns notes created, voice assignment, total duration.

Inputs: melody, voices, velocity, split_mode, +4 more. Returns: result

mcp_opendaw_create_house_arrangementA

Create a full house music arrangement — drums + bass + stabs across 3 tracks in one call.

House music arrangement with all elements locked together:

  • Track 0: Drums — four-on-the-floor kick, open hats on off-beats, clap on 2+4

  • Track 1: Bass — off-beat sustained bass between kicks

  • Track 2: Stabs — short minor chord stabs on beats 1 and 3, with occasional off-beat stabs

At 124 BPM (default), this creates the classic Chicago/Detroit house feel. The bass and drums lock — bass hits exactly between kicks, creating the "untz-untz" groove. Stabs provide harmonic movement on top.

bpm: Tempo (115-135, default 124 = classic house). bars: Arrangement length (4-32, default 8). root: Root note for bass and stabs. octave: MIDI octave for bass (2 = C2=36). unit_index: AU index with note tracks. drum_track / bass_track / stab_track: Track indices.

Returns notes created per track and total.

Example: create_house_arrangement(bpm=124, root="C", bars=8) create_house_arrangement(bpm=128, root="F#", bars=16)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_impactA

Create an impact — single hit transition element for drops and section changes.

Generates a single sustained note with type-specific pitch, duration, and velocity. Essential for EDM transitions: the "hit" that lands after a riser/build-up.

impact_type: Type of impact:

  • "sub_boom" — deep sub bass hit (C1, long decay, dark)

  • "impact_hit" — mid-range punch (C3, medium decay, aggressive)

  • "downlifter" — descending pitch from high to low (glissando fall)

  • "sub_drop" — lowest sub with long tail (B0, very long, cinematic)

  • "punch" — short bright hit (C5, short decay, snappy)

unit_index: AU index (-1 = find first AU with note tracks). track_index: Note track index. start_beat: Position in beats where the impact lands. pitch: Base MIDI pitch (default 36 = C2, overridden by type). length_beats: Duration in beats (default 4 = one bar). velocity: Hit velocity (0-1, default 0.9 = loud).

Returns notes created and impact parameters.

Example:

Sub boom on the downbeat

create_impact(start_beat=0, impact_type="sub_boom")

Downlifter after riser

create_impact(start_beat=4, impact_type="downlifter", length_beats=2)

Inputs: pitch, velocity, start_beat, unit_index, +3 more. Returns: result

mcp_opendaw_create_instrument_trackA

Create a new instrument audio unit with a Tape device and an audio track.

This is required for audio playback — the Tape device reads audio regions and outputs sound. The instrument AU is connected to the output AU's bus.

name: Display name for the instrument (default "Tape"). Returns the unit_index and track_index for use with place_audio_region.

Inputs: name (required). Returns: result

mcp_opendaw_create_irish_tradA

Create an Irish traditional music accompaniment — bodhrán + feet for session tunes.

Irish traditional music (trad) is defined by its tune types, each with a characteristic meter and feel. The bodhrán (frame drum) and feet stomp provide the rhythmic foundation in a session. Unlike most percussion patterns, Irish accompaniment is minimal — the rhythm is carried by the melody's phrasing, and the bodhrán supports rather than drives.

tune types: "reel" — 4/4, straight 8th notes. The most common tune type. Bodhrán: downbeat + offbeat pattern. 4 beats per bar. 2 bars per phrase (AA pattern). Bright, driving. "jig" — 6/8, triplet feel. Groups of 3 eighth notes. Bodhrán: accent on beat 1 and 4 (the two downbeats of 6/8). 2 bars per phrase. Lilting, rolling feel. "hornpipe" — 4/4, dotted rhythm. 8ths are swung (long-short). Bodhrán: similar to reel but with swung feel. 2 bars per phrase. Bouncy, maritime feel. "slip_jig" — 9/8, triplet feel in 3 groups of 3. Rare, ethereal. Bodhrán: accent on 1, 4, 7. 2 bars per phrase. Dancing on air, Turlough O'Carolan style. "polka" — 2/4, fast and punchy. Common in Kerry/Sliabh Luachra. Bodhrán: strong 1 and 2. Simple, driving. 2 bars per phrase. Fast dance, march-like. "slide" — 12/8, similar to jig but faster and longer groups. Bodhrán: accent on 1, 4, 7, 10. 2 bars per phrase. Sliabh Luachra region. Fast, lilting.

Args: tune_type: Tune type (reel, jig, hornpipe, slip_jig, polka, slide). bars: Number of bars (4-32, even). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. bodhran_pitch: Bodhrán (frame drum) MIDI pitch (36 = C1). feet_pitch: Feet stomp MIDI pitch (40 = E1). hh_pitch: Hi-hat/brush MIDI pitch (42 = F#1).

Returns notes created, tune type info, meter, and pattern breakdown.

Inputs: bars, hh_pitch, velocity, tune_type, +5 more. Returns: result

mcp_opendaw_create_isorhythmA

Create an isorhythm — repeating rhythm (talea) × repeating pitch series (color).

Isorhythm separates rhythm and pitch into two independent cycles. The talea (rhythmic pattern) and color (pitch series) repeat independently, creating constantly shifting relationships as they go in and out of phase. When talea and color have different lengths, the pattern doesn't fully repeat until the least common multiple of both lengths.

Found in medieval motets (Machaut), and heavily influenced 20th-century composers — Messiaen, Boulez, Stockhausen. Distinct from ostinato, which repeats rhythm and pitch together as one unit.

talea: Comma-separated note durations in beats (the repeating rhythm). e.g. "1,1,0.5,0.5,1" = quarter, quarter, eighth, eighth, quarter. color: Comma-separated MIDI pitches (the repeating pitch series). e.g. "60,62,64,65" = C,D,E,F cycling independently of rhythm. repeats: Number of full talea cycles (1-16, default 3). velocity: Velocity of all notes (0-1, default 0.7). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the isorhythm begins.

Returns notes created, talea/color lengths, phase cycle length, total duration.

Inputs: color, talea, repeats, velocity, +3 more. Returns: result

mcp_opendaw_create_jazz_arrangementA

Create a full jazz arrangement — swing drums + walking bass + comping piano + horn across 4 tracks.

Jazz with swing feel and ii-V-I harmony — fundamentally different from all other arrangements:

  • Track 0: Drums — swing ride pattern (spang-a-lang), brush snare ghost notes, comping on bass drum. The signature jazz ride cymbal pattern with swung 8th notes — the triplet feel that defines jazz.

  • Track 1: Bass — walking bass: quarter notes that walk through the chord changes using chord tones and approach notes. ii-V-I aware, creating smooth voice leading through the changes.

  • Track 2: Piano — comping: syncopated chord stabs using shell voicings (root + third + seventh) and rootless voicings. Frequent rests — comping is about space as much as notes.

  • Track 3: Horn — lead melody: a simple bluesy head over the changes, using blue notes (flatted thirds and fifths) and swing.

At 120 BPM (default), this creates a medium-up swing feel. The ii-V-I progression is the fundamental jazz chord change — every other genre uses different harmony. Swing 8ths (triplet feel) is the rhythmic signature that separates jazz from all straight-time genres.

bpm: Tempo (60-200, default 120 = medium swing). bars: Arrangement length (4-32, default 8). Jazz benefits from longer forms. root: Root note (F is a classic jazz key — great for horns). octave: MIDI octave for bass (2 = F2=41, standard jazz bass register). unit_index: AU index with note tracks. drum_track / bass_track / piano_track / horn_track: Track indices.

Returns notes created per track and total.

Example: create_jazz_arrangement(bpm=120, root="F", bars=8) create_jazz_arrangement(bpm=180, root="Bb", bars=12)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_konokolB

Create Indian Carnatic konokol (solkattu) — vocal percussion as MIDI.

Konokol (also spelled konnakkol) is the South Indian art of vocal percussion. Syllables represent rhythmic patterns: ta, ka, di, mi, thom, nam, ghu, dhi, khatam. Each syllable maps to a specific drum sound. This is the rhythmic foundation of all Carnatic music.

Styles (tala structures):

  • adi_tala: 8-beat cycle (most common). Structure: 4+2+2. Syllables: ta-ka-dhi-mi ta-ka-dhi-mi ta-ka-ta-ka. The foundational tala of Carnatic music.

  • roopaka_tala: 6-beat cycle (3/4). Structure: 3+3. Syllables: ta-ka-dhi ta-ka-dhi-mi. Used in lighter compositions, varnams.

  • khanda_chapu: 5-beat cycle. Structure: 2+3. Syllables: ta-ka ta-ka-ta. Asymmetric, flowing feel. Common in kritis.

  • mishra_chapu: 7-beat cycle. Structure: 3+2+2. Syllables: ta-ki-ta ta-ka ta-ka. Lyrical, song-like rhythm. Used in padams.

  • triputa_tala: 7-beat cycle (3+2+2 variant). Syllables: ta-ka-dhi-mi ta-ka ta. Alternative 7-beat structure.

  • jhampa_tala: 10-beat cycle. Structure: 4+2+4. Syllables: ta-ka-dhi-mi ta-ka ta-ka-dhi-mi. Used in javalis and tillanas.

GM percussion mapping (Indian fusion approach): 36 (kick) → thom, ghu (bass drum — low/open tones) 38 (snare) → nam, dhi (sharp, crisp) 42 (closed hat) → ta, ka (high, crisp) 43 (high floor tom) → mi (mid) 45 (low tom) → khatam (rolled)

Creates konokol notes on track_index. Includes syllable text in the result for reference.

Inputs: style, cycles, velocity, tempo_bpm, +3 more. Returns: result

mcp_opendaw_create_korean_percussionA

Create a Korean traditional percussion ensemble — nongak (farmers' music).

Korean percussion (samul nori / nongak) uses four instruments representing weather elements:

  1. JANGGU — Hourglass drum with two heads: chwe (left, low, deep) and kyeongbang (right, high, sharp). The most versatile Korean drum. Plays complex interlocking patterns with both hands simultaneously.

  2. BUK — Barrel drum. Deep bass tone. Plays steady downbeats.

  3. KKWAENGGWARI — Small hand gong. High, piercing metallic. The lead instrument — player (sangsoe) calls patterns and signals changes.

  4. JING — Large gong. Deep, resonant, sustained. Plays sparse accents to mark phrase boundaries.

The four instruments represent: janggu = rain, buk = clouds, kkwaenggwari = thunder, jing = wind (lightning in some traditions).

styles: "nongak" — Farmers' music (rural tradition). Steady, driving. Janggu plays the basic nanajanggu pattern (alternating chwe/kyeong on 8th grid). Buk on downbeats. Kkwaenggwari on offbeats with accented calls. Jing on phrase starts. "samul_nori" — Modern stage version (1978, Kim Duk-soo). Faster, denser, more dramatic. Janggu plays 16th patterns with ghost notes. Kkwaenggwari has call-and-response. "binari" — Ritual/shaman opening piece. Slow, ceremonial. Long jing resonance. Sparse janggu. Kkwaenggwari calls. Builds from near silence. "utdari_pungnyu" — Court music style (upper register). Elegant, refined. Buk steady, janggu delicate 8ths, kkwaenggwari sparse. Jing on every 4 bars. "yeongnam_folk" — Yeongnam region folk style (Gyeongsang). Rough, energetic. Buk on 1+3, janggu syncopated, kkwaenggwari dense. Working-class feel.

Args: bars: Pattern length (4-32, even). style: Style name (nongak, samul_nori, binari, utdari_pungnyu, yeongnam_folk). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. janggu_chwe_pitch: Janggu left head (low) MIDI pitch (35 = B0). janggu_kyong_pitch: Janggu right head (high) MIDI pitch (42 = F#1). buk_pitch: Buk (barrel drum) MIDI pitch (36 = C1). kkwaenggwari_pitch: Kkwaenggwari (small gong) MIDI pitch (54 = G#1). jing_pitch: Jing (large gong) MIDI pitch (48 = C2).

Returns notes created, instrument breakdown, and style info.

Inputs: bars, style, velocity, buk_pitch, +7 more. Returns: result

mcp_opendaw_create_liquid_dnb_arrangementB

Create a full liquid drum & bass arrangement across 4 tracks.

Liquid DnB is the smooth, melodic cousin of DnB. Instead of Reese bass and Amen breakbeat fury, liquid uses:

  • Track 0: Smooth breakbeat (gentler ghost notes, more flowing hats)

  • Track 1: Melodic sub-bass (jazzy movement, not just root stabs)

  • Track 2: Lush extended chords (maj7/min9, not plain triads)

  • Track 3: Soulful jazz-influenced lead melody

Think LTJ Bukem, Calibre, High Contrast, Hospital Records.

bpm: Tempo (160-185, default 174). bars: Arrangement length (4-32, default 8). root: Root note (default F = classic liquid key). octave: Bass octave (2 = sub-bass range). velocity: Base velocity (default 0.75 = smoother than DnB's 0.85).

Example: create_liquid_dnb_arrangement(bpm=174, root="F", bars=8) create_liquid_dnb_arrangement(bpm=170, root="Am", bars=16, velocity=0.7)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_lofi_arrangementA

Create a full lofi hip-hop arrangement — boom-bap drums + jazzy chords + mellow bass + sleepy melody.

Lofi hip-hop (Nujabes / J Dilla / chillhop) — warm, dusty, mellow:

  • Track 0: Drums — boom-bap: kick on 1 and "and-a" of 2, snare on 2 and 4, laid-back 16th hi-hat with swing. No rush — behind the beat. Vinyl crackle character (lower velocity, humanized).

  • Track 1: Bass — mellow root notes with occasional octave/fifth walks. Long, sustained, warm. No aggression.

  • Track 2: Chords — jazzy 7th/9th voicings (maj7, min9, dom9) with soft attacks and gentle arpeggiation. The harmonic signature of lofi: extended chords, not triads.

  • Track 3: Melody — sparse, sleepy pentatonic phrases. Long notes, space between phrases. The "nodding off" quality.

At 78 BPM (default), this creates the classic chillhop pocket — slow, warm, behind-the-beat. ii-V-I jazz-influenced harmony (Dm7-G7-Cmaj7 in F major) gives that nostalgic, bittersweet quality.

bpm: Tempo (70-90, default 78 = chillhop sweet spot). bars: Arrangement length (4-16, default 8). root: Root note (F is a classic lofi key — warm, midrange). octave: MIDI octave for bass (3 = F3=53, warm lofi bass). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / melody_track: Track indices.

Returns notes created per track and total.

Example: create_lofi_arrangement(bpm=78, root="F", bars=8) create_lofi_arrangement(bpm=82, root="D", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_l_system_melodyA

Create a melody using an L-system (Lindenmayer system) — a deterministic rewriting system.

L-systems generate self-similar, fractal patterns through recursive production rules. Each symbol in the expanded string maps to a scale step interval. The cumulative sum of intervals determines the melodic contour.

Unlike Markov chains (stochastic, memory-based) or random walk (zero-order), L-systems are fully deterministic — same axiom + rules + iterations always produce the same melody. This makes them ideal for:

  • Self-similar melodic structures (fractal music)

  • Deterministic generative composition

  • Algorithmic music based on mathematical systems

Presets: fibonacci — Fibonacci word (A->AB, B->A), golden ratio self-similarity cantor — Cantor set (A->ABA, B->BBB), gaps and self-similar structure dragon — Dragon curve (A->A+B, B->A-B), jagged contour koch — Koch snowflake (A->A+A-A-A+A), angular melody sierpinski — Sierpinski triangle (A->BA, B->BA), binary pattern

Custom: provide axiom, rules (JSON), and symbol_map (JSON) to define your own L-system.

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, phrygian, lydian, mixolydian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues). bars: Number of bars (1-32). octave: Starting MIDI octave (1-6). preset: Preset name (fibonacci, cantor, dragon, koch, sierpinski). axiom: Custom axiom string (overrides preset). rules: Custom rules as JSON {"A": "AB", "B": "A"}. symbol_map: Custom symbol-to-interval map as JSON {"A": 1, "B": -1}. iterations: Number of rule applications (1-8). Higher = more complex. duration: Note duration in beats (0.0625-4.0). velocity: Base velocity 0-1. rest_symbol: Symbol that produces a rest (skip note, advance position). unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, L-system string length, and fractal statistics.

Inputs: bars, root, axiom, rules, +11 more. Returns: result

mcp_opendaw_create_markov_melodyA

Create a melody using a Markov chain over scale-degree intervals.

First-order (or higher) Markov chain: the next interval depends on the current (or previous N) interval(s) via a transition probability matrix. This produces melodies with stylistic memory — the interval patterns characteristic of a genre or composer emerge naturally.

Unlike random_walk (zero-order: each step independent of history), Markov chains capture interval-to-interval tendencies:

  • A small ascending interval tends to be followed by another small one

  • A large leap tends to be followed by a step back (regression to mean)

  • Specific interval sequences define melodic "style"

The transition matrix can be:

  • Default: built-in weights favoring smooth motion (steps > skips > leaps)

  • Custom: user-provided interval weights as JSON

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, phrygian, lydian, mixolydian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues). bars: Number of bars (1-32). octave: Starting MIDI octave (1-6). order: Markov chain order (1 or 2). Order 1 = depends on current interval. Order 2 = depends on last 2 intervals. interval_weights: JSON string of custom transition weights. If empty, uses built-in weights. Format for order 1: {"-3": {"-3": 0.1, "-2": 0.2, "-1": 0.3, "0": 0.1, "1": 0.2, "2": 0.1}, "-2": {...}, ...} Keys are interval sizes (-7 to +7 scale steps). duration: Note duration in beats (0.0625-4.0). velocity: Base velocity 0-1. seed: PRNG seed for reproducibility. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, transition statistics, and seed.

Inputs: bars, root, seed, order, +8 more. Returns: result

mcp_opendaw_create_melodic_polyrhythmA

Create a polyrhythm — N notes evenly spaced across M beats.

A polyrhythm places numerator notes evenly across denominator beats, creating cross-rhythms against the main pulse. 3:4 = triplet feel, 5:4 = quintuplet, 7:4 = septuplet, 3:2 = half-note triplets.

The notes ascend or descend through the specified scale, creating a melodic polyrhythm rather than just rhythmic hits. This is the foundation of jazz cross-rhythm, prog-rock metric modulation, African cross-pulse, and contemporary classical writing.

Args: unit_index: Audio unit index track_index: Note track index numerator: Number of notes to fit across denominator beats (2-9, default 3). This is the "against" number. denominator: Number of beats to span (2-8, default 4). This is the "base" pulse. bars: Number of times to repeat the polyrhythm cycle (1-8, default 1). pitches: Comma-separated MIDI pitches for custom note selection. If provided, overrides scale-direction generation. Notes cycle through this list. velocity: Base velocity (0-1, default 0.8) velocity_pattern: Velocity across the polyrhythm — "constant": same velocity "accent": accent first note of each cycle "fade": linear fade across all notes "wave": sine wave velocity pattern start_beat: Position in beats where polyrhythm starts (default 0.0) direction: Pitch direction when using scale generation — "up": ascending through scale "down": descending through scale "alternate": up then down per cycle scale: Scale for pitch generation ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues", "chromatic") root: Root note for scale (C, C#, D, ... B)

Inputs: unit_index (required), track_index (required), bars, root, +8 more. Returns: result

mcp_opendaw_create_melodyA

Create a melody from a scale and rhythmic pattern — one call instead of 10-30 create_note calls.

scale: Scale type (major, minor, harmonic_minor, melodic_minor, dorian, phrygian, lydian, mixolydian, locrian, pentatonic_major, pentatonic_minor, blues, chromatic). root: Root note name (C, C#, D, D#, E, F, F#, G, G#, A, A#, B or flats Db, Eb, Gb, Ab, Bb). pattern: Rhythmic pattern using scale degrees. Each step is one 16th note:

  • Numbers 1-7 (or 1-5 for pentatonic, 1-6 for blues) = scale degree (1 = root)

  • 0 = rest

  • '-' = sustain previous note (tie)

  • '+' = octave up for this note

  • Example: "1-2-3-5-4-3-2-1" = ascending then descending scale fragment

  • Example: "1 0 3 0 5 0 3 0" = arpeggio with rests unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the melody starts (0 = bar 1). octave: MIDI octave for the root (4 = C4=60, the middle C). velocity: Note velocity 0-1 (default 0.75).

Returns the total notes created and pitches used.

Inputs: root (required), scale (required), pattern (required), octave, +4 more. Returns: result

mcp_opendaw_create_melody_from_progressionA

Create a lead melody from a chord progression string.

Completes the harmonic quartet: create_chord_pads (sustained harmony) + create_arpeggiated_progression (arp movement) + create_bass_from_progression (bass foundation) + THIS (lead melody). All four take the same "Am-F-C-G" string.

The melody hits chord tones on strong beats (1, 3) and uses passing tones or neighbor tones on weak beats (2, 4) for melodic interest.

pattern: Melodic pattern: "chord_tones" — root/third/fifth on beats 1+3, passing tone on 2+4 "sustained" — one chord tone per bar, held for full bar (ballad) "syncopated" — 8th notes, chord tones on downbeats, passing on ups "triadic" — arpeggiated 8ths through chord tones (folk, country) "stepwise" — scale steps between chord tones (pop, classical)

bars_per_chord: Bars per chord (default 4). octave: MIDI octave for melody (5 = C5=72, typical lead range). velocity: Note velocity (0-1, default 0.75). track_index: Track for melody (typically melody track = 3).

Example:

Pop lead from I-V-vi-IV

create_melody_from_progression("C-G-Am-F", pattern="chord_tones", octave=5, track_index=3)

Ballad sustained melody

create_melody_from_progression("Am-F-C-G", pattern="sustained", octave=5, bars_per_chord=4)

Country triadic fiddle

create_melody_from_progression("D-G-A-D", pattern="triadic", octave=5, velocity=0.8)

Inputs: octave, pattern, velocity, start_beat, +4 more. Returns: result

mcp_opendaw_create_metal_arrangementA

Create a full metal arrangement — double kick drums + palm-muted riffs + power chords + shred lead.

Heavy metal — riff-based, not chord-progression-based:

  • Track 0: Drums — double kick (16th notes on kick), snare on 2+4, crash on bar starts, ride during verses. Blast beat feel at high BPM. The double kick is the heartbeat of metal — relentless.

  • Track 1: Bass — root-following bass, palm-muted style. Follows the riff root notes in steady 8ths. Thick, driving, sits under the guitars like a foundation.

  • Track 2: Rhythm guitar — power chords (root+fifth) with palm-muted 8th note chugging. The classic metal riff approach: low E string pedal tone + power chord stabs. E minor phrygian dominant for that Middle Eastern/exotic metal feel.

  • Track 3: Lead guitar — minor pentatonic + natural minor scale shredding. Fast alternate-picking runs, sweep arpeggios, tapped harmonics simulated via high-register notes. The "shred" quality.

At 160 BPM (default), this is thrash/speed metal territory. At 120 BPM, it's traditional heavy metal (Iron Maiden). At 200+, it's extreme/black metal.

The riff: low E pedal tone + power chord on the off-beat. Phrygian dominant (E-F#-G-A-B-C-D) gives the exotic metal sound (think Metallica, Slayer, Meshuggah). Not I-IV-V — metal is riff-driven, not chord-driven.

bpm: Tempo (100-220, default 160 = thrash metal). bars: Arrangement length (must be multiple of 4, default 8). root: Root note (E is the most common metal key — lowest guitar string). octave: MIDI octave for bass (2 = E2=40, standard metal bass register). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_metal_arrangement(bpm=160, root="E", bars=8) create_metal_arrangement(bpm=120, root="D", bars=16) # traditional metal

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_metric_modulationA

Create a metric modulation — tempo change that preserves a note-value equivalence.

The defining technique of Elliott Carter, Aaron Copland, John Adams, and progressive rock (Dream Theater, Tool). Unlike a simple tempo change, metric modulation establishes a precise relationship: a specific note value in the new tempo has the same duration as a different note value in the old tempo. The listener perceives a new pulse while the rhythmic fabric remains continuous.

Formula: new_bpm = old_bpm × (new_note_value / old_note_value)

Supported note values:

  • "whole", "half", "dotted_half", "quarter", "dotted_quarter"

  • "quarter_triplet", "eighth", "dotted_eighth", "eighth_triplet"

  • "sixteenth", "dotted_sixteenth", "thirty_second"

Alternatively, pass a ratio like "3:2" (new tempo = 3/2 of old) or "2:3" (new = 2/3 of old) to express the modulation as a simple proportion.

Examples: create_metric_modulation(32, "quarter", "dotted_eighth", old_bpm=120) → new_bpm = 120 × (3/16) / (1/4) = 90 BPM. A dotted eighth at 90 lasts the same as a quarter at 120. create_metric_modulation(16, ratio="3:2", old_bpm=100) → new_bpm = 150. Three notes in new tempo = two in old. create_metric_modulation(48, "eighth", "quarter", old_bpm=140) → new_bpm = 280. Quarter at new tempo = eighth at old (doubling).

Args: position_beats: Beat position where modulation occurs. old_note: Note value in the old tempo (default "quarter"). new_note: Note value in the new tempo that equals old_note's duration (default "dotted_eighth" — classic Carter modulation). old_bpm: Current BPM. If 0, reads from the project's tempo track. ratio: Direct ratio "N:M" — new_bpm = old_bpm × N/M. Overrides old_note/new_note if provided. add_time_signature: Optional new time signature as "N/D" (e.g. "3/4", "6/8"). If provided, also creates a time signature change event at the same position.

Returns old_bpm, new_bpm, ratio, equivalence, and events created.

Inputs: position_beats (required), ratio, old_bpm, new_note, +2 more. Returns: result

mcp_opendaw_create_midi_echoA

Create MIDI echo — repeat notes with decaying velocity and optional pitch shift.

Takes existing notes from a region and creates echoing repeats. Each repeat is delayed by delay_beats, quieter by velocity_decay factor, and optionally shifted in pitch. This is a creative effect, not a simple copy — think guitar delay throws, synth echo fills, vocal repeat stutters.

feedback_mode:

  • "linear" — each repeat is velocity_decay × previous (0.6 → 0.6, 0.36, 0.216)

  • "exponential" — faster decay, squared each time

  • "constant" — same velocity for all repeats (stutter feel)

  • "reverse" — each repeat gets louder (build-up feel)

pitch_shift: semitones added per repeat (0 = no shift, +12 = octave up each repeat, -5 = perfect fourth down each repeat). Creates cascading echoes.

dest_track: -1 = same track (thickening), N = separate track (layered echo). Using a separate track lets you process the echo independently.

repeats: 1-8 echo repeats. Each repeat copies ALL notes from the source. delay_beats: time between each repeat (0.25 = 16th, 0.5 = 8th, 1.0 = quarter).

unit_index: AU index. track_index: Source note track. region_index: Source region (-1 = first). repeats: Number of echo repeats (1-8). delay_beats: Delay between repeats in beats. velocity_decay: Velocity multiplier per repeat (0-1, 0.6 = 60% each time). pitch_shift: Semitones added per repeat (0 = none). dest_track: Destination track (-1 = same, N = separate track). feedback_mode: linear / exponential / constant / reverse.

Returns echo summary with per-repeat velocity and pitch info.

Example:

Guitar-style echo: 3 repeats, 8th note delay, decaying

create_midi_echo(0, 0, repeats=3, delay_beats=0.5, velocity_decay=0.5)

Cascading octave echoes on separate track

create_midi_echo(0, 0, repeats=4, delay_beats=0.25, pitch_shift=12, dest_track=2)

Inputs: unit_index (required), track_index (required), repeats, dest_track, +5 more. Returns: result

mcp_opendaw_create_modulated_songA

Build a multi-section song with key modulation between sections — one call.

Each section has its own chord progression, length (bars), and energy (velocity multiplier). The tool automatically modulates between keys by using different progressions per section — no manual start_beat calculation needed.

sections: Comma-separated section specs. Each section format: name:progression:bars:energy

  • name: section label (verse, chorus, bridge, outro, etc.)

  • progression: chord progression string (e.g. "Am-F-C-G")

  • bars: total bars for this section

  • energy: velocity multiplier (0.0-1.0, relative to base velocity)

Default creates a 24-bar song: verse (Am-F-C-G, 8 bars, 0.7) → chorus (C-G-Am-F, 8 bars, 1.0) → bridge (F-C-Dm-G, 4 bars, 0.6) → outro (Am-F-C-G, 4 bars, 0.5)

The chorus modulates to C major (relative major of A minor), the bridge modulates to F (up a fourth), and the outro returns to Am.

arp_pattern/bass_pattern/melody_pattern/counter_melody_pattern: Same as create_harmonic_arrangement. Applied to all sections. Use "" to skip any layer.

drum_genre: If set (e.g. "house", "dnb", "synthwave"), creates a genre drum arrangement for the full song length BEFORE harmonic layers. When drum_genre is set, pads and bass are automatically skipped in harmonic sections (genre arrangement provides them). Default "" = no drums (harmony only). Valid: dnb, liquid_dnb, house, trap, techno, dubstep, afrobeat, rock, jazz, pop, funk, reggae, synthwave, trance, disco.

bpm: Tempo for drum arrangement (None = genre default). Only used when drum_genre is set.

Example:

Default 4-section modulated song (harmony only)

create_modulated_song()

With house drums

create_modulated_song(drum_genre="house", bpm=124)

With synthwave drums + counter-melody

create_modulated_song(drum_genre="synthwave", counter_melody_pattern="contrary")

Simple verse-chorus with DnB drums

create_modulated_song("verse:Em-G-D-C:8:0.7,chorus:G-D-Em-C:8:1.0", drum_genre="dnb")

Inputs: bpm, sections, velocity, drum_genre, +5 more. Returns: result

mcp_opendaw_create_montunoA

Create a montuno — a repeating Latin/jazz piano ostinato pattern.

A montuno is a 2-bar (or 4-bar) repeating piano figure central to son, salsa, Latin jazz, and mambo. It consists of syncopated chord stabs and single-note passages that lock with the clave, creating a driving, danceable groove.

Unlike arpeggiators (which cycle through chord tones mechanically) or ostinato patterns (which repeat a fixed melodic cell), a montuno combines:

  • Harmonic movement through a chord progression

  • Syncopated rhythm locked to the clave

  • Alternation between chord stabs and melodic passage notes

  • Call-and-response phrasing within each bar

Pattern types: 2-3 — Classic 2-3 clave montuno (2-side in bar 1, 3-side in bar 2) 3-2 — Reverse clave (3-side first, 2-side second) guajira — Cuban guajira montuno (gentler, dotted rhythm feel) charanga — Charanga-style (more melodic, flowing passages)

Rhythm: 8th — Eighth-note based (standard salsa) 16th — Sixteenth-note based (faster, busier) quarter — Quarter-note based (simpler, mambo style)

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, mixolydian, harmonic_minor). bars: Number of bars (2 or 4). Montunos are typically 2-bar cycles. octave: Starting MIDI octave (2-6). chord_prog: Comma-separated chord progression (e.g., "C,Am,Dm,G"). If empty, generates a I-vi-IV-V progression in the key. pattern: Pattern type (2-3, 3-2, guajira, charanga). rhythm: Rhythm subdivision (8th, 16th, quarter). velocity: Base velocity 0-1. accent_beats: Comma-separated beat numbers to accent (1-indexed). unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, chord progression, and pattern info.

Inputs: bars, root, scale, octave, +8 more. Returns: result

mcp_opendaw_create_mordentA

Create a mordent — main note → neighbor → back. A classical ornament.

The mordent is one of the four essential baroque ornaments (trill, mordent, turn, appoggiatura). It's a rapid single alternation: play the main note briefly, flick to a neighbor note, then return to the main note — all within the space of one note duration. Think Bach two-part inventions, Mozart sonatas.

An upper mordent flicks UP (main → upper neighbor → main). A lower mordent flicks DOWN (main → lower neighbor → main). The neighbor note is very short — just a flicker.

main_pitch: The primary MIDI note (default 60 = C4). direction: "upper" (main→higher→main) or "lower" (main→lower→main). interval: Semitones to the neighbor note (default 2 = whole step). Upper: 1 = half step (diatonic), 2 = whole step. Lower: -1, -2 mirror. duration_beats: Total length of the mordent in beats (0.25-4, default 0.5 = one 8th). velocity: Base velocity 0-1 (default 0.85). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the mordent begins.

Returns notes created, pitches used.

Inputs: interval, velocity, direction, main_pitch, +4 more. Returns: result

mcp_opendaw_create_motif_developmentA

Develop a motif into a through-composed melodic line that evolves.

Takes a short motif (2-8 notes) and builds a continuous melodic line that develops through compositional stages: statement, sequential repetition (up/down), fragmentation (shorter segments), inversion, octave displacement, and cadence. This is the Beethoven 5th approach — a 4-note seed grows into an entire melodic arc.

Unlike create_variations (separate regions, each a full transformation), create_motif_development writes ONE continuous line that flows through stages without stopping. Unlike create_sequence (pure transposition), this tool mixes multiple development techniques in sequence.

motif: Comma-separated scale degrees (1-7) or MIDI pitches. Scale degrees: 1=root, 2=2nd, 3=3rd, etc. 0=rest. MIDI pitches: 60,62,64,65 etc (when use_midi=true implicit if >7). Example: "1,1,1,2" or "60,60,60,62" scale: Scale type (major, minor, harmonic_minor, dorian, etc.). root: Root note name (C, D#, Bb, etc.). octave: MIDI octave for root (4 = C4=60). steps: Comma-separated development stages: "statement" — play motif as-is "sequence_up" — transpose up by a 4th (5 semitones) "sequence_down" — transpose down by a 4th "fragment" — play first half of motif "fragment_end" — play second half of motif "invert" — invert around root pitch "octave_up" — shift up one octave "octave_down" — shift down one octave "expand" — double note durations "compress" — halve note durations "cadence" — resolve to root (scale degree 1, longer duration) step_duration: Duration of each note in beats (0.25 = 16th). velocity: Base velocity 0-1. unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the development starts.

Returns total notes, stage count, pitches used.

Inputs: motif (required), root, scale, steps, +6 more. Returns: result

mcp_opendaw_create_motif_variationsA

Extract a motif from existing notes and create a variation in a new region.

Closes the analysis→creation loop: extract_motifs finds repeating patterns, this tool takes a specific motif and transforms it using classical composition techniques. The motif is identified by start_note index and note_count within the source region.

Variation types:

  • sequence: repeat the motif shifted up/down by N scale steps or semitones. Creates melodic sequences — the backbone of classical and jazz improvisation.

  • inversion: flip the contour upside down. C→E→G (+4, +3) becomes C→A→F (-3, -2). The intervals are mirrored around the first note.

  • retrograde: play the motif backwards. Last note first, first note last. The rhythm and pitches are reversed in time.

  • augmentation: stretch all durations by a factor (2.0 = twice as slow). Creates grand, expansive statements from quick motifs.

  • diminution: compress all durations by a factor (2.0 = twice as fast). Creates urgency and energy from slow motifs.

  • fragmentation: take the first N notes of the motif and repeat them. Creates rhythmic ostinatos from melodic material.

Essential for: developing melodic material, building variations, creating thematic development, and extending motifs into new sections.

source_unit/track/region: Location of the source motif. start_note: Index of the first note of the motif within the source region (0-based, sorted by position). note_count: Number of notes in the motif (3-16). target_unit/track/region: Where to write the variation. -1 = create new track/region automatically. variation_type: sequence, inversion, retrograde, augmentation, diminution, fragmentation. sequence_shift: For sequence type — semitones to shift each repetition. augmentation_factor: For augmentation/diminution — duration multiplier. fragment_count: For fragmentation — how many notes to keep from the start.

Returns the created variation with note details.

Inputs: note_count, start_note, source_unit, target_unit, +8 more. Returns: result

mcp_opendaw_create_mute_automationA

Create timed mute/unmute automation events on an audio unit.

Essential for section dynamics: mute drums during breakdowns, unmute for drops, create structural silences. Each event is a (beat, mute_state) pair — mute at beat X, unmute at beat Y. Replaces multiple set_track_mute calls with one automation track that plays back predictably every time.

unit_index: AU index to automate mute on. events: JSON array of [beat, muted] pairs. beat = position in beats, muted = true (silence) or false (audible). Example: [[0, false], [16, true], [24, false]] = audible 0-16, muted 16-24, audible 24+

Returns events created, mute schedule, and track index.

Examples: create_mute_automation(unit_index=0, events='[[0,false],[16,true],[24,false]]') → Drums audible for 16 beats, muted for 8 (breakdown), back on at 24 create_mute_automation(unit_index=2, events='[[0,true],[8,false]]') → Bass silent for intro, kicks in at beat 8

Inputs: events (required), unit_index (required). Returns: result

mcp_opendaw_create_neurofunk_arrangementA

Create a full neurofunk DnB arrangement — 4 tracks: drums + sub-bass + Reese + stabs.

Neurofunk (Noisia, Spor, Phace, Ed Rush & Optical) is the technically advanced evolution of drum & bass — darker, more complex, with signature sound design elements:

  • 170-180 BPM, dark minor key (typically F or E minor)

  • Complex chopped breakbeats with extra ghost notes, kicks, and rolls

  • Reese bass: detuned saw layers with movement, the hallmark neurofunk sound

  • Sub-bass underneath the Reese for low-end weight

  • Dark minor chord stabs and sci-fi atmosphere

  • Aggressive velocity, tight quantization with occasional swing

Creates 4 tracks:

  1. Drums (drum_track): Complex amen break with extra kick placements, ghost notes, and snare rolls at phrase ends. 2-bar cycle.

  2. Sub-bass (bass_track): Deep sustained sub following root note, syncopated gaps where drums fill. Octave 1 for sub weight.

  3. Reese (reese_track): Detuned saw-style Reese bass with chromatic movement, pitch slides, and rhythmic stabs. The signature neuro sound.

  4. Stabs (stabs_track): Dark minor chord stabs (root + b3 + b5 + b7) on beats 1 and 3, with occasional off-beat sci-fi stabs.

bpm: Tempo (160-185, default 174). bars: Arrangement length (4-32, default 8). root: Root note (default F = classic neurofunk key). octave: MIDI octave for Reese/bass (2 = C2=36).

Returns notes created per track and total.

Example: create_neurofunk_arrangement(bpm=174, root="F", bars=8) create_neurofunk_arrangement(bpm=180, root="E", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_noteA

Create a MIDI note on a note track.

pitch: MIDI note number (60 = C4, 69 = A4). start_beat: beat position. duration_beats: note length in beats. velocity: 0.0-1.0. unit_index: Audio unit index (-1 = search all AUs for note tracks). track_index: Note track index within the AU.

If no clip exists on the track yet, one is auto-created. Notes are added to the first clip on the track.

Inputs: pitch (required), velocity (required), start_beat (required), unit_index (required), +2 more. Returns: result

mcp_opendaw_create_note_clipA

Create a note clip in the session view (clip launcher).

Note clips are the session-view counterpart to note regions. They contain a NoteEventCollection and can be triggered independently in the clip launcher.

unit_index: Audio unit index (-1 = search all AUs for note tracks). track_index: Note track index within the AU. clip_index: Slot index in the clip launcher (0, 1, 2, ...). name: Display name for the clip. hue: Color hue 0-360 (-1 = auto from track type).

Returns clip UUID and index.

Inputs: hue (required), name (required), clip_index (required), unit_index (required), +1 more. Returns: result

mcp_opendaw_create_notes_batchA

Create multiple MIDI notes in a single call — batch creation for melodies, chords, arpeggios.

notes: JSON array of note objects, each with:

  • pitch (int): MIDI note number (60 = C4, 69 = A4)

  • start (float): beat position

  • duration (float): note length in beats

  • velocity (float, optional): 0.0-1.0, default 0.8

Example: '[{"pitch":60,"start":0,"duration":0.5},{"pitch":64,"start":0.5,"duration":0.5},{"pitch":67,"start":1,"duration":1}]'

All notes go into one region on the specified note track. If no region exists, one is created. Faster than calling create_note repeatedly — one round-trip, one editing.modify() block.

Inputs: notes (required), unit_index, track_index. Returns: result

mcp_opendaw_create_note_trackA

Create a new note/MIDI track on an audio unit.

unit_index: Audio unit index. Use -1 (default) for the primary audio unit, or specify an instrument AU index that contains a synth device (Vaporisateur, Nano, etc).

Inputs: unit_index (required). Returns: result

mcp_opendaw_create_ostinatoA

Create an ostinato — a repeating melodic/rhythmic pattern as a foundation layer.

Ostinatos are short patterns (2-8 notes) that repeat throughout a section, providing a rhythmic/harmonic anchor. Common in minimalism, electronic, and film music.

scale: Scale type (major, minor, dorian, phrygian, etc. — 14 types from music_theory). root: Root note name (C, C#, D, ... B). pattern: Scale degrees as space-separated numbers (1-7, 0=rest): "1 5 3 5" — repeating i-v-iii-v pattern "1 3 5 6 5 3" — longer melodic cell repeats: Number of times to repeat the pattern (1-16). octave: Starting octave (1-7, default 4). velocity: Note velocity 0-1.

Returns total notes created and pattern info.

Inputs: root (required), scale (required), pattern (required), octave, +5 more. Returns: result

mcp_opendaw_create_pan_sweepA

Create a panning automation sweep — move signal from left to right (or vice versa) over time.

Classic stereo movement technique for intros, guitar solos, EDM builds, and section transitions. Creates panning automation events on the AU's panning parameter, sweeping from one position to another. Uses linear curve by default (panning is already psychoacoustic, exp not needed).

unit_index: AU index. start_beat: Start position in beats. duration_beats: Sweep length in beats (default 8 = 2 bars). start_pan: Starting pan position -1.0 (full left) to 1.0 (full right). Default -1. end_pan: Ending pan position -1.0 to 1.0. Default 1 (full sweep L→R). curve: "linear" (default — even stereo movement), "exp" (accelerating), "log" (decelerating). steps: Number of automation points (default 24 = smooth).

Returns events created, pan range, and preview.

Examples: create_pan_sweep(unit_index=0, duration_beats=16) → 16-beat full L→R pan sweep, linear create_pan_sweep(unit_index=2, start_pan=0.5, end_pan=-0.5, duration_beats=4) → Quick 4-beat R→L sweep from half-right to half-left

Inputs: unit_index (required), curve, steps, end_pan, +3 more. Returns: result

mcp_opendaw_create_passacagliaA

Create a passacaglia — repeating bass ostinato with evolving harmonies above.

A foundational Baroque form (Bach BWV 582, Buxtehude) adapted to modern contexts (film scoring, metal, electronic). A short bass pattern (4-8 notes) repeats throughout while chords or arpeggiations evolve above it, creating cumulative tension. Distinct from ostinato (single repeating pattern), pedal_point (single sustained note), and bordun (drone chord).

bass_pattern: Space-separated MIDI pitches for the bass ostinato (e.g. "36 43 41 36" = C2 G2 F2 C2). Default is a classic descending bass. bass_rhythm: Space-separated durations in beats matching bass_pattern (e.g. "1 1 1 1" = quarter notes, "0.5 0.5 1 2" = syncopated). bass_repeats: How many times the bass pattern repeats (1-16, default 4). chord_pattern: Comma-separated chord names for the upper voices (e.g. "Cm,Ab,Eb,Bb"). Supports: maj, min, m7, maj7, dom7, sus2, sus4, dim, aug. If fewer chords than repeats, chords cycle. chord_octave: Octave for chord notes (1-8, default 4). variation_style: How upper harmonies are voiced — "block" (sustained chords), "arpeggiated" (broken chord pattern), "melodic" (stepwise counter-melody). beats_per_bar: Time signature beats (3/4=3, 4/4=4, 6/8=6, default 4). bass_velocity: Velocity of bass notes (0-1, default 0.75). chord_velocity: Velocity of chord/variation notes (0-1, default 0.55). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the passacaglia begins.

Returns notes created, bass pattern length, total bars, variation style.

Inputs: start_beat, unit_index, bass_rhythm, track_index, +8 more. Returns: result

mcp_opendaw_create_pedal_pointA

Create a pedal point — sustained bass tone under changing chords.

A foundational technique in film scoring (Hans Zimmer drones), organ preludes (Bach), and rock ballads. A single low note sustains (or retriggers) while chords change above it, creating harmonic tension and release. The pedal anchors the harmony while the chords create movement.

pedal_pitch: Sustained bass note (default 36 = C2, low and powerful). chord_pattern: Comma-separated chord names (e.g. "Cm,Ab,Eb,Bb"). Supports: maj, min, m7, maj7, dom7, sus2, sus4, dim, aug. bars_per_chord: Bars each chord lasts (1-8, default 1). beats_per_bar: Time signature beats (3/4=3, 4/4=4, 6/8=6, default 4). pedal_velocity: Velocity of pedal note (0-1, default 0.75). chord_velocity: Velocity of chord notes (0-1, default 0.6). chord_octave: Octave for chord notes (1-8, default 4 = C4 range). retrigger_pedal: If true, pedal re-triggers at each chord change. If false, one long sustained note for the entire duration. unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the pedal point begins.

Returns notes created, chord count, pedal duration.

Inputs: start_beat, unit_index, pedal_pitch, track_index, +7 more. Returns: result

mcp_opendaw_create_phase_shiftA

Create a phase-shifted copy of a region — Steve Reich phasing.

Copies the source phrase and places it on a parallel track (or cross-track) with a gradually accumulating time offset. Each bar, the copy shifts by shift_per_bar beats, creating the classic "slipping" phase pattern of minimalism.

Steve Reich's "It's Gonna Rain", "Piano Phase", and "Clapping Music" use this technique. Also the foundation of techno loop phasing, ambient drift, and IDM polyrhythmic evolution.

Unlike displace_rhythm (single fixed offset), phase_shift creates a SECOND copy that drifts further each bar — the two streams start in unison and gradually separate.

Args: unit_index: Audio unit index track_index: Note track index with source phrase region_index: Region index (-1 = first region) shift_per_bar: Time shift per bar in beats (0.03125-0.5, default 0.0625 = 1/16 note per bar). Smaller = slower drift, larger = faster separation. bars: Number of bars to generate (2-16, default 8). Each bar is one repeat of the source phrase with cumulative offset. direction: Phase drift direction — "forward": copy moves later each bar (lags behind) "backward": copy moves earlier each bar (anticipates) cross_track: If >= 0, place the phased copy on this track. If -1 (default), creates a new track on the same AU for the copy. Recommended: use cross_track for explicit control. velocity_scale: Velocity multiplier for the phased copy (0.1-1.0, default 0.85 — slightly softer to distinguish from the original).

Inputs: unit_index (required), track_index (required), bars, direction, +4 more. Returns: result

mcp_opendaw_create_phonk_arrangementA

Create a full drift phonk arrangement — 3 tracks: drums + 808 + cowbell lead.

Drift phonk (Kordhell, MC Slvr, LXST CXNTURY) is the TikTok-era evolution of Memphis rap — dark, distorted, high-energy, with signature elements:

  • 120-140 BPM, usually minor key

  • Memphis-style drums: punchy kick on 1 and 3, snare/clap on 2 and 4, fast 16th hats with occasional rolls, lo-fi texture

  • 808 bass with slides (glide between notes, sustained resonance)

  • Cowbell melody — the iconic phonk sound, catchy repetitive riffs in minor pentatonic, often detuned/dark

  • Sidechain feel — bass ducks when kick hits

  • Distorted, lo-fi aesthetic

Creates 3 tracks:

  1. Drums (drum_track): Memphis-style — punchy kick, clap on 2&4, 16th hats with rolls at phrase ends, occasional perc hits.

  2. 808 bass (bass_track): Sliding 808 with sustained resonance. Follows root with chromatic slides, octave drops, and gaps where drums fill. The glide is simulated by short overlapping notes at pitch transitions.

  3. Cowbell lead (cowbell_track): Repetitive minor pentatonic riff in high octave, catchy and driving. 1-bar or 2-bar cycle.

bpm: Tempo (110-150, default 130). bars: Arrangement length (4-32, default 8). root: Root note (default F = common phonk key). octave: MIDI octave for 808 (2 = C2=36).

Example: create_phonk_arrangement(bpm=130, root="F", bars=8) create_phonk_arrangement(bpm=140, root="D#", bars=16)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_pitch_stretched_clipA

Create a pitch-stretched audio clip in session view.

Pitch-stretched clips maintain pitch alignment with the project tempo. Uses AudioPitchStretchBox for play mode.

sample_id: ID from mcp_opendaw_load_audio. unit_index: Audio unit index. clip_index: Slot index in clip launcher. track_index: Audio track index within AU. bpm: Source BPM of the sample.

Inputs: bpm (required), sample_id (required), clip_index (required), unit_index (required), +1 more. Returns: result

mcp_opendaw_create_pitch_stretched_regionA

Place a pitch-stretched audio region on a track.

Pitch-stretch preserves the original timing but allows pitch manipulation via warp markers. Use this when you want to tune audio to project key without changing its duration.

sample_id: The ID returned by mcp_opendaw_load_audio. unit_index: Audio unit index (default 0). start_beat: Beat position to place the region. track_index: Track index within the audio unit (default 0). bpm: Source BPM of the sample (for warp marker calculation).

Returns position and duration in PPQN.

Inputs: bpm (required), sample_id (required), start_beat (required), unit_index (required), +1 more. Returns: result

mcp_opendaw_create_playfield_sampleA

Add a drum pad to a Playfield drum machine.

midi_note: MIDI note number for this pad (36=C1, 38=D1, 42=F#1, etc). sample_name: Name for the sample slot. duration_seconds: Duration hint for the sample slot. unit_index: Audio unit index (-1 = auto-detect Playfield).

Returns the new pad index and MIDI note.

Inputs: midi_note (required), unit_index (required), sample_name (required), duration_seconds (required). Returns: result

mcp_opendaw_create_polyrhythmA

Create a polyrhythm — two rhythmic streams with different subdivision counts playing simultaneously.

A polyrhythm divides the same time span into two different numbers of equal parts. The classic 3:4 means 3 notes in the time of 4 — creating cross-rhythms used in jazz, electronic, African, and progressive music.

Creates notes on a single track: primary stream uses primary_pitch, secondary uses secondary_pitch. Both streams span the same total duration (bars × 4 beats).

primary_count: Number of primary subdivisions (2-16). E.g., 3 in a 3:4 polyrhythm. secondary_count: Number of secondary subdivisions (2-16). E.g., 4 in a 3:4 polyrhythm. bars: Total length in bars (1-8). unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. primary_pitch: MIDI pitch for primary stream (default 60 = C4). secondary_pitch: MIDI pitch for secondary stream (default 72 = C5, one octave up). primary_velocity: Velocity for primary notes 0-1. secondary_velocity: Velocity for secondary notes 0-1. duration: Note duration in beats.

Returns total notes created and polyrhythm ratio.

Common polyrhythms: 3:4 — classic cross-rhythm (jazz, electronic) 2:3 — hemiola (African, Latin) 3:5 — complex polyrhythm (progressive) 4:5 — dense polyrhythm (modern jazz) 7:8 — extreme polyrhythm (math rock)

Example: create_polyrhythm(primary_count=3, secondary_count=4, bars=2, primary_pitch=60, secondary_pitch=67)

Inputs: primary_count (required), secondary_count (required), bars, duration, +7 more. Returns: result

mcp_opendaw_create_pop_arrangementA

Create a full pop arrangement with verse-chorus-bridge song structure across 4 tracks.

Pop music with real song form — fundamentally different from all loop-based arrangements:

  • Track 0: Drums — verse (sparse: kick+hat) → chorus (full: kick+snare+hat+crash) → bridge (build: rising energy) → final chorus (maximum density)

  • Track 1: Bass — verse (root notes, sparse) → chorus (octave jumps, driving) → bridge (walking, building) → final chorus (full energy)

  • Track 2: Chords — I-V-vi-IV progression (the "four chords of pop"), played differently per section: verse (light arpeggios), chorus (full block chords), bridge (sus/resolution)

  • Track 3: Melody — catchy hook that varies per section: verse (sparse, low) → chorus (anthemic, high register) → bridge (tension, chromatic) → final chorus (hook + variation)

At 120 BPM (default), this creates a modern pop feel. The I-V-vi-IV progression is the most used chord sequence in pop music (I=0, V=7, vi=9, IV=5) — different from rock's I-IV-V and jazz's ii-V-I. Song structure (verse-chorus-bridge) is the key difference from all loop-based arrangements.

Sections (16 bars default):

  • Verse 1: bars 1-4 (sparse, intimate)

  • Chorus 1: bars 5-8 (full energy, hook)

  • Verse 2: bars 9-12 (sparse + variation)

  • Chorus 2: bars 13-16 (full energy, hook)

  • Bridge: bars 17-20 (tension, build)

  • Final Chorus: bars 21-24 (maximum, hook + variation)

bpm: Tempo (90-140, default 120 = modern pop). bars: Total length in bars (16-32, default 16 = standard pop song). root: Root note (C is the most common pop key). octave: MIDI octave for bass (2 = C2=36, standard bass register). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / melody_track: Track indices.

Returns notes created per track and total.

Example: create_pop_arrangement(bpm=120, root="C", bars=16) create_pop_arrangement(bpm=128, root="G", bars=24)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_progression_from_keyA

Auto-generate a diatonic chord progression from a detected key — no manual chord typing.

Takes key + mode (from detect_key output) and generates a genre-appropriate diatonic progression using scale degrees. Eliminates the need to manually write [["Am","min"],["F","maj"]...] — just pass key="A", mode="minor".

key: Root note name (C, C#, D, D#, E, F, F#, G, G#, A, A#, B). mode: "major" or "minor" (natural minor scale). style: Progression style:

  • "pop" — I-V-vi-IV (major) / i-VI-III-VII (minor) — "four chords of pop"

  • "jazz" — ii-V-I (major) / ii-V-i (minor) — jazz turnaround

  • "rock" — I-IV-V (major) / i-iv-V (minor) — blues/rock

  • "synthwave" — i-VI-III-VII (minor) — synthwave/emotional

  • "folk" — I-IV-vi-V (major) / i-iv-VII-III (minor) — folk/americana

  • "lofi" — ii-V-i (minor) or I-vi-IV-V (major) — lofi/jazzy unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the progression starts (0 = bar 1). chord_duration: Length of each chord in beats (4 = one bar at 4/4).

Returns: notes_created, chords, voicings, progression (chord names), key, mode.

Pipeline: detect_key("track.wav") → {key: "A", mode: "minor"} → create_progression_from_key("A", "minor", "synthwave") → create_harmonic_arrangement("Am-F-C-G")

Inputs: key (required), mode, style, start_beat, +3 more. Returns: result

mcp_opendaw_create_psytrance_arrangementA

Create a psytrance arrangement — 145 BPM hypnotic Goa/psychedelic.

Psytrance (psychedelic trance) is a subgenre of trance born in Goa, India (early 1990s) and developed in Israel, Europe. Key:

  • 145-150 BPM, 4/4 time, driving and hypnotic

  • Rolling bassline: 16th notes with a specific "k-b-k-b" pattern (kick on downbeat, bass on offbeat, creating a rolling feel)

  • Layered percussion: tight hats, snare rolls, shakers

  • Hypnotic lead: repeated motifs, evolving filter sweeps

  • FM synth sounds, alien textures, sci-fi atmosphere

  • Often in F minor or E minor

Creates 4 tracks:

  1. Drums (track_index): Kick on every beat, snare on 2&4, tight 16th hats, shaker pattern, snare roll at end of phrases

  2. Bass (track_index+1): Rolling 16th bassline — kick-aligned bass notes with offbeat syncopation, creating the psytrance "gallop" feel

  3. Lead (track_index+2): Hypnotic repeated motif with filter sweep simulation (velocity variations), octave jumps

  4. Atmosphere (track_index+3): Sparse sustained notes, sci-fi pad-like textures on bar starts

Default key: F minor.

Inputs: bpm, bars, key_root, velocity, +3 more. Returns: result

mcp_opendaw_create_random_walk_melodyA

Create a melody using a random walk through a scale — stochastic generation.

Each note is chosen by walking up or down the scale from the previous note. The walk is constrained by max_step (how many scale degrees can move per step) and direction_bias (probability of ascending vs descending).

This produces melodies that feel coherent (smooth stepwise motion) yet unpredictable — the hallmark of generative music. Brian Eno's generative systems, Xenakis's stochastic pieces, ambient textures, IDM melodies.

Unlike generate_melody (contour-guided weighted random), random walk produces stepwise motion where each note depends on the previous one — creating the melodic continuity that contour guidance doesn't guarantee.

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, phrygian, lydian, mixolydian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues). bars: Number of bars (1-32). At default duration=0.5, 4 bars = 32 notes. octave: Starting MIDI octave (1-6, default 4 = C4=60). max_step: Maximum scale steps per move (1-7, default 3). 1 = only adjacent scale tones (very smooth, stepwise). 2 = allow skips of up to a third. 3 = up to a fourth (mix of steps and skips). 5 = up to a sixth (dramatic leaps). 7 = full octave (free movement). direction_bias: -1.0 to +1.0 (default 0 = equal up/down). Negative = tend downward, positive = tend upward. 0.5 = 75% chance up, 25% down. duration: Note duration in beats (0.0625-4.0, default 0.5 = eighth). duration_variation: "none" (uniform), "slight" (+/-50%), "wide" (16th to half), "dotted" (mix of dotted and straight). rest_probability: 0-0.5 (default 0 = no rests). Inserts rests instead of notes at the given probability. velocity: Base velocity 0-1. velocity_variation: "none" (uniform), "slight" (+/-0.1), "dynamic" (+/-0.3), "human" (gaussian-ish, +/-0.15). boundary_behavior: "reflect" (bounce back at octave limits), "wrap" (wrap around), "clamp" (stay at boundary). seed: PRNG seed for reproducibility. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, walk statistics (range, average interval, direction ratio), and seed for reproducibility.

Inputs: bars, root, seed, scale, +12 more. Returns: result

mcp_opendaw_create_ratchetA

Create a ratchet — repeated notes with changing subdivision rate.

A ratchet (also called "accelerando repeat" or "Bach ratchet") is a series of repeated notes where the spacing between notes gradually decreases (accelerate) or increases (decelerate), creating a sense of acceleration or deceleration. Used extensively in Baroque music (Bach cadences), electronic build-ups, and drum fills.

Args: unit_index: Audio unit index track_index: Note track index pitch: MIDI pitch for all ratchet notes (0-127) start_beat: Start position in beats length_beats: Total length in beats subdivisions: Subdivision mode — "accelerate" = start slow, get faster (16th→32nd→64th) "decelerate" = start fast, get slower (64th→32nd→16th) "constant" = even subdivision (no change, like a roll) "exponential" = exponential acceleration max_subdivisions: Maximum notes per beat at the fastest point (4=16th, 8=32nd, 16=64th, 32=128th) velocity: Base velocity (0-1) velocity_decay: Velocity reduction per note (0=uniform, 0.02=gradual fade) pitch_drift: Semitones to drift per note (0=same pitch, 1=ascending chromatic, -1=descending, 12=ascending octaves) region_index: Target region (-1 = auto-create/append)

Returns: JSON with notes_created, pitch, subdivision_points, total_beats.

Inputs: unit_index (required), track_index (required), pitch, velocity, +7 more. Returns: result

mcp_opendaw_create_reggae_arrangementA

Create a full reggae arrangement — one-drop drums + melodic bass + skank guitar + organ across 4 tracks.

Roots reggae with the signature one-drop feel — fundamentally different from all other arrangements:

  • Track 0: Drums — one-drop pattern: kick AND snare TOGETHER on beat 3 (the "drop"), with hi-hat on all 8ths. No kick on beat 1 — the emptiness on 1 is the reggae feel. Organ bubble on 8th off-beats.

  • Track 1: Bass — THE lead instrument in reggae: melodic, repetitive, driving. Root-based with octave and fifth walks, full bar sustain. In reggae, bass carries the melody — not the guitar.

  • Track 2: Guitar — skank: staccato chops on the off-beats (the "and" of 1, the "and" of 2, etc.). The signature reggae guitar sound — short, percussive, on every off-beat. This is the rhythmic backbone, not the drums.

  • Track 3: Keys — organ bubble: Hammond-style sustained chords with a shuffle feel, filling the space between guitar skanks. Adds harmonic richness and the classic roots sound.

At 80 BPM (default), this creates the classic roots reggae pocket — slow, heavy, meditative. The one-drop (kick+snare together on 3) is the fundamental difference from all 10 other arrangements: rock puts kick on 1 & 3, funk puts kick on 1 with syncopation, reggae drops everything on 3 and leaves 1 empty. The bass is the lead instrument — unique among all genres.

bpm: Tempo (65-95, default 80 = classic roots reggae). bars: Arrangement length (4-16, default 8). root: Root note (A is a classic reggae key — Am). octave: MIDI octave for bass (2 = A2=45, standard reggae bass register). unit_index: AU index with note tracks. drum_track / bass_track / guitar_track / keys_track: Track indices.

Returns notes created per track and total.

Example: create_reggae_arrangement(bpm=80, root="A", bars=8) create_reggae_arrangement(bpm=72, root="D", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_reggae_percussionA

Create Jamaican reggae percussion patterns across 6 styles.

Reggae drum patterns are the rhythmic backbone of Jamaican popular music. The one-drop is the most iconic — kick and snare together on beat 3, creating the characteristic "drop" that defines roots reggae.

Styles:

  • one_drop: Roots reggae (Bob Marley, Burning Spear). Kick+snare on beat 3 of each bar. Hi-hat 8th notes. The "drop" = beat 3 hits hard, beats 1/2/4 are empty or sparse. 65-80 BPM.

  • rockers: Late roots/early dancehall (Sly Dunbar, Robbie Shakespeare). Kick on 1 and 3, snare on 2 and 4. Steady four-on-the-floor feel but with reggae push. 75-90 BPM.

  • steppers: Dub/roots (Burning Spear "Marcus Garvey"). Four-on-the-floor kick on every beat, snare on 3. Driving, hypnotic. 70-85 BPM.

  • ska: Early Jamaican ska (Skatalites, Prince Buster). Fast, upbeat emphasis. Kick on 1+3, snare on 2+4, riding hi-hat with heavy syncopation. 120-180 BPM.

  • rocksteady: Transition era (Alton Ellis, Hopeton Lewis). Slower than ska, laid-back. Kick on 1+3, snare on 3, hi-hat 8ths with slight behind-the-beat feel. 70-85 BPM.

  • dancehall: Modern Jamaican (Shabba Ranks, Sean Paul). Programmed feel, kick on 1, 3-and, snare on 2, 4, with syncopated hi-hat. 90-120 BPM.

swing: 0.0-0.6, offsets off-beat hats (reggae rarely swings heavy, but ska can use 0.3-0.5).

Creates drum notes on track_index using GM percussion pitches: 36 (kick), 38 (snare), 42 (closed hat), 46 (open hat).

Inputs: bars, style, swing, velocity, +4 more. Returns: result

mcp_opendaw_create_riffA

Create a genre-specific riff — catchy repeated melodic fragment.

A riff is a short, memorable, repeated musical phrase that defines a song's identity. Unlike a melody (which develops through a section) or an ostinato (which repeats a scale pattern), a riff is a self-contained hook with rhythmic character and pitch content that immediately identifies the song.

  • rock: Power chord-based riffs, palm-mute aesthetic, bluesy bends, syncopated rests. Deep Purple, Led Zeppelin, Black Sabbath.

  • funk: Sixteenth-note syncopation, ghost notes, staccato stabs, octave jumps, tight pocket. James Brown, Funkadelic, Tower of Power.

  • metal: Galloping rhythms, palm-muted low strings, tritone intervals, fast alternate picking. Iron Maiden, Metallica, Slayer.

  • blues: Shuffle feel, pentatonic bending, call-response phrases, turnaround aesthetic. B.B. King, Freddie King, Albert King.

  • hip_hop: Sample-chop aesthetic, short repeating loop, melodic minor pentatonic, sparse placement. Dr. Dre, RZA, J Dilla.

riff_type: rock | funk | metal | blues | hip_hop key_root: Root note scale_type: minor_pentatonic | major_pentatonic | blues | minor | phrygian bars: Riff length (1-4, default 2) octave: MIDI octave (3 = C3=48, good for guitar range) velocity: Base velocity 0-1 seed: PRNG seed for reproducibility

Example: create_riff(riff_type="rock", key_root="E", bars=2) create_riff(riff_type="funk", key_root="D", scale_type="minor_pentatonic", bars=1) create_riff(riff_type="metal", key_root="E", scale_type="phrygian", bars=2)

Inputs: bars, seed, octave, key_root, +6 more. Returns: result

mcp_opendaw_create_riserA

Create a riser — ascending pitch sweep for build-up transitions.

Generates a sequence of notes with ascending pitch from start_pitch to end_pitch over the specified length. Velocity ramps up proportionally. Useful for:

  • Build-ups before a drop/chorus

  • Transition between sections

  • Tension creation

unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the riser begins. length_beats: Duration of the riser in beats (1-16). start_pitch: Starting MIDI pitch (default 36 = C2). end_pitch: Ending MIDI pitch (default 84 = C6). steps: Number of notes in the sweep (8-128, default 32 = sixteenths over 4 beats). curve: Pitch curve — "linear" (even), "exp" (slow start, fast end), "log" (fast start, slow end). velocity: Base velocity (0-1, ramped proportionally with pitch).

Returns notes created and pitch range.

Inputs: curve, steps, velocity, end_pitch, +5 more. Returns: result

mcp_opendaw_create_rnb_arrangementA

Create a full modern R&B arrangement — trap-influenced drums + deep sub bass + extended chords + vocal-style lead.

Contemporary R&B (The Weeknd / Frank Ocean / SZA / Brent Faiyaz) — dark, atmospheric, slow-burn:

  • Track 0: Drums — half-time R&B groove: kick on 1 with syncopated ghost, snare/clap on 3, triplet hi-hat rolls. Programmable feel — not live, but loose. Half-time at 68 BPM feels like 34 BPM.

  • Track 1: Bass — deep sub bass: long sustained root notes, occasional octave/fifth movement. More sustain than soul, less movement than funk. The low-end foundation — felt more than heard.

  • Track 2: Chords — dark extended voicings (min9, maj7, dom9, min7b5) on i-VI-III-VII minor-key progression. Rhodes/synth pad texture with long sustains. The Weeknd's signature dark harmony — minor key with lush 9ths.

  • Track 3: Lead — vocal-style melodic phrases: wide interval leaps, pentatonic minor with blue notes, long sustained notes with melismatic fills. Call-and-response phrasing — the "sung" quality without actual vocals.

At 68 BPM (default), this creates the contemporary R&B pocket — slow, atmospheric, dark. The i-VI-III-VII progression (same as synthwave but with extended chords and half the tempo) is the modern R&B harmonic language. Half-time drums + sub bass + dark 9ths = The Weeknd "After Hours" aesthetic.

bpm: Tempo (55-85, default 68 = modern R&B sweet spot). bars: Arrangement length (4-16, default 8). Must be multiple of 4. root: Root note (C minor = dark R&B key, common for The Weeknd). octave: MIDI octave for bass (2 = C2=36, sub bass register). unit_index: AU index with note tracks. drum_track / bass_track / chord_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_rnb_arrangement(bpm=68, root="C", bars=8) create_rnb_arrangement(bpm=75, root="Ab", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_rock_arrangementA

Create a full rock arrangement — rock beat drums + bass + power chords + riff across 4 tracks.

Classic rock with blues-based harmony and guitar-driven energy:

  • Track 0: Drums — rock beat: kick on 1 & 3, snare on 2 & 4, with crash on downbeats and fills at bar transitions. The backbone.

  • Track 1: Bass — root-fifth bassline locking with kick drum, with walks between chord changes. Blues-based, driving.

  • Track 2: Guitar — power chords (root+fifth) on chord changes, with palm-muted downstrokes between. The defining instrument.

  • Track 3: Keys — sustained chord pads backing the guitar, filling the midrange. Optional but adds depth.

At 120 BPM (default), this creates a mid-tempo rock feel. The I-IV-V blues-based harmony (A-E-D for key of A, or E-A-D for key of E) is the foundation of rock from Beatles to AC/DC. Power chords are the signature — root+fifth voicings, no third (ambiguous major/minor).

bpm: Tempo (90-160, default 120 = mid-tempo rock). bars: Arrangement length (4-16, default 8). root: Root note (E is the most common rock guitar key — open strings). octave: MIDI octave for bass (2 = E2=40, standard bass register). unit_index: AU index with note tracks. drum_track / bass_track / guitar_track / keys_track: Track indices.

Returns notes created per track and total.

Example: create_rock_arrangement(bpm=120, root="E", bars=8) create_rock_arrangement(bpm=140, root="A", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_rondoA

Create a rondo — recurring theme alternating with contrasting episodes.

A rondo is a structural form where a principal theme (A) alternates with contrasting episodes (B, C, D). The theme always returns, providing unity while episodes provide contrast and development.

Form types:

  • simple: ABA (3 sections). Miniature rondo, common in character pieces.

  • classical: ABACA (5 sections). Standard classical rondo (Mozart, Beethoven). A=tonic, B=dominant/relative, C=more distant.

  • seven_part: ABACABA (7 sections). Large rondo, Beethoven Op.51, Chopin Op.16. Extended with second return of B before final A.

  • pop_rock: ABABCB (6 sections). Pop/rock structure masquerading as rondo — verse-chorus-verse-chorus-bridge-chorus. A=verse, B=chorus, C=bridge.

  • jazz: ABAC (4 sections). Jazz standard form — theme, improvisation feel, theme, contrast. A=head, B=solo section, C=trading.

Key root: C, C#, Db, D, ... B. Scale: major, minor, dorian, phrygian, lydian, mixolydian, aeolian, locrian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues, whole_tone.

The A theme uses tonic scale degrees (0, 2, 4, 2, 0). B episode uses dominant/relative degrees (4, 6, 2, 6, 4) — brighter. C episode uses more distant degrees (5, 1, 3, 1, 5) — contrasting. Each section is bars_per_section bars long.

Creates sections sequentially on track_index (melody on track_index, bass on track_index+1).

Inputs: key_root, velocity, form_type, tempo_bpm, +5 more. Returns: result

mcp_opendaw_create_samba_patternA

Create a Brazilian samba percussion ensemble pattern — multi-instrument layered groove.

Samba is the heartbeat of Brazilian music — a multi-instrument percussion ensemble where each drum has its own pattern, and the layers interlock to create a dense, driving groove. Unlike songo (a single drum-kit pattern), samba is an ensemble: each instrument plays independently, and the combination creates the full sound. Batucada (the carnival samba style) can have 300+ percussionists, each on one drum.

The 5 core instruments:

  1. SURDO — The bass drum. Plays on beats 1 and 3 (the "floor"). Low, resonant, the heartbeat. Surdo marcado (marked) = steady, surdo virado (turned) = syncopated.

  2. CAIXA — The snare drum. Plays continuous 16th notes with a backbeat accent on beats 2 and 4. The "glue" of the ensemble, filling the middle register.

  3. TAMBORIM — Small handheld drum. Plays a syncopated 16th pattern with rim taps, the "conversation" layer. Often uses "virada" (turn) fills.

  4. CHOCALHO — Shaker. Plays continuous 16th notes, the "wash" that keeps the time steady. Always present, rarely varied.

  5. REPIQUE — Lead drum. Plays calls, fills, and syncopated accents that cue the ensemble. The "conductor" of the bateria.

styles: "batucada" — Carnival samba (Rio de Janeiro). Dense, fast, all 5 instruments. Surdo on 1+3, caixa 16ths, tamborim syncopated, chocalho 16ths, repique accents. "samba_enredo" — Samba school parade style. More structured, surdo patterns more varied, repique has call-and-response. "pagode" — Backyard samba (informal). Lighter, no repique, tamborim simpler. More swing, less density. "samba_funk" — Samba-funk fusion. Surdo pattern funkier, caixa with ghost notes, tamborim 16ths, chocalho offbeats.

bars: Pattern length (2-16, even for 2-bar cycle). velocity: Base velocity (0-1). surdo_pitch: Surdo (bass drum) MIDI pitch (36 = C1). caixa_pitch: Caixa (snare) MIDI pitch (38 = D1). tamborim_pitch: Tamborim MIDI pitch (42 = F#1). chocalho_pitch: Chocalho (shaker) MIDI pitch (46 = A#1). repique_pitch: Repique (lead drum) MIDI pitch (50 = D2).

Args: bars: Pattern length in bars (2-16, even). style: Samba style (batucada, samba_enredo, pagode, samba_funk). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. surdo_pitch: Surdo MIDI pitch. caixa_pitch: Caixa MIDI pitch. tamborim_pitch: Tamborim MIDI pitch. chocalho_pitch: Chocalho MIDI pitch. repique_pitch: Repique MIDI pitch.

Returns notes created, instrument breakdown, and pattern info.

Inputs: bars, style, velocity, start_beat, +7 more. Returns: result

mcp_opendaw_create_scale_runA

Create a scale run — ascending or descending scale sequence for fills and transitions.

Generates a sequence of scale notes moving up or down across one or more octaves. Used for drum fills, melodic transitions, lead build-ups, and bass walks.

scale: Scale type (major, minor, dorian, phrygian, blues, etc. — 14 types from music_theory). root: Root note name (C, C#, D, ... B). direction: "up" (ascending) or "down" (descending). octaves: Number of octaves to span (1-4). 1 = 7-8 notes, 2 = 14-15 notes, etc. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. step_duration: Duration of each note in beats (0.125 = 8th triplet, 0.25 = 16th). velocity: Note velocity 0-1. octave: Starting octave (1-7, default 4).

Returns total notes created and scale info.

Example: create_scale_run(scale="minor", root="A", direction="up", octaves=2, step_duration=0.0625)

Inputs: root (required), scale (required), octave, octaves, +6 more. Returns: result

mcp_opendaw_create_second_lineA

Create a New Orleans second line percussion ensemble — street parade groove.

The New Orleans second line beat is one of the foundational rhythms of American music — the root of funk, R&B, and rock drumming. Born from jazz funeral parades and brass band street processions, it combines African rhythmic sensibility with European march tradition.

Instruments:

  1. BASS DRUM — Deep boom. Plays the "street beat": downbeat + syncopated "and" of 2 and 4. The backbone that drives the parade forward.

  2. SNARE DRUM — Backbeat on 2 and 4 with ghost notes on the "e" and "a" of beats. Loose, funky, slightly behind the beat feel.

  3. HI-HAT — Charleston rhythm (beat 1, "and" of 2, beat 3, "and" of 4) or straight 8ths depending on style. The pulse-keeper.

  4. TOM-TOM — Fills at phrase ends, rhythmic calls in Indian style. Adds melodic colour to the percussion arrangement.

  5. CYMBAL — Crash accents on phrase starts. Sparse, ceremonial.

styles: "traditional" — Classic street parade (early 20th century). Steady Charleston hi-hat, backbeat snare, syncopated bass. The original second line groove. "brass_band" — Modern brass band style (Dirty Dozen, Rebirth). Denser, funkier. More ghost notes, tom rolls, 8th-note hi-hat. "mardi_gras_indian" — Mardi Gras Indian style (Wild Tchoupitoulas). Call-and- response between tom and snare. Ritualistic, tribal. Sparse bass, tom-driven. "jazz_funeral" — Dirge to celebration. Bar 1: slow, sparse (dirge on the way to the cemetery). Bar 2: upbeat, driving (celebration on the way back). Dramatic dynamic shift. "bounce" — New Orleans bounce (1980s+, DJ Jimi, Magnolia Shorty). "Triggerman" double-time bass drum, 16th-note hi-hat, backbeat snare. The foundation of NOLA hip-hop.

Args: bars: Pattern length (4-16, even). style: Style name. velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. bass_pitch: Bass drum MIDI pitch (36 = C1). snare_pitch: Snare drum MIDI pitch (38 = D1). hi_hat_pitch: Hi-hat MIDI pitch (42 = F#1). tom_pitch: Tom-tom MIDI pitch (45 = A1). cymbal_pitch: Crash cymbal MIDI pitch (49 = C#2).

Returns notes created, instrument breakdown, and style info.

Inputs: bars, style, velocity, tom_pitch, +7 more. Returns: result

mcp_opendaw_create_section_transitionA

Create a complete section transition in one call — combines multiple automation tools.

The most common arrangement technique: moving from one section to another (verse→chorus, breakdown→drop, intro→main). Each preset combines filter sweeps, volume fades, mute automation, and impacts into a single coordinated transition. Replaces 3-5 individual calls.

transition_type: One of: "drop" — Breakdown→drop: filter close on synths, drums muted, then filter open + unmute + impact "buildup" — Verse→chorus: filter open on lead, volume fade in on pads, snare roll implied "breakdown" — Main→breakdown: filter close on drums, volume fade out on bass, mute synths "intro" — Silence→intro: volume fade in on all, filter open on pads "outro" — Main→outro: volume fade out on all, filter close on lead start_beat: Transition start position in beats. duration_beats: Total transition length in beats (default 16 = 4 bars). unit_indices: Comma-separated AU indices. Convention: drums=0, bass=1, lead/synth=2, pads=3. Adjust to match your arrangement. Default "0,1,2,3".

Returns summary of all automation created across units.

Examples: create_section_transition("drop", start_beat=32, duration_beats=16) → 32-48: filter close on synth, drums muted at 32, filter open at 44, unmute+impact at 48 create_section_transition("intro", start_beat=0, duration_beats=8) → 0-8: volume fade in on all, filter open on pads

Inputs: transition_type (required), start_beat, unit_indices, duration_beats. Returns: result

mcp_opendaw_create_sendA

Create a parallel FX send bus from an audio unit.

Creates a NEW AudioBusBox (FX bus) with its own AudioUnitBox, then sends a copy of src_unit's signal to that FX bus via AuxSendBox. The dry signal continues to the main output unchanged — this is a parallel send, not a redirect.

After creating the send, add effects (Reverb, Delay) to the FX bus unit using add_effect(fx_unit_index, effect_type). The FX bus unit index is returned.

src_unit: Source audio unit index (the instrument sending signal). name: Name for the FX bus (e.g. "Reverb Bus", "Delay Bus"). send_level_db: Send level in dB (-∞ to +12). -6dB is a good starting point. routing: 'pre' (pre-fader) or 'post' (post-fader, default).

Returns send_index on src AU, and fx_unit_index (the new FX bus AU index for adding effects).

Workflow: create_instrument_track → create_send → add_effect(Reverb on fx_unit_index)

Inputs: name (required), routing (required), src_unit (required), send_level_db (required). Returns: result

mcp_opendaw_create_sequenceA

Create a melodic sequence — repeat a pattern at transposed pitch levels.

The most fundamental compositional technique in Western music: take a melodic fragment, repeat it at a different pitch (usually up/down a 4th or 5th). Think baroque sequences (Pachelbel), jazz ii-V-I chains, film score ascending quint sequences, or EDM build-ups with rising motifs.

pattern: Comma-separated MIDI pitches (e.g. "60,62,64,67"). transposition: Semitones to shift each repeat (default 5 = perfect 4th up). Common: 5 (4th), 7 (5th), 2 (major 2nd), -2 (down), -5 (4th down). repeats: Number of transposed repetitions (1-8, default 3). direction: "up" (transpose up), "down" (transpose down), "alternating" (up/down/up...). segment_beats: Duration of each pattern repetition in beats (0.5-16, default 2). velocity_decay: Velocity change per repeat (-0.3 to 0.3). Positive = louder, negative = quieter (fade-out). 0 = constant. unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the sequence begins. velocity: Base velocity 0-1 (default 0.8).

Returns notes created, repeat count, total transposition.

Inputs: pattern, repeats, velocity, direction, +6 more. Returns: result

mcp_opendaw_create_soliA

Create a soli — ensemble unison passage with octave doublings.

A soli is a section where all instruments play the same melodic line in rhythmic unison, typically at different octaves. Common in jazz big band (Basie, Ellington, Herman), orchestral tutti passages, and rock/metal unison riffs. Unlike a fugue (polyphonic imitation) or canon (delayed entry), a soli is simultaneous and homorhythmic.

Melody pattern: space-separated scale degrees (0=root, 2=2nd, 4=3rd, -1=7th below, etc.). Negative = below root. Rhythm pattern: space-separated durations in beats. Key root: C, C#, Db, D, ... B. Scale: major, minor, dorian, phrygian, lydian, mixolydian, aeolian, locrian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues, whole_tone. Voices: 2-5 (e.g. 3 = root octave + 1 octave up + 2 octaves up). Octave spread: how many octaves between lowest and highest voice.

Creates voices on track_index, track_index+1, ... track_index+voices-1.

Inputs: voices, key_root, velocity, scale_name, +6 more. Returns: result

mcp_opendaw_create_soloA

Create a genre-specific melodic solo over a chord progression.

Generates a complete solo line using vocabulary appropriate to the chosen style. Unlike generate_melody (contour-guided) or create_random_walk (stepwise), this tool uses genre-specific soloing techniques:

  • bebop: Chromatic approach tones, chord-tone targeting on strong beats, enclosure (upper+lower chromatic neighbor), bebop scale passing notes, ii-V-I arpeggio fluency. Charlie Parker, Dizzy Gillespie, Clifford Brown.

  • blues: Minor pentatonic + blue notes (b5, b3 bent), repetition of short motifs with variation, call-response phrasing, string-bending aesthetic via pitch slides. B.B. King, Eric Clapton, Stevie Ray Vaughan.

  • rock: Pentatonic positions, repeated riffs, wide interval jumps, rhythmic syncopation, climax-building through register shifts. Jimmy Page, Hendrix, Gilmour.

  • jazz_swing: Swing 8th notes, guide-tone lines, chord-tone on beat 1+3, arpeggio + approach patterns. Lester Young, Sonny Rollins.

  • fusion: Mixolydian/dorian modes, odd-meter phrasing, wide intervals, chromatic passing, rhythmic displacement. Metheny, Brecker, Holdsworth.

solo_type: bebop | blues | rock | jazz_swing | fusion key_root: Root note (C, C#, D, ... B) scale_type: major | minor | dorian | mixolydian | blues | pentatonic_minor bars: Solo length (4-32, default 8) octave: MIDI octave for solo (4 = C4=60) velocity: Base velocity 0-1 seed: PRNG seed for reproducibility

Returns notes created and solo characteristics.

Example: create_solo(solo_type="bebop", key_root="F", scale_type="major", bars=8) create_solo(solo_type="blues", key_root="A", scale_type="blues", bars=12) create_solo(solo_type="rock", key_root="E", scale_type="pentatonic_minor", bars=16)

Inputs: bars, seed, octave, key_root, +6 more. Returns: result

mcp_opendaw_create_solo_automationA

Mute all tracks except the solo track for a beat range, then restore.

Essential production technique: spotlight one element (bass solo, drum break, vocal spotlight) while everything else drops out. Without this you need N separate create_mute_automation calls with coordinated timing — this tool does it in one shot and guarantees all tracks return audible after.

Internally calls create_mute_automation for each non-solo track with events [[0, false], [start_beat, true], [end_beat, false]] — audible before solo, muted during, audible after.

solo_track: Track index that stays audible throughout (0-based). total_tracks: Total number of tracks to manage (e.g. 4 for a 4-track arrangement). start_beat: Beat position where solo begins (others mute). end_beat: Beat position where solo ends (others unmute). unit_indices: Optional comma-separated AU indices (e.g. "0,1,2,3"). If empty, uses 0..total_tracks-1.

Returns per-track mute schedule and confirmation.

Examples:

Drum break: drums solo for 4 beats (1 bar at 120 BPM)

create_solo_automation(solo_track=0, total_tracks=4, start_beat=8, end_beat=12)

Bass spotlight at bar 9

create_solo_automation(solo_track=1, total_tracks=4, start_beat=32, end_beat=40)

Inputs: end_beat (required), solo_track (required), start_beat (required), total_tracks (required), +1 more. Returns: result

mcp_opendaw_create_sonata_formA

Create sonata form — exposition, development, recapitulation.

Sonata form is the structural foundation of classical symphonies, sonatas, string quartets, and concertos from Haydn through Mahler. Three main sections:

  1. EXPOSITION (bars 1-N): Two contrasting themes.

    • Theme 1 in the home key (tonic): stepwise, lyrical, conjunct

    • Transition: modulates from tonic to dominant (or relative major if minor key)

    • Theme 2 in the new key: more rhythmic, wider intervals

    • Closing group: cadential figures in the new key

  2. DEVELOPMENT (bars N+1 to N+M): Fragmentation and modulations.

    • Takes fragments from Theme 1 and Theme 2

    • Sequences through related keys (iii, vi, ii, IV)

    • Builds tension through rising sequences

    • Retransition: dominant pedal leading back to tonic

  3. RECAPITULATION (bars N+M+1 to end): Both themes in the tonic.

    • Theme 1 returns in tonic (as in exposition)

    • NO modulation — Theme 2 now in tonic (not dominant)

    • Closing group in tonic

    • Optional coda (4 bars): final cadential reinforcement

Melody track: track_index. Bass track: track_index + 1. The development section uses sequence-based modulation, the hallmark of classical development technique.

Scale options: major, minor, dorian, phrygian, lydian, mixolydian, aeolian, locrian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues, whole_tone.

Inputs: key_root, velocity, recap_bars, scale_name, +5 more. Returns: result

mcp_opendaw_create_songo_patternA

Create a songo drum pattern — the Cuban drum-kit fusion that revolutionized Latin music.

Songo emerged in the 1970s with Los Van Van (drummer Changuito). It fused son montuno, rumba, jazz, and rock drumming into a single drum-kit pattern — the first time Cuban percussion was adapted to a Western kit. Unlike clave (a timeline), tumbao (congas), or cascara (timbale shell), songo is a complete drum-kit groove: kick + snare + hi-hat + tom accents working together as one synchronized engine. It became the foundation of modern salsa, timba, and Latin jazz drumming.

The pattern is 2 bars in 4/4. Kick plays syncopated bombo notes, snare alternates between rim clicks and open hits, hi-hat plays a continuous 8th-note pattern with accents, and toms fill rhythmic gaps with tonal accents. The feel is loose but locked — every stroke relates to the 3-2 clave without explicitly playing it.

variations: "classic" — Original Los Van Van songo. Kick on 1, 2.5, 4, 6.5. Snare rim clicks on 3, 7. Open snare on 4.5. HH 8ths. "modern" — Timba-era songo (1990s+). Denser kick, ghost snare notes, tom fills on bar 2. More aggressive, busier. "fusion" — Jazz-influenced. Ride-like HH pattern, syncopated kick displacements, brush snare. Los Hermanos approach. "songo_funk" — Songo with funk inflection. Kick on 1, 1.75, 3.5, 4.75. Ghost snare 16ths. Backbeat on 2 and 4. Groove-oriented.

bars: Pattern length (2-16, must be even for 2-bar cycle). velocity: Base velocity (0-1). kick_pitch: MIDI pitch for kick drum (36 = C1). snare_pitch: MIDI pitch for snare (38 = D1). hh_pitch: MIDI pitch for hi-hat (42 = F#1). tom_pitch: MIDI pitch for tom accents (45 = A1).

Args: bars: Pattern length in bars (2-16, even). variation: Pattern variation (classic, modern, fusion, songo_funk). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. kick_pitch: Kick MIDI pitch. snare_pitch: Snare MIDI pitch. hh_pitch: Hi-hat MIDI pitch. tom_pitch: Tom MIDI pitch.

Returns notes created, stroke breakdown, and pattern info.

Inputs: bars, hh_pitch, velocity, tom_pitch, +6 more. Returns: result

mcp_opendaw_create_song_structureA

Create song structure markers for arrangement (intro/verse/chorus/bridge/outro).

Creates labeled markers at section boundaries, enabling agents to reason about song form. Reduces 5-10 marker calls to one structured call.

sections: JSON array of section objects: [{"name": "Intro", "bars": 4}, {"name": "Verse 1", "bars": 8}, ...]. If bars omitted, defaults to 8. Names are used as marker labels. unit_index: AU index (unused but kept for API consistency).

Returns created markers with positions and total duration.

Example: sections='[{"name":"Intro","bars":4},{"name":"Verse","bars":8},{"name":"Chorus","bars":8},{"name":"Outro","bars":4}]'

Inputs: sections (required), unit_index. Returns: result

mcp_opendaw_create_song_with_variationsA

Build a complete song with real musical variations between sections — one call.

Unlike create_genre_sections (which repeats the same loop at different velocities), this creates a song where each section has actual musical variation: drum density changes, bass octave shifts, melody transforms, and track exclusion. All 14 genres supported.

sections: Comma-separated section specs. Each spec is: name:bars:velocity:preset

  • name: Section label (e.g. "verse1", "chorus", "bridge")

  • bars: Length in bars (4-32)

  • velocity: Base velocity 0-1

  • preset: One of:

    • "full" — all tracks, normal density

    • "drums_only" — drums only, others silenced

    • "drums_bass" — drums + bass, no harmony/melody

    • "full_busy" — all tracks, busy drums (density 1.5)

    • "breakdown" — sparse drums (0.3), no bass, inverted melody

    • "melody_transpose5" — full, melody transposed +5 semitones

    • "melody_transposeN" — full, melody transposed N semitones

    • "melody_invert" — full, melody inverted around middle C

    • "melody_reverse" — full, melody retrograde

    • "melody_octave_up" — full, melody up one octave

    • "bass_octave_up" — full, bass up one octave

    • "bass_sub" — full, bass down two octaves (sub bass)

    • "fade" — drums + bass, sparse, low velocity (outro)

    • "drop" — all tracks, busy drums, octave-up bass (climax)

Default: "intro:4:0.5:drums_only,verse1:8:0.8:full,chorus:8:1.0:full_busy, verse2:8:0.8:melody_transpose5,bridge:4:0.6:breakdown,outro:4:0.4:fade" = 36-bar song with 6 varied sections.

apply_mix: If True, calls apply_genre_mix after all sections. apply_humanize: If True, calls apply_genre_humanization after mix. apply_master: If True, calls add_mastering_chain after humanize.

Returns sections created, transforms per section, total notes, and pipeline status.

Example:

36-bar DnB song with 6 varied sections

create_song_with_variations("dnb")

48-bar house epic with custom sections

create_song_with_variations("house", sections="intro:8:0.4:drums_only,build:8:0.7:drums_bass,drop:8:1.0:drop, breakdown:8:0.5:breakdown,drop2:8:1.0:full_busy,outro:8:0.3:fade")

24-bar minimal techno

create_song_with_variations("techno", sections="intro:4:0.5:drums_only,main:8:0.8:full,drop:4:1.0:full_busy,outro:8:0.4:fade", apply_mix=True, apply_humanize=True, apply_master=True)

Inputs: genre (required), bpm, root, sections, +8 more. Returns: result

mcp_opendaw_create_soul_arrangementA

Create a full soul arrangement — gospel drums + melodic bass + Rhodes chords + horn stabs across 4 tracks.

Motown / Stax / Atlantic soul — Otis Redding, Aretha Franklin, Marvin Gaye style:

  • Track 0: Drums — gospel-influenced: steady kick with ghost notes, backbeat snare, ride cymbal with triplet feel. Soul groove is laid-back but deep — the pocket is behind the beat.

  • Track 1: Bass — melodic walking bass: root → fifth → octave → walk to next chord tone. Not just root pumping — soul bass sings.

  • Track 2: Keys — Rhodes/Wurlitzer chord stabs on I-IV-vi-V gospel changes. Warm, gospel-tinged voicings (maj7, min9). The harmonic foundation — church-meets-R&B.

  • Track 3: Horns — Motown horn section: stabs on chord changes, melodic fills at phrase ends. Tight, arranged, call-and-response with vocals.

At 72 BPM (default), this creates the classic slow soul groove — deep pocket, gospel changes, warm Rhodes. The I-IV-vi-V progression is the gospel quartet influence that separates soul from funk (which vamps on one chord) and from pop (which uses I-V-vi-IV). Soul is about feel and melody, not rhythm complexity.

bpm: Tempo (65-90, default 72 = classic slow soul). bars: Arrangement length (4-16, default 8). Must be multiple of 4 for chord changes. root: Root note (C is a warm soul key). octave: MIDI octave for bass (2 = C2=36, standard soul bass register). unit_index: AU index with note tracks. drum_track / bass_track / keys_track / horns_track: Track indices.

Returns notes created per track and total.

Example: create_soul_arrangement(bpm=72, root="C", bars=8) create_soul_arrangement(bpm=80, root="F", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_stabA

Create rhythmic stabs — short chord jabs that define house, disco, funk.

Generates short chord hits on a rhythmic grid. Each 'x' in the rhythm pattern triggers a stab (a short chord with fast decay). Perfect for:

  • House/disco off-beat stabs

  • Funk syncopated chord punches

  • Garage/shuffle stabs

  • Filling gaps between melody notes

chords: JSON array of chord specs, cycled through. Each chord is [root_name, chord_type]. Root names: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (or flats) Chord types: maj, min, dom7, maj7, min7, sus2, sus4, add9, dim, aug Example: '[["C","min7"],["F","min7"]]' cycles between Cm7 and Fm7. Single chord: '[["F","dom7"]]' — same stab repeated. rhythm: Grid pattern using 'x' (stab), '-' (rest), '.' (ghost/light stab). 16th-note grid for one bar (16 chars) or 8th-note grid (8 chars). Examples: "x-x-x-x-" (off-beat 8th stabs), "x---x---" (backbeat), "..x-..x-" (ghost stabs), "xxxx-xxx" (funky busy pattern) unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the pattern starts. octave: Octave for chord voicing (3-6, default 4 = C4 root). velocity: Base velocity for stabs (0-1, ghost stabs use 0.5x). length_beats: Total length of the stab pattern in beats (default 4 = one bar). stab_duration: Duration of each stab in beats (0.0625-1.0, default 0.5 = eighth note).

Returns notes created, chord voicings, and rhythm hits.

Inputs: chords (required), octave, rhythm, velocity, +5 more. Returns: result

mcp_opendaw_create_stutterA

Create a stutter edit — rapid rhythmic repetitions with evolving rate and dynamics.

The classic stutter edit (BT, Imogen Heap, Deadmau5, Skrillex): take a note and repeat it with changing rhythmic density. Unlike create_chop (equal segments) or create_trill (alternating two notes), stutter edit evolves over time — accelerating, decelerating, or shifting accents. Essential for:

  • Build-up transitions before drops

  • Glitch fills at end of phrases

  • Vocal-chop style rhythmic patterns

  • Energy ramps in EDM/hip-hop

pitches: Comma-separated MIDI pitches (1-8, default "60"). Cycles through if repeat_count > len. rate: Base rhythmic subdivision — "16th" (0.25 beats), "32nd" (0.125), "64th" (0.0625), "triplet" (0.167), "triplet32" (0.083). pattern: How rate evolves — "constant" (same spacing throughout), "accelerate" (notes get closer — classic stutter build), "decelerate" (notes spread out — reverse stutter), "ping_pong" (alternate fast/slow), "random" (jittered spacing, seeded). repeat_count: Total repetitions (4-64, default 16). accent_pattern: Velocity accent structure — "none" (all equal), "downbeat" (every 4th accented), "1_and" (1st + 3rd accented), "1_e_and_a" (1st strongest, 3rd medium), "every_other" (alternating accent). velocity_ramp: Dynamic envelope — "constant", "fade_in", "fade_out", "fade_in_out", "build" (exponential increase). gate: Portion of each step with sound (0.3-1.0, default 0.85). Lower = more gaps = choppy. pitch_jitter: Random pitch variation in semitones (0-12, default 0). 0 = exact repeat. unit_index: AU index with note track (-1 = auto-find). track_index: Note track index. start_beat: Position in beats. velocity: Base velocity (0-1). seed: Random seed.

Returns notes created, pattern, rate, total length.

Inputs: gate, rate, seed, pattern, +9 more. Returns: result

mcp_opendaw_create_synth_trackA

Create a new instrument audio unit with a synthesizer device and a note track.

Unlike create_instrument_track (which creates a Tape device for audio playback), this creates a MIDI synthesizer that responds to notes from create_note.

synth_type: 'vaporisateur' (subtractive synth, default), 'nano' (simple synth), 'soundfont' (SF2 player, needs sample), 'apparat' (FM synth). name: Display name for the instrument.

Returns unit_index and track_index for use with create_note.

Inputs: name (required), synth_type (required). Returns: result

mcp_opendaw_create_synthwave_arrangementA

Create a full synthwave arrangement — retro drums + arpeggiated bass + dreamy pads + nostalgic lead across 4 tracks.

80s-inspired synthwave with the signature nostalgic feel — fundamentally different from other electronic genres:

  • Track 0: Drums — retro four-on-floor: kick on every quarter (softer than house), snare on beats 2 & 4, closed hats on all 8ths. The classic 80s drum machine feel — driving but not aggressive, nostalgic not punchy.

  • Track 1: Bass — ARPEGGIATED 16th notes: the engine of synthwave. Root → octave → fifth → octave pattern, driving and relentless. Not sustained like reggae, not sub-drone like techno — arpeggiated movement.

  • Track 2: Pads — sustained minor chords, full bar length. Dreamy, long release, filling the harmonic space. The nostalgic wash underneath.

  • Track 3: Lead — simple nostalgic melody following chord changes, with echo-like call-and-response. Memorable phrases that breathe.

Uses the classic synthwave progression i-VI-III-VII (Am-F-C-G in A minor) — the four chords that define the genre. Different from pop's I-V-vi-IV (same chords, different order and tonal centre — synthwave is minor-key, pop is major).

At 110 BPM (default), this creates the classic synthwave groove — mid-tempo, nostalgic, driving. The arpeggiated bass is the fundamental difference from all 11 other arrangements: house has off-beat stabs, techno has sub drones, synthwave has relentless 16th-note arpeggios.

bpm: Tempo (90-130, default 110 = classic synthwave). bars: Arrangement length (4-16, default 8). Must be multiple of 4 for chord cycle. root: Root note (A is the classic synthwave key — Am). octave: MIDI octave for bass (2 = A2=45, standard synthwave bass register). unit_index: AU index with note tracks. drum_track / bass_track / pad_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_synthwave_arrangement(bpm=110, root="A", bars=8) create_synthwave_arrangement(bpm=100, root="D", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_taiko_ensembleA

Create a Japanese taiko ensemble — kumi-daiko group drumming with dramatic dynamics.

Taiko (literally "fat drum") is Japanese percussion with a history spanning over a millennium. Modern kumi-daiko (group taiko) was created in the 1950s by Daihachi Oguchi, combining multiple drum types into an ensemble. The defining characteristic is dramatic dynamic contrast — from near silence to thunderous power — and the use of silence (ma) as a structural element.

The four core instruments:

  1. ODAIKO — The largest drum. Deep, resonant, thunderous. Plays sparse, powerful hits that mark structural points. The "earthquake" of the ensemble. Very low pitch.

  2. CHU-DAIKO — Medium drum. The workhorse — plays the main rhythmic patterns. Mid-range pitch, full-bodied tone. Most of the notes.

  3. SHIME-DAIKO — Small, high-pitched drum. Plays fast, tight patterns and timekeeping. The "metronome" of the ensemble. High, snappy.

  4. ATARIGANE — Hand gong (metal). Plays accents and calls. Bright, metallic, piercing. Used for dramatic punctuation.

Stroke vocabulary (kakegoe): DON — Loud center hit (chu-daiko, odaiko) KA — Rim hit (shime-daiko) DOKO — Double hit (don-ko) TSU — Soft, muted stroke SU — Silence / rest (ma)

styles: "miyake" — Miyake-style: steady chu-daiko pulse with dramatic odaiko accents. Low stance, powerful, sustained. 4/4 with syncopated odaiko on 2.5 and 4. Shime plays continuous 8th notes. Atarigane calls on bar starts. "yatai" — Yatai-bayashi: festival style. Faster, more joyous. Shime plays 16th notes, chu-daiko alternates don/doko, odaiko on downbeats. Atarigane on offbeats. "edo" — Edo-bayashi: Edo period festival. Steady, march-like. Chu-daiko on 1 and 3, shime on all 8ths, odaiko sparse (only on phrase ends). Atarigane sparse. "hachijo" — Hachijo-style: soloistic, dramatic. Long odaiko rolls with chu-daiko accents. Ma (silence) between phrases. Sparse but powerful. Slow tempo feel. "omega" — Modern taiko (Kodo-style). Dense, aggressive, contemporary. All four instruments at high density. Odaiko on every beat, chu-daiko 16ths, shime 32nd rolls, atarigane accents. Maximum energy.

Args: bars: Pattern length in bars (4-32, even). style: Style name (miyake, yatai, edo, hachijo, omega). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. odaiko_pitch: Odaiko (large drum) MIDI pitch (35 = B0). chu_daiko_pitch: Chu-daiko (medium drum) MIDI pitch (38 = D1). shime_pitch: Shime-daiko (small drum) MIDI pitch (42 = F#1). atarigane_pitch: Atarigane (gong) MIDI pitch (50 = D2).

Returns notes created, instrument breakdown, and style info.

Inputs: bars, style, velocity, start_beat, +6 more. Returns: result

mcp_opendaw_create_talaA

Create an Indian classical tala — cyclic rhythmic structure with vibhag sections and tali/khali markings.

A tala is a cyclic rhythmic framework in Indian classical music. Unlike Western meter (which groups beats into uniform bars), a tala divides its cycle into vibhags (sections) of unequal length, each marked by tali (clap) or khali (wave). The theka — a sequence of named tabla strokes (bols) — defines the characteristic pattern of each tala.

The cycle (avartan) repeats, with the sam (first beat) being the strongest point. Tali beats are played with emphasis; khali beats are played softly (the "empty" section). This dynamic contrast gives Indian rhythm its distinctive breathing quality.

Talas: teental — 16 beats, 4+4+4+4 vibhags. The most common tala. Tali at beats 1, 5, 13; khali at beat 9. Dha-Dhin-Dhin-Dha pattern. ektal — 12 beats, 2+2+2+2+2+2 vibhags. Used in classical vocal and sitar. Tali at 1, 5, 9, 11; khali at 3, 7. jhaptal — 10 beats, 2+3+2+3 vibhags. Asymmetric grouping. Tali at 1, 3, 8; khali at 6. rupak — 7 beats, 3+2+2 vibhags. Unusual — starts with khali (no clap on sam). Tali at 4, 6; khali at 1. dadra — 6 beats, 3+3 vibhags. Light classical, semi-classical. Tali at 1; khali at 4. kehartwa — 8 beats, 4+4 vibhags. Tali at 1; khali at 5.

Laya (tempo): vilambit — slow, 2-beat note duration (sustained strokes) madhya — medium, 1-beat note duration drut — fast, 0.5-beat note duration

Each bol maps to a MIDI pitch representing the tabla stroke character: Dha/Dhin (bayan+dayan) -> lower register (36-38) Ti/Na/Tin/Ta (dayan) -> higher register (46-52)

Args: tala_name: Tala name (teental, ektal, jhaptal, rupak, dadra, kehartwa). cycles: Number of avartan cycles (1-16). laya: Tempo (vilambit, madhya, drut). velocity: Base velocity 0-1. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, vibhag structure, tali/khali positions, and bols sequence.

Inputs: laya, cycles, velocity, tala_name, +3 more. Returns: result

mcp_opendaw_create_techno_arrangementA

Create a full techno arrangement — drums + sub-bass drone + percussive stabs across 3 tracks.

Berlin/Detroit techno with hypnotic, minimalist elements locked together:

  • Track 0: Drums — relentless four-on-floor with industrial hats and claps, the engine

  • Track 1: Bass — sustained sub-bass drone with root shifts per phrase, not rhythmic but continuous — the hypnotic foundation that drives the groove underground

  • Track 2: Stabs — percussive atonal stabs on off-beats, the signature Detroit sound

At 130 BPM (default), this creates the classic warehouse techno feel. The sub-bass drone is the key difference from house — instead of off-beat bass notes, it's a continuous low-end that shifts root notes across phrases, creating tension and release.

bpm: Tempo (125-145, default 130 = classic techno). bars: Arrangement length (8-32, default 8). Techno needs longer forms. root: Root note (C is the classic techno key for sub-bass). octave: MIDI octave for sub-bass (2 = C2=36, low but audible). unit_index: AU index with note tracks. drum_track / bass_track / stab_track: Track indices.

Returns notes created per track and total.

Example: create_techno_arrangement(bpm=130, root="C", bars=8) create_techno_arrangement(bpm=138, root="A", bars=16)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_tempo_rampA

Create a smooth tempo ramp (ritardando or accelerando) across a beat range.

Adds a series of tempo change events with linear interpolation, creating a gradual BPM transition. This is the musical foundation for ritardando (slowing down) and accelerando (speeding up) — essential for expressive transitions, endings, and dramatic section changes.

Uses the same ValueEventBox mechanism as add_tempo_change, but creates multiple events along the beat range for a smooth curve.

start_beat: Beginning of the ramp in beats. end_beat: End of the ramp in beats. start_bpm: Starting BPM (60-240). end_bpm: Target BPM (60-240). curve: "linear" (smooth, default), "exp" (ease-in, gradual start), "log" (ease-out, fast start then settle). steps: Number of tempo events to create (default 16 = smooth ramp). Fewer steps = more stepped/quantized feel.

Returns events created, ramp config, and BPM preview at key points.

Examples: create_tempo_ramp(start_beat=60, end_beat=64, start_bpm=120, end_bpm=90) -> Ritardando: 120->90 BPM over 4 beats (ending slowdown) create_tempo_ramp(start_beat=0, end_beat=8, start_bpm=100, end_bpm=140, curve="exp") -> Accelerando: 100->140 BPM over 8 beats, exp curve (gradual start) create_tempo_ramp(start_beat=32, end_beat=48, start_bpm=140, end_bpm=140) -> No-op ramp (same BPM) — useful as placeholder or for testing

Inputs: end_bpm (required), end_beat (required), start_bpm (required), start_beat (required), +2 more. Returns: result

mcp_opendaw_create_ternary_formA

Create ternary form — ABA with contrasting middle section.

Ternary form (ABA) is one of the most fundamental structures in Western music. The outer A sections are related (often identical, or A' with ornamentation), while the middle B section provides contrast. Used in:

  • Minuet & Trio (Haydn, Mozart): A=minuet, B=trio, A=minuet da capo

  • Da capo aria (Baroque opera): A=main aria, B=contrasting middle emotion, A=ornamented return

  • Chopin Nocturnes: A=lyrical theme, B=agitated middle, A=ornamented

  • Pop/jazz ballads: A=head, B=bridge/solo, A=head out

B section contrast types:

  • trio: Subdominant key (IV), smoother rhythm, thinner texture. Classical minuet & trio.

  • dominant: Dominant key (V), more active rhythm, builds tension. Beethoven scherzo style.

  • relative: Relative minor/major, darker/lighter character. Schubert impromptu middle sections.

  • episode: Same key, completely different melodic material. Chopin nocturne B sections.

  • development: Fragmentation of A material, modulating. Late classical/romantic expansion.

A' (return): If a_prime_ornamented=True, adds passing tones, trill-like ornaments, and slight rhythmic variation to the A material. Da capo aria / Chopin nocturne practice.

Melody on track_index, bass on track_index+1.

Inputs: a_bars, b_bars, key_root, velocity, +6 more. Returns: result

mcp_opendaw_create_time_stretched_clipA

Create a time-stretched audio clip in session view.

sample_id: ID from mcp_opendaw_load_audio. unit_index: Audio unit index. clip_index: Slot index in clip launcher. track_index: Audio track index within AU. bpm: Source BPM of the sample. playback_rate: Playback rate (1.0 = normal, 0.5 = half speed, 2.0 = double). transient_mode: "Pingpong", "Monoton", "Cycles", or "Plode".

Inputs: bpm (required), sample_id (required), clip_index (required), unit_index (required), +3 more. Returns: result

mcp_opendaw_create_time_stretched_regionA

Place a time-stretched audio region on a track.

Unlike place_audio_region (which uses TimeBase.Seconds), this creates a musically-timed region with warp markers. Audio plays back at a different speed while staying in sync with the project tempo.

sample_id: The ID returned by mcp_opendaw_load_audio. unit_index: Audio unit index (default 0). start_beat: Beat position to place the region. track_index: Track index within the audio unit (default 0). playback_rate: Rate multiplier (1.0 = original, 0.5 = half-speed, 2.0 = double). transient_mode: "once", "repeat", or "pingpong" (default). bpm: Source BPM of the sample (for warp marker calculation).

Returns position, duration in PPQN, and playback rate.

Inputs: bpm (required), sample_id (required), start_beat (required), unit_index (required), +3 more. Returns: result

mcp_opendaw_create_track_regionA

Create a region on any track (note or value) using the generic createTrackRegion API.

Automatically detects track type and creates the appropriate region:

  • Note track → NoteRegionBox with NoteEventCollection

  • Value track → ValueRegionBox with ValueEventCollection Returns Option.None (error) for audio tracks — use place_audio_region instead.

unit_index: Audio unit index (-1 = search all AUs). track_index: Track index within the AU. start_beat: Beat position for the region. duration_beats: Duration in beats. name: Display name (empty = auto: "Notes" or "Automation"). hue: Color 0-360 (-1 = auto from track type).

Returns region UUID, type, and position.

Inputs: hue (required), name (required), start_beat (required), unit_index (required), +2 more. Returns: result

mcp_opendaw_create_trance_arrangementA

Create a full trance arrangement — driving drums + rolling bass + supersaw arp + pluck lead across 4 tracks.

Uplifting trance with the signature euphoric energy — fundamentally different from other electronic genres:

  • Track 0: Drums — driving four-on-floor: kick on every quarter (hard, consistent), clap on 2 & 4, open hat on off-beats (0.5, 1.5, 2.5, 3.5). The relentless pulse of trance — harder than synthwave, faster than house. Optional snare rush buildup on last bar of each 4-bar phrase.

  • Track 1: Bass — rolling off-beat pattern: 8th notes on the "and" of every beat (0.5, 1.5, 2.5, 3.5), NOT on the quarter. Creates the "rolling" feel that drives trance forward. Root → octave alternation per bar. Different from house (off-beat stabs) — trance bass is sustained 8ths.

  • Track 2: Supersaw arp — layered chord stabs on quarter notes: root position triad (root + third + fifth) played as 16th-note arpeggio pattern per beat. The euphoric wall of sound. i-VI-III-VII progression.

  • Track 3: Pluck lead — staccato synth plucks: short melodic phrases following chord changes, mostly off-beat with occasional downbeats. The "-answer" to the supersaw's "call". Echo-like spacing.

Uses the classic trance progression i-VI-III-VII (Am-F-C-G transposed) — same as synthwave but faster and euphoric, not nostalgic. The energy is in the supersaw arp (wall of sound) and rolling bass (relentless 8ths).

At 138 BPM (default), this creates classic uplifting trance — fast, driving, euphoric. The rolling off-beat bass is the fundamental difference from all 12 other arrangements: house has off-beat stabs (short), techno has sub drones (sustained), synthwave has 16th arpeggios (melodic), trance has rolling 8ths (driving, off-beat, sustained).

bpm: Tempo (128-145, default 138 = classic uplifting trance). bars: Arrangement length (8-16, default 8). Must be multiple of 4. root: Root note (F is a classic trance key — Fm). octave: MIDI octave for bass (2 = F2=41, standard trance bass register). unit_index: AU index with note tracks. drum_track / bass_track / arp_track / lead_track: Track indices.

Returns notes created per track and total.

Example: create_trance_arrangement(bpm=138, root="F", bars=8) create_trance_arrangement(bpm=140, root="C", bars=16)

Inputs: bpm, bars, root, octave, +7 more. Returns: result

mcp_opendaw_create_trap_arrangementA

Create a full trap arrangement — drums + 808 bass + bell melody across 3 tracks in one call.

Trap arrangement with all elements locked together:

  • Track 0: Drums — trap hi-hat rolls with triplet bursts, syncopated kick, snare on 3

  • Track 1: Bass — 808 sub-bass slides: long sustained notes with pitch slides, characteristic trap bass that glides between root notes

  • Track 2: Melody — bell/glockenspiel plucks in minor key, sparse and atmospheric

At 140 BPM (default), this creates the modern trap sound. The 808 bass slides are the signature — long glides between root notes that create the dark, menacing low-end. The bell melody floats above with sparse minor-key phrases.

bpm: Tempo (130-160, default 140 = modern trap). bars: Arrangement length (4-32, default 8). root: Root note (F# minor is the most common trap key). octave: MIDI octave for 808 bass (1 = C1=24, sub-bass territory). unit_index: AU index with note tracks. drum_track / bass_track / melody_track: Track indices.

Returns notes created per track and total.

Example: create_trap_arrangement(bpm=140, root="F#", bars=8) create_trap_arrangement(bpm=150, root="A", bars=16)

Inputs: bpm, bars, root, octave, +6 more. Returns: result

mcp_opendaw_create_trap_rollsB

Create trap hi-hat roll patterns — the evolving density technique that defines modern trap.

Trap rolls are hi-hat patterns that start sparse and build density through triplet bursts, 32nd-note runs, and "skrrt" stutter patterns. The hats evolve within each bar — from steady 8ths to 16ths to triplet rolls — creating the cascading, restless energy of modern trap. Kicks syncopate underneath, snares/claps anchor on beat 3.

roll_type: "modern" — Modern trap: steady 16ths with triplet rolls on bar transitions. Hats evolve 8th→16th→triplet within each 2-bar phrase. Kick on 1, "and of 2", and 3.5. Snare on 3. Travis Scott "Sicko Mode", Drake "God's Plan". The default trap sound of 2018-2025. "migos" — Migos style: rapid triplet bursts on every "and" of beats 1-2, sparse on 3-4, then fill into next bar. Kick on 1 and 3. Snare on 2 and 4. Offset/Migos "Bad and Boujee" triplet flow. "bubble" — Atlantan "bubble" hats: continuous 16ths with periodic doubles (two 32nd hits) creating a bouncing feel. Kick on 1 and 3.5. Snare on 3. Young Thug / Future "Mask Off" style. "skrrt" — Skrrt pattern: stuttering hat bursts that mimic the sound of screeching tires. Short rapid groups (3-4 hits) with gaps. Kick on 1, 2.66, 3. Snare on 3. Playboi Carti / 21 Savage. "evolving" — Evolving density: starts with just 8th hats in bar 1, adds 16ths in bar 2, triplet rolls in bar 3, full 32nd cascade in bar 4. Builds tension across 4 bars. Metro Boomin production style.

bars: Pattern length (2-16, 2 = one phrase cycle, 4 recommended for evolving). kick_pitch: MIDI pitch for kick (36 = C1). snare_pitch: MIDI pitch for snare/clap (38 = D1). hat_pitch: MIDI pitch for hi-hats (42 = F#1). velocity: Base velocity 0-1. Hats -0.15, ghost hats -0.3.

Returns notes created, roll type, and stroke breakdown.

Example: create_trap_rolls(roll_type="modern", track_index=0) create_trap_rolls(roll_type="evolving", track_index=1, bars=4)

Inputs: bars, velocity, hat_pitch, roll_type, +5 more. Returns: result

mcp_opendaw_create_trillA

Create a trill — rapid alternation between two notes.

A fundamental ornament used across classical (baroque trills, mordents), jazz (shake), metal (tremolo picking), and electronic (LFO-like patterns). Two notes alternate at the specified rate for the given duration. Upper note can be accented (baroque style) or both equally loud.

lower_pitch: Lower MIDI note of the trill (default 60 = C4). upper_pitch: Upper MIDI note, typically 1-2 semitones above (default 62 = D4). rate: Trill speed — "32nd", "16th", "8th", "32t" (triplet 32nd), "16t" (triplet 16th). duration_beats: Total length of the trill in beats (0.5-32, default 4 = 1 bar at 4/4). accent_upper: If true, upper note is louder (baroque style). If false, equal velocity. start_with_upper: If true, trill starts on upper note (some baroque conventions). velocity: Base velocity 0-1 (default 0.85). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the trill begins.

Returns notes created, rate, note count.

Inputs: rate, velocity, start_beat, unit_index, +6 more. Returns: result

mcp_opendaw_create_tumbaoA

Create an Afro-Cuban tumbao (conga) pattern — the rhythmic foundation of salsa.

The tumbao is played on congas and interacts with the clave to create the Afro-Cuban groove. The pattern features open tones (resonant, sustained), closed tones (muffled, short), and slaps (sharp, percussive). The open tone on the "and of 4" is the signature — it anticipates the downbeat.

tumbao_type: "salsa" — Standard salsa tumbao. 2-bar pattern: Bar 1: tone on &2, open on &4 Bar 2: tone on &2, open on 4 (downbeat) "salsa_slap" — Salsa with slap on beat 2 of bar 2 "rumba" — Rumba tumbao (guaguancó). Simpler, more open tones. "bolero" — Bolero tumbao. Slower feel, fewer strokes.

bars: Pattern length (2 = one tumbao cycle, repeat for longer). low_pitch: MIDI pitch for closed tones (low conga). open_pitch: MIDI pitch for open tones (mid conga). slap_pitch: MIDI pitch for slaps (high conga). velocity: Base velocity 0-1. Open tones +0.1, slaps +0.15.

Returns notes created, tumbao type, and stroke breakdown.

Example: create_tumbao(tumbao_type="salsa", track_index=0) create_tumbao(tumbao_type="salsa_slap", track_index=1, bars=4)

Inputs: bars, velocity, low_pitch, open_pitch, +5 more. Returns: result

mcp_opendaw_create_tuplet_groupA

Create a tuplet group — irrational rhythm subdivision within a time span.

A tuplet divides a time span into N equal parts instead of the normal subdivision. Triplets (3 in 2), quintuplets (5 in 4), septuplets (7 in 4) create rhythmic tension by violating the expected duple meter.

Unlike polyrhythm (multiple voices with different periods) or additive rhythm (unequal groupings), tuplets subdivide a single time span into an irrational number of equal parts — creating a "squeezed" or "stretched" feel within one voice.

Common tuplets: 3 in 2 — triplet (most common, jazz swing, Irish jigs) 5 in 4 — quintuplet (Chopin, Ligeti, modern jazz) 7 in 4 — septuplet (Ferneyhough, new complexity) 11 in 4 — undecuplet (extreme irrational meter) 2 in 3 — duplet (2 notes in triplet space, compound meter)

Args: root: Root note name (C, C#, D, ...). scale: Scale name (major, minor, dorian, etc.). tuplet_number: Number of notes to fit in the span (2-16). 3=triplet, 5=quintuplet, 7=septuplet, etc. span_beats: Time span in beats that the tuplet occupies (0.25-8.0). 1.0 = quarter note span, 2.0 = half note span. base_division: The normal subdivision the tuplet replaces (1-8). 2 = duplet (normal), so triplet = 3 in 2. 4 = sixteenths, so quintuplet = 5 in 4. repeats: Number of times the tuplet repeats (1-16). octave: Starting MIDI octave (1-6). pitch_mode: Pitch assignment mode (scale_asc, scale_desc, chord, repeated, alternating). rest_positions: Comma-separated tuplet positions that are rests (0-indexed). E.g., "2,4" = positions 2 and 4 are rests. velocity: Base velocity 0-1. accent_first: If True, first note of each tuplet gets accent. unit_index: AU index. track_index: Note track index. start_beat: Starting beat position.

Returns notes created, tuplet ratio, and timing info.

Inputs: root, scale, octave, repeats, +10 more. Returns: result

mcp_opendaw_create_turnA

Create a turn — circular ornament: main → neighbor → main → other neighbor → main.

The turn (gruppetto) is one of the four essential baroque ornaments (trill, mordent, turn, appoggiatura). It circles around the main note in a four-note flourish. An upper turn goes up first (main → upper → main → lower → main), a lower turn goes down first (main → lower → main → upper → main).

Think Mozart piano concertos, Beethoven sonatas, Bach partitas. The turn adds elegance and circular motion to a sustained note.

main_pitch: The primary MIDI note (default 60 = C4). direction: "upper" (main→up→main→down→main) or "lower" (main→down→main→up→main). interval: Semitones to neighbors (default 2 = whole step). 1 = half step (diatonic). duration_beats: Total length in beats (0.5-4, default 1.0 = quarter note). velocity: Base velocity 0-1 (default 0.85). unit_index: AU index with note track (-1 = find first AU with note tracks). track_index: Note track index within the AU. start_beat: Position in beats where the turn begins.

Returns notes created, pitches used.

Inputs: interval, velocity, direction, main_pitch, +4 more. Returns: result

mcp_opendaw_create_two_hand_pianoA

Create a two-hand piano arrangement — left hand accompaniment + right hand melody.

The fundamental piano pattern: left hand plays accompaniment (Alberti bass, arpeggios, block chords, or bass+chord), right hand plays melody or chord tones. Unlike create_chord_progression (block chords only) or create_melody (single line), this combines both hands into one coherent arrangement.

chords: JSON array of chord specs, same format as create_chord_progression. Example: '[["C","maj7"],["A","min7"],["D","min7"],["G","dom7"]]' left_hand: Accompaniment pattern for left hand: "block" — full chord sustained for chord_duration "arpeggio_up" — ascending arpeggio (root-third-fifth-octave) "arpeggio_down" — descending arpeggio "arpeggio_updown" — ascending then descending "alberti" — classic Alberti bass (root-third-fifth-third) "bass_chord" — bass note on beat 1, chord for remaining beats right_hand: Right hand pattern: "chord_tones" — top note of each chord as sustained melody "arpeggio" — arpeggiated chord in right hand (higher octave) "melody" — custom melody from melody_pitches parameter melody_pitches: Comma-separated MIDI pitches for right hand melody (only used when right_hand="melody"). Spans entire progression evenly. bass_octave: MIDI octave for bass notes (2 = C2=36). chord_octave: MIDI octave for left hand chords (3 = C3=48). melody_octave: MIDI octave for right hand (5 = C5=72). chord_duration: Length of each chord in beats (4 = one bar at 4/4). arpeggio_rate: Duration of each arpeggio note in beats (0.5 = eighth notes). unit_index: AU index with a note track. track_index: Note track index within the AU. start_beat: Where the arrangement starts (0 = bar 1). velocity: Base velocity 0-1 (left hand slightly quieter).

Returns notes created, left/right hand voicings, and chord count.

Inputs: chords (required), velocity, left_hand, right_hand, +9 more. Returns: result

mcp_opendaw_create_value_clipA

Create a value clip (automation clip) on an automation track in session view.

Uses ProjectApi.createValueClip — creates a ValueClipBox with an empty ValueEventCollectionBox on the specified automation (Value-type) track.

unit_index: Audio unit index. track_index: Automation track index (-1 = first automation track on the unit). name: Clip label. clip_index: Clip slot index (0-based).

Returns clip creation details.

Inputs: name (required), clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_create_variationsA

Create thematic variations from an existing note region.

Reads notes from a source region and generates N variations, each written to a new region on the target track. Each variation applies a transformation: transpose, invert, reverse, augment, diminish, fragment, or octave_shift. This is the fundamental compositional technique of theme-and-variations (Bach Goldberg, Beethoven Diabelli, Brahms, jazz reharmonization).

source_unit: AU index of the source notes. source_track: Note track index within the source AU. source_region: Region index to read from (0 = first region). variations: Comma-separated variation specs. Each spec is: "transpose:N" — transpose by N semitones (e.g. transpose:5, transpose:-7) "invert" — invert around middle C (axis=60) "invert:N" — invert around pitch N "reverse" — reverse note order (keep positions relative) "augment:N" — multiply durations by N (e.g. augment:2 = double) "diminish:N" — divide durations by N (e.g. diminish:2 = halve) "fragment" — keep only notes on beats (quantize to beat boundaries) "octave_up" — shift up one octave (+12) "octave_down" — shift down one octave (-12) Example: "transpose:5,invert,reverse,augment:2,octave_down" target_unit: AU index for variations (-1 = same as source). target_track: Track index for variations (-1 = same as source). start_beat: Starting beat for first variation. spacing_beats: Gap between variations in beats (0 = each starts after previous ends).

Returns notes per variation, total notes, variation count.

Inputs: source_unit (required), source_track (required), start_beat, variations, +4 more. Returns: result

mcp_opendaw_create_voice_exchangeA

Create a voice exchange — imitative counterpoint where motifs pass between voices.

A voice exchange is a contrapuntal technique where melodic material is passed between two or more voices. Voice A states a motif, Voice B responds with the same motif (transposed, inverted, or retrograded), creating a dialogic texture. This is the foundation of fugue, canon, and Renaissance polyphony.

Unlike clone_track (exact copy) or copy_notes_to_track (direct clone), voice exchange transforms the material as it passes between voices:

  • Imitation: same motif at a different pitch level

  • Inversion: motif inverted (intervals flipped)

  • Retrograde: motif reversed in time

  • Retrograde-inversion: both reversed and inverted

  • Augmentation: motif stretched in time

  • Diminution: motif compressed in time

With swap=True, the source notes are also moved to the target register, creating a true voice exchange where the voices cross.

Args: unit_index: AU index. source_track: Source note track index (contains the original motif). source_region: Source region index (0 = first region). target_track: Target note track index (where the response goes). target_region: Target region index (0 = first region). exchange_mode: Transformation mode (imitation, inversion, retrograde, retrograde_inversion, augmentation, diminution). interval: Pitch interval for imitation (semitones). Default 7 = perfect fifth. transpose: Additional semitone transpose on top of interval. time_offset: Time offset in beats before the response starts. Default 2.0 = response begins 2 beats after source starts. duration_factor: Duration multiplier (1.0 = same, 2.0 = augmentation, 0.5 = diminution). Overrides augmentation/diminution modes. velocity_factor: Velocity multiplier for the response voice. swap: If True, also swap source notes to target register (true exchange).

Returns notes created, transformation mode, and exchange statistics.

Inputs: unit_index (required), swap, interval, transpose, +8 more. Returns: result

mcp_opendaw_create_voice_led_progressionA

Create chord pads with smooth voice leading — minimal movement between chords.

Unlike create_chord_pads (which voices every chord in root position causing large jumps), this tool re-voices each chord so individual voices move as little as possible. Common tones stay stationary, other voices resolve by nearest semitone step. The result: strings/pads that glide instead of jump.

progression: Hyphen-separated chords (same format as create_chord_pads). "Am-F-C-G" = i-VI-III-VII in A minor. "C-Am-F-G" = I-vi-IV-V in C major. "Dm7-G7-Cmaj7-Am7" = ii-V-I-vi in C (jazz).

bars_per_chord: Bars per chord (default 4). octave: Center octave for voicing range (3 = C3-C4 register, typical pads). velocity: Note velocity (0-1, default 0.65). unit_index: AU index with note tracks. track_index: Track for chord pads (typically 2 = harmony). start_beat: Where the progression starts. note_duration: Sustain length in beats (default 3.8 = near-full bar). voice_range: Max semitone span from center pitch for each voice (default 12 = one octave either side of center). Prevents voices from drifting too high or low. 7 = tighter, 18 = wider range.

Returns chord voicings, voice movements, and total notes.

Voice leading algorithm:

  1. First chord: root-position voicing centered on octave.

  2. For each subsequent chord: a. Find all pitch-class rotations/inversions of the chord. b. For each candidate voicing, compute total voice movement (sum of semitone distances from previous voicing, by voice index). c. Pick the voicing with minimal total movement. d. Constraint: each voice stays within ±voice_range of center.

  3. Common tones naturally stay (distance 0 = optimal).

Inputs: octave, velocity, start_beat, unit_index, +5 more. Returns: result

mcp_opendaw_create_volume_fadeA

Create a volume fade automation on an audio unit — fade in or fade out.

The most common mix technique for intros, outros, breakdowns, and section transitions. Creates volume automation events on the AU's volume parameter, ramping from one dB level to another. Uses exponential curve by default (natural for amplitude perception).

unit_index: AU index. direction: "out" (fade out, volume decreases) or "in" (fade in, volume increases). start_beat: Start position in beats. duration_beats: Fade length in beats (default 4 = 1 bar). start_volume_db: Starting volume in dB (default: 0 for out, -60 for in). end_volume_db: Ending volume in dB (default: -60 for out, 0 for in). curve: "exp" (exponential, default — natural for amplitude), "linear", "log". steps: Number of automation points (default 24 = smooth).

Returns events created, fade config, and dB range.

Examples: create_volume_fade(unit_index=0, direction="out", duration_beats=8) → 8-beat fade out from 0 dB to -60 dB, exp curve create_volume_fade(unit_index=2, direction="in", duration_beats=4, end_volume_db=-3) → 4-beat fade in from -60 dB to -3 dB

Inputs: unit_index (required), curve, steps, direction, +4 more. Returns: result

mcp_opendaw_create_walking_bassA

Create a walking bass line over a chord progression.

A walking bass plays four quarter notes per bar, connecting chords through chord tones, passing tones, and approach notes. The bass 'walks' from one chord to the next using scale-wise motion and arpeggios. Essential for jazz, blues, and swing.

chords: JSON array of [root, chord_type] pairs. Example: [["C","maj7"],["A","min7"],["D","min7"],["G","dom7"]] unit_index: AU index. track_index: Note track index. start_beat: Starting beat position. octave: Bass octave (1-3, default 2 = C2=36). velocity: Note velocity 0-1. bars_per_chord: Bars to spend on each chord (1-4). 1 = 4 notes per chord, 2 = 8 notes.

Returns total notes created and bass walk summary.

The walking bass algorithm: Beat 1: chord root (strong) Beat 2: chord tone (3rd, 5th, or 7th) Beat 3: passing tone (scale step between current and next chord) Beat 4: approach note (half-step or scale-step into next chord root)

Example: create_walking_bass(chords='[["C","maj7"],["A","min7"],["D","min7"],["G","dom7"]]', octave=2)

Inputs: chords (required), octave, velocity, start_beat, +3 more. Returns: result

mcp_opendaw_create_warp_markerA

Add a warp marker to a time-stretched or pitch-stretched audio region.

Warp markers define the mapping between musical position (ppqn) and audio time (seconds). The first and last markers are anchors — they pin the start and end of the audio.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. position_beats: Musical position in beats (e.g. 0.0 = start of region). seconds: Audio time in seconds at this position.

Returns the new marker count and the added marker's position/seconds.

Inputs: seconds (required), unit_index (required), track_index (required), region_index (required), +1 more. Returns: result

mcp_opendaw_delete_audio_regionB
Destructive

Delete an audio region from the timeline.

unit_index: Audio unit index. track_index: Audio track index within the AU (type=2). region_index: Region index to delete (0-based).

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_delete_audio_unitA
Destructive

Delete an entire audio unit with all its tracks, effects, and sends.

Uses ProjectApi.deleteAudioUnit() — proper cleanup of all connected boxes. The primary output AU (index 0) cannot be deleted.

unit_index: Audio unit to delete (must be >= 1, as index 0 is the master output).

Inputs: unit_index (required). Returns: result

mcp_opendaw_delete_automation_eventA
Destructive

Delete a single automation event (ValueEventBox) from an automation track.

unit_index: Audio unit index. track_index: Track index within the unit (automation track). event_index: Event index within the track's value region.

Returns success or error.

Inputs: unit_index (required), event_index (required), track_index (required). Returns: result

mcp_opendaw_delete_clipA
Destructive

Delete a clip from a track (session view).

unit_index: Audio unit index. track_index: Track index. clip_index: Clip index to delete (0-based).

Returns remaining clip count.

Inputs: clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_delete_markerA
Destructive

Delete a timeline marker by index.

marker_index: Index from list_markers (0-based).

Inputs: marker_index (required). Returns: result

mcp_opendaw_delete_noteA
Destructive

Delete a single note from a region.

note_index: Index of the note to delete (0-based, as returned by list_notes). unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region containing the note (0-based).

Returns remaining note count.

Inputs: note_index (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_delete_note_regionB
Destructive

Delete a note region from the timeline.

unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region index to delete (0-based).

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_delete_regionA
Destructive

Delete a region from a track.

Removes the region and all its contents (notes for note regions, audio reference for audio regions, automation events for value regions).

track_index: Track index within the AU. region_index: Region to delete (0-based). unit_index: Audio unit index (-1 = search all AUs). region_type: 'note', 'audio', or 'value' (for filtering).

Returns remaining region count on the track.

Inputs: unit_index (required), region_type (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_delete_sectionA
Destructive

Delete all regions within a beat range across all tracks.

Scans all tracks across all specified audio units, finds every region that overlaps the [from_beat, to_beat) range, and deletes each one. This is the arrangement cleanup tool: "clear bars 9-12 so I can put something else there" or "remove the intro (bars 1-4) from all tracks".

Completes the section CRUD trilogy: duplicate (copy), move (cut-paste), delete (remove). One call replaces N delete_region calls.

from_beat: Start of the section to delete (beats). to_beat: End of the section to delete (beats, exclusive). unit_indices: Comma-separated AU indices to scan (default: all AUs).

Returns number of regions deleted, per-track details, and remaining counts.

Examples: delete_section(from_beat=0, to_beat=16) -> Remove first 4 bars from ALL tracks across ALL audio units delete_section(from_beat=32, to_beat=48, unit_indices="0,1") -> Remove bars 9-12 from AUs 0 and 1 only

Inputs: to_beat (required), from_beat (required), unit_indices. Returns: result

mcp_opendaw_delete_signature_changeA
Destructive

Delete a time signature change from the timeline.

Delete by position (closest match) or by index (0-based in sorted order). Pass index=-1 and position_beats=-1 to delete the last event.

position_beats: Position to match (closest event will be deleted). index: 0-based index in sorted order (-1 = use position match).

Returns updated signature event list.

Inputs: index (required), position_beats (required). Returns: result

mcp_opendaw_delete_trackA
Destructive

Delete a track from an audio unit. Removes all regions, clips, and notes on that track.

unit_index: Audio unit index. track_index: Track index within the unit.

Returns success or error.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_delete_warp_markerA
Destructive

Delete a warp marker from a time-stretched or pitch-stretched audio region.

Cannot delete anchor markers (first and last) — they pin the audio mapping.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. marker_index: Warp marker index (0-based, from list_warp_markers).

Returns remaining marker count.

Inputs: unit_index (required), track_index (required), marker_index (required), region_index (required). Returns: result

mcp_opendaw_detect_bpmA
Read-only

Detect BPM (tempo) of an exported WAV file using onset detection + autocorrelation.

Pure Python implementation (no external dependencies):

  1. Parse WAV → mono mixdown

  2. Energy envelope (1024-sample windows)

  3. Onset detection (energy spikes above local average)

  4. Autocorrelation of onset train → dominant periodicity → BPM

Essential for Suno integration: Suno generates at its own BPM, but the openDAW project needs matching tempo. Detect → set_bpm for correct beat alignment when placing stems.

filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns: bpm (60-200), confidence (0-1), onset_count, duration_seconds.

Examples:

After importing a Suno track

result = detect_bpm("suno_track.wav")

→ {bpm: 128.0, confidence: 0.85, onset_count: 240, ...}

Then set project BPM

set_bpm(128)

Inputs: filename (required). Returns: result

mcp_opendaw_detect_frequency_maskingA
Read-only

Detect frequency masking between stems — where instruments compete for the same frequency range.

The #1 mix problem. Bass and kick fight at 60-120Hz. Guitars and vocals mask each other at 2-4kHz. This tool finds these conflicts by comparing the spectral content of exported stems pairwise.

For each pair of stems, computes:

  • overlap_score (0-1): how much their spectra overlap in the same band

  • conflict_bands: which frequency bands have the most masking

  • severity: LOW / MEDIUM / HIGH based on overlap and energy

  • recommendation: specific EQ cut/boost suggestion

filenames: JSON array of stem filenames in exports dir, OR comma-separated list. Example: '["bass.wav","kick.wav","vocals.wav"]' or "bass.wav,kick.wav"

Returns per-pair analysis + prioritized list of masking issues.

Example:

Export stems first, then detect masking

export_stems("track") detect_frequency_masking('["track_bass.wav","track_drums.wav","track_other.wav"]')

→ {masking_issues: [{pair: ["bass","drums"], band: "bass", severity: "HIGH", ...}]}

Inputs: filenames (required). Returns: result

mcp_opendaw_detect_keyA
Read-only

Detect musical key and mode of a WAV file using chroma features + Krumhansl-Schmuckler key profiles.

Pure Python implementation (no external dependencies):

  1. Parse WAV → mono mixdown

  2. Short-time FFT (4096-point, Hann window, 75% overlap) — pure Python radix-2 Cooley-Tukey

  3. Map spectral bins to 12 pitch classes → chroma vector

  4. Correlate chroma with major/minor key profiles for all 24 keys (12 roots × 2 modes)

  5. Best correlation → key + mode

Essential for Suno integration: detect key → build matching chord progression → create_harmonic_arrangement that fits the imported audio. Enables automatic remix pipeline: download → detect_bpm → detect_key → import → generate matching harmony → mix → render.

filename: Name of the WAV file in the exports directory (without path), or absolute path to any WAV file.

Returns: key (e.g. "A"), mode ("major"/"minor"), confidence (0-1), correlation, alternatives (top 3), chroma (12-element list).

Examples:

After importing a Suno track

result = detect_key("suno_track.wav")

→ {key: "A", mode: "minor", confidence: 0.72, ...}

Then build matching progression

create_chord_progression([["Am","G","F","E7"]])

Inputs: filename (required). Returns: result

mcp_opendaw_detect_problemsA
Read-only

Detect technical audio problems — clipping, DC offset, hum, sibilance, mud, harshness.

Scans for 7 common issues that ruin mixes:

  1. Clipping: samples at or near 0 dBFS (digital clipping)

  2. DC offset: non-zero mean (eats headroom, causes clicks on edit boundaries)

  3. Hum: 50/60Hz mains interference (+ harmonics)

  4. Sibilance: excessive 5-8kHz energy bursts (harsh 's' sounds)

  5. Mud: excessive 200-400Hz buildup (cloudy, unclear mix)

  6. Harshness: excessive 2-5kHz energy (fatiguing, piercing)

  7. Resonances: narrow peaks that stick out (room modes, bad recordings)

filename: WAV file in exports dir, or absolute path.

Returns per-problem detection with severity + recommendation.

Example: detect_problems("vocal_stem.wav")

→ {problems: [{type: "dc_offset", severity: "HIGH", value: 0.002, ...}]}

Inputs: filename (required). Returns: result

mcp_opendaw_detect_scale_from_notesA
Read-only

Detect the musical scale/key from MIDI notes in a region.

Analyses the pitch class distribution of all notes in a region and matches it against 15 common scales using Pearson correlation. Unlike detect_key (which works on WAV audio), this works directly on MIDI note data — no audio file needed.

Scales tested (15):

  • major, natural_minor, harmonic_minor, melodic_minor

  • dorian, phrygian, lydian, mixolydian, locrian

  • pentatonic_major, pentatonic_minor, blues

  • hungarian_minor, double_harmonic, whole_tone

Returns:

  • best_match: {scale, root, correlation} — highest scoring scale

  • alternatives: top 5 matches with correlation scores

  • pitch_class_histogram: 12-bin histogram of note pitches

  • note_count: total notes analysed

  • chromatic_coverage: how many of 12 pitch classes are used

  • confidence: qualitative rating (high/medium/low based on correlation)

Use this before:

  • force_scale_notes (to know which scale to force)

  • diatonic_transpose_notes (to know the correct scale)

  • generate_melody (to match existing material's scale)

  • reharmonize_progression (to pick the right key)

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = first region, -2 = all regions on track).

Example: scale = detect_scale_from_notes(0, 0)

best_match: {scale: "natural_minor", root: "A", correlation: 0.87}

→ use force_scale_notes(root="A", scale="natural_minor")

Inputs: unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_diatonic_transpose_notesA

Transpose notes by scale steps (diatonic) instead of semitones (chromatic).

Moves each note up or down by N steps within the specified scale. Unlike transpose_notes (which shifts by fixed semitones), diatonic transpose preserves the scale — C major C→D = +1 step (2 semitones), E→F = +1 step (1 semitone).

Essential for: creating variations that stay in key, modal interchange, sequence construction (moving a motif up the scale), walking bass from scale degrees, and counterpoint writing.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks). region_index: Region index (-1 = all regions on track). steps: Number of scale steps to transpose. +1 = up one step, -1 = down one step, +3 = up a third, -5 = down a fifth. 0 = no change. root_note: Root note of the scale — C, C#, D, D#, E, F, F#, G, G#, A, A#, B. scale: Scale name — major, minor, dorian, phrygian, lydian, mixolydian, pentatonic_major, pentatonic_minor, blues, harmonic_minor, melodic_minor.

Returns per-track note counts transposed.

Inputs: scale, steps, root_note, unit_index, +2 more. Returns: result

mcp_opendaw_displace_rhythmA

Displace all notes in a region by a fixed rhythmic offset — laid-back, push, or circular rotation feel.

Rhythmic displacement shifts notes in time without changing their pitch or duration. This is one of the most expressive production techniques:

  • Laid-back (offset=0.0625 = 1/16 late): drums sit behind the beat, creating a relaxed, hip-hop/R&B feel (J Dilla, Questlove).

  • Pushed (offset=-0.0625 = 1/16 early): notes anticipate the beat, creating urgency and energy (rock, punk, certain jazz).

  • On-top (offset=0): reset any displacement back to original grid.

Two modes:

  • "shift" — add offset to every note's position. Notes can move past the region boundary (region duration auto-extends). Negative offset moves notes earlier; notes before position 0 are clamped to 0.

  • "circular" — rotate the pattern by offset. Notes that go past the region end wrap around to the beginning. This creates entirely new patterns from the same material — a 1/16 rotation of a straight 16th hi-hat pattern creates an off-beat pattern. The region length is preserved.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). offset: Displacement in beats. Positive = later (laid-back), negative = earlier (pushed). Common values: 0.0625 (1/16), 0.125 (1/8), 0.03125 (1/32), 0.25 (1/4). Range -4.0 to 4.0. mode: "shift" (add offset to position, region may extend) or "circular" (rotate within region bounds, region length preserved).

Returns per-track note counts and displacement stats.

Example:

J Dilla laid-back drums — 1/16 note late

displace_rhythm(unit_index=0, track_index=0, offset=0.0625, mode="shift")

Urgent pushed melody — 1/32 early

displace_rhythm(unit_index=0, track_index=3, offset=-0.03125, mode="shift")

Circular rotation — new pattern from same notes

displace_rhythm(unit_index=0, track_index=0, offset=0.125, mode="circular")

Inputs: mode, offset, unit_index, track_index, +1 more. Returns: result

mcp_opendaw_double_melodyA

Double a melody at a parallel interval — thickening and harmonization.

Creates a copy of every note in the region shifted by the specified interval. Unlike copy_notes_to_track (chromatic transpose only), this supports named musical intervals and diatonic transposition (stays in key).

Same-region doubling (dest_track_index=-1) thickens the melody in place. Cross-track doubling (dest_track_index set) creates a separate layer — useful for assigning a different instrument to the doubled line.

Intervals (chromatic mode):

  • octave: +12 semitones (classic doubling)

  • double_octave: +24 semitones (organ/pipe effect)

  • fifth: +7 semitones (power chord, open sound)

  • fourth: +5 semitones (suspended, ambiguous)

  • third: +4 semitones (major third — use diatonic for correct quality)

  • sixth: +9 semitones (wide, romantic)

  • unison: +0 semitones (thickening only, velocity difference)

Diatonic mode (diatonic=True): Uses scale-degree offsets instead of fixed semitones. A diatonic third in C major is +2 scale steps (C→E, D→F, E→G), producing the correct quality (major or minor third) depending on the scale degree. Requires root+scale.

velocity_scale: Doubled line velocity (0.8 = slightly quieter, classic). time_offset: Delay the doubled line (0 = parallel, 0.25 = slight delay).

unit_index: Source AU index. track_index: Source note track index. interval: Named interval (octave/double_octave/fifth/fourth/third/sixth/unison). region_index: Source region (-1 = first region). diatonic: If True, use scale-degree offset (requires root+scale). root: Scale root note (C, C#, D, ... B). scale: Scale name (major, minor, dorian, phrygian, etc.). velocity_scale: Velocity multiplier for doubled notes (0-2). dest_track_index: Destination track (-1 = same region, thickening in place). dest_unit_index: Destination AU (-1 = same as source). time_offset: Beat offset for doubled notes (0 = parallel).

Returns count of notes doubled.

Example:

Octave doubling — thickens melody in place

double_melody(0, 3, "octave", velocity_scale=0.7)

Diatonic thirds on separate track — classic harmony

double_melody(0, 3, "third", diatonic=True, root="C", scale="major", dest_track_index=4, velocity_scale=0.8)

Power-chord doubling

double_melody(0, 3, "fifth", velocity_scale=0.9)

Inputs: unit_index (required), track_index (required), root, scale, +7 more. Returns: result

mcp_opendaw_download_audioA

Download an audio file from a URL (e.g. Suno CDN) to local disk.

Bridges the gap between AI music generators (Suno, Udio) and the DAW: generate a track → get audio URL → download → import_audio_to_tracks. Without this, you need manual curl/wget outside the MCP pipeline.

Supports any HTTP(S) URL pointing to WAV/MP3/FLAC/OGG. Uses streaming download with timeout. Files saved to /tmp by default (or custom dir).

url: Direct URL to the audio file (e.g. Suno CDN audio_url from chirp_generate). filename: Output filename (default: derived from URL path). output_dir: Directory to save (default /tmp). Must exist.

Returns absolute file path, size, and suggested next step (import_audio_to_tracks).

Examples:

Download a Suno track

download_audio("https://cdn.suno.ai/abc123.wav")

Custom name

download_audio("https://cdn.suno.ai/abc123.mp3", filename="my_track.mp3")

Then import with stem splitting

import_audio_to_tracks("/tmp/my_track.mp3", mode="bs6")

Inputs: url (required), filename, output_dir. Returns: result

mcp_opendaw_duplicate_audiounitA

Duplicate an audio unit with all its content: instrument, effects, tracks, regions, notes, automation.

Creates a new audio unit of the same type (Instrument/Audio) with a copy of:

  • Instrument device (same factory type + all parameters)

  • Audio effect chain (same effects + all parameter values)

  • MIDI effect chain (same effects + all parameter values)

  • Note tracks, note regions, and all note events (pitch/duration/velocity/position)

  • Track volume, panning, mute state

  • Audio regions (if any, referencing same audio files)

  • Unit label, volume

unit_index: Source audio unit index to duplicate.

Returns the new unit index and details of what was copied.

Inputs: unit_index (required). Returns: result

mcp_opendaw_duplicate_automation_eventA

Duplicate an automation event within the same region.

Copies the event's position, value, and interpolation. Can offset position and override the value.

unit_index/track_index/region_index: Automation region coordinates. event_index: Event index within the region. position_offset: PPQN offset from original position. value_override: New value (0-1) instead of copying. Omit to copy original.

Returns the new event's position and value.

Inputs: unit_index (required), event_index (required), track_index (required), region_index (required), +2 more. Returns: result

mcp_opendaw_duplicate_effectA

Duplicate a single effect within an AU's effect chain, copying all parameter values.

Addresses upstream issue #273 (Ctrl+D for audio effects) via MCP. Works for both audio and MIDI effect chains.

unit_index: AU index containing the effect. effect_index: Index of the effect to duplicate within its chain. chain_type: "audio" (default) or "midi" — which effect chain to operate on.

Returns the new effect's index and type.

Inputs: unit_index (required), effect_index (required), chain_type. Returns: result

mcp_opendaw_duplicate_note_eventA

Duplicate a note event within the same region with optional position/pitch offset.

Copies the note's position, duration, pitch, velocity, cent, chance, playCount. Can transpose and shift the copy relative to the original.

unit_index/track_index/region_index: Region coordinates. note_index: Note index within the region. position_offset: PPQN offset from original position (default 0 = same position). pitch_offset: Semitone offset from original pitch (default 0 = same pitch).

Returns the new note's position, pitch, and duration.

Inputs: note_index (required), unit_index (required), track_index (required), region_index (required), +2 more. Returns: result

mcp_opendaw_duplicate_note_regionA

Duplicate a note region to a new position.

Copies the region and all its notes to offset_beats after the original. Useful for repeating patterns (e.g. duplicate 1-bar loop to bar 2).

unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region to duplicate (0-based). offset_beats: How far to shift the copy (in beats, e.g. 4.0 = next bar in 4/4).

Returns new region index.

Inputs: unit_index (required), track_index (required), offset_beats (required), region_index (required). Returns: result

mcp_opendaw_duplicate_notesA

Duplicate all notes within a region, shifting them after the last note.

Creates copies of every note in the region, shifted by (max(position+duration) - min(position)). This mirrors the DAW's native "duplicate notes" feature.

unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region whose notes to duplicate (0-based).

Returns count of duplicated notes and shift in beats.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_duplicate_regionA

Duplicate any region (audio, note, or value) using the DAW's built-in duplicateRegion API.

Places the copy right after the original. With find_free_space=True, scans for the first available gap on any track (auto-resolves overlaps). Without it, places on the same track at the original's end position.

unit_index: Audio unit index (-1 = search all AUs). track_index: Track index within the AU. region_index: Region to duplicate (0-based). find_free_space: If True, find the first free space on any track. If False, place directly after the original on the same track.

Returns the new region's position and index.

Inputs: unit_index (required), track_index (required), region_index (required), find_free_space (required). Returns: result

mcp_opendaw_duplicate_sectionA

Duplicate all regions within a beat range to a new position.

Scans all tracks across all specified audio units, finds every region that overlaps the [from_beat, to_beat) range, and copies each one to target_beat with the same relative offset. This is the arrangement operation producers use constantly: "copy verse 1 to bar 17" or "duplicate this 8-bar section after itself".

Works with note regions, audio regions, and automation regions. Preserves all content (notes, audio, automation events).

from_beat: Start of the source section in beats. to_beat: End of the source section in beats (exclusive). target_beat: Where to place the duplicated section (beat 0 = start of project). unit_indices: Comma-separated AU indices to scan (default: all AUs).

Returns number of regions duplicated, per-track details, and new positions.

Examples: duplicate_section(from_beat=0, to_beat=16, target_beat=16) -> Copy first 4 bars (0-16 beats) to beat 16 (bars 5-8) duplicate_section(from_beat=0, to_beat=32, target_beat=32, unit_indices="0,1,2") -> Copy first 8 bars from AUs 0,1,2 to beat 32

Inputs: to_beat (required), from_beat (required), target_beat (required), unit_indices. Returns: result

mcp_opendaw_engine_panicA

Send a panic signal to the engine — stops all notes immediately.

Useful when audio gets stuck (hanging notes, frozen synthesis). Equivalent to a MIDI panic button.

Inputs: no named parameters. Returns: result

mcp_opendaw_engine_sleepA

Put the audio engine to sleep — suspends audio processing to save CPU.

Use wake() to resume. Useful when doing non-audio operations (project editing, box manipulation) and the engine isn't needed.

Inputs: no named parameters. Returns: result

mcp_opendaw_engine_wakeA

Wake the audio engine from sleep — resumes audio processing.

Use after sleep() when audio playback is needed again.

Inputs: no named parameters. Returns: result

mcp_opendaw_evaluate_rawA
Read-only

Execute arbitrary JavaScript in the DAW V8 context and return the result. For power users and debugging — explore openDAW internals directly. The script must be a function body (will be wrapped in an async arrow).

script: JavaScript code to execute. Has access to window.DAW and all DAW_ globals.

Inputs: script (required). Returns: result

mcp_opendaw_expand_intervalsA

Expand or compress melodic intervals by a factor.

Multiplies the interval between each consecutive pair of notes by factor. Values >1 widen the melody (small steps become leaps), values <1 narrow it (leaps become steps). The first note's pitch is kept as anchor (or centered around the mean pitch).

This is a fundamental transformation in motivic development:

  • factor=2.0: seconds become thirds, thirds become fifths

  • factor=0.5: thirds become seconds, fifths become thirds

  • factor=1.5: gentle expansion, more expressive contour

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) factor: Interval multiplier (0.25-4.0). 1.0=no change, 2.0=double all intervals, 0.5=halve all intervals. anchor: Anchor point — "first" = keep first note pitch, expand from there, "center" = keep mean pitch, expand symmetrically, "last" = keep last note pitch, expand backwards. snap_to_scale: Scale name for snapping results ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "" = no snapping, chromatic result). root: Root note for scale snapping (C, C#, D, ... B).

Inputs: unit_index (required), track_index (required), root, anchor, +3 more. Returns: result

mcp_opendaw_explode_chordsA

Explode chords into separate voice tracks.

Takes a chord track and splits each chord into individual voices, distributing them to separate tracks. The lowest note of each chord goes to voice 1 (bass), the next to voice 2, etc. This is the fundamental orchestration technique — converting a chord progression into individual instrumental parts.

Typical use: piano chord track → bass + cello + viola + violin. Or: synth chords → sub bass + pad + lead + pluck.

Args: unit_index: Source AU index with chord track track_index: Source note track index with chords region_index: Source region index (-1 = first region) num_voices: Number of voices to split into (2-8, default 4). Chords with fewer notes than num_voices get rests in higher voices. Chords with more notes than num_voices get extra notes merged into the highest voice. direction: Voice assignment order — "down": lowest note → voice 1 (bass), ascending voices "up": highest note → voice 1 (top), descending voices "outward": middle notes → outer voices, edge notes → inner target_units: Comma-separated AU indices for destination tracks. If empty, creates new AUs automatically. If provided, must have at least num_voices entries (e.g. "0,1,2,3"). velocity_balance: How to distribute velocity across voices — "natural": lower voices slightly louder (bass prominence) "equal": all voices same velocity "top_heavy": upper voices louder (melody prominence) "fade": velocity decreases from voice 1 to voice N

Inputs: unit_index (required), track_index (required), direction, num_voices, +3 more. Returns: result

mcp_opendaw_export_dawprojectA

Export the current project as a .dawproject file (Bitwig/Ableton/rePitch compatible format).

The dawproject format is a ZIP containing project.xml, metadata.xml, and audio samples. This enables interoperability with other DAWs that support the dawproject format.

Args: filename: Output filename (without extension). The .dawproject extension is added automatically.

Returns the file path of the exported .dawproject file.

Inputs: filename. Returns: result

mcp_opendaw_export_dry_stemA

Export a single audio unit as a DRY stem (instrument output, no effects/channel strip).

Unlike export_single_stem (which routes through the channel strip with effects), this captures the raw instrument output before any audio effects, sends, or volume/pan processing. Useful for freezing, flattening, or re-amping workflows where you want the clean instrument signal to process externally.

unit_index: Audio unit index to export (must be > 0, not the output AU). filename: Output filename (without .wav extension). sample_rate: Export sample rate (default 48000).

Returns the path to the exported WAV and audio metadata.

Inputs: filename (required), unit_index (required), sample_rate. Returns: result

mcp_opendaw_export_effect_chainA

Export an effect chain (audio or MIDI) from an AU as a base64 preset.

Uses PresetEncoder.encodeEffects — serializes the effect chain into a preset binary. Can be imported into another AU via import_effect_chain.

unit_index: AU index to export from. effect_type: "audio" for audio effects, "midi" for MIDI effects.

Returns base64 preset bytes, or error.

Inputs: unit_index (required), effect_type. Returns: result

mcp_opendaw_export_midiA

Export a note region's notes as a standard MIDI file (.mid).

Uses @opendaw/lib-midi MidiFileEncoder — converts note events to MIDI with timeDivision=96 (PPQN.Quarter=960 → 96 ticks per quarter).

filename: Output filename (without extension). unit_index: Audio unit index (-1 = search all AUs for note tracks). track_index: Note track index within the AU. region_index: Region to export (0-based).

Returns the saved file path.

Inputs: filename (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_export_mixA

Render the full project mix to a WAV file.

Uses OfflineEngineRenderer (same as render_full). The 'method' parameter is accepted for backward compatibility but always uses offline rendering (faster, no engine needed).

filename: Output filename (without .wav extension). sample_rate: Export sample rate (default 48000). method: 'offline' (default), 'realtime', or 'auto' — all use offline.

Returns the path to the exported WAV and audio metadata.

Inputs: filename (required), method, sample_rate. Returns: result

mcp_opendaw_export_presetA

Export an audio unit as a preset (base64-encoded binary).

Uses PresetEncoder.encode — serializes the AU with all dependencies (instrument, effects, MIDI effects, optionally tracks/regions/notes) into a binary preset format. Output is base64-encoded for transport over JSON.

unit_index: AU index to export (must be an instrument, not Output). include_timeline: If true, include tracks/regions/notes in the preset.

Returns base64-encoded preset bytes and metadata, or error.

Inputs: unit_index (required), include_timeline. Returns: result

mcp_opendaw_export_single_stemA

Export a single audio unit as a stem WAV with its effect chain applied.

Unlike export_stems (which exports ALL stems in one pass), this exports just one AU — faster when you only need a specific stem.

unit_index: Audio unit index to export (must be > 0, not the output AU). filename: Output filename. sample_rate: Export sample rate.

The stem includes all effects on that AU's chain (EQ, compression, reverb, etc).

Inputs: filename (required), unit_index (required), sample_rate (required). Returns: result

mcp_opendaw_export_stemsA

Export each audio unit as a separate stem WAV file.

Uses OfflineEngineRenderer with per-AU ExportConfiguration. Each instrument AU gets its own stem with effects included. Returns list of exported stem files.

Workflow: create_instrument_track(s) → load_audio → place_audio_region(s) → add_effect(s) → export_stems

Inputs: sample_rate (required), filename_prefix (required). Returns: result

mcp_opendaw_export_stems_formatB

Export stems as separate files and convert each to MP3 or FLAC.

filename_prefix: Prefix for stem filenames. sample_rate: Export sample rate. format: 'wav' (default), 'mp3', or 'flac'. bitrate: MP3 bitrate (default '320k').

Runs export_stems, then converts each stem WAV to the requested format via ffmpeg.

Inputs: sample_rate (required), filename_prefix (required), format, bitrate. Returns: result

mcp_opendaw_extract_motifsA

Extract repeating melodic motifs from a MIDI region.

A motif is a short melodic phrase (3-8 notes) identified by its interval contour — the pattern of pitch changes between consecutive notes. The same motif transposed to a different key still matches, because the relative intervals are identical.

Essential for: understanding melodic structure of existing pieces, finding repetitive patterns for variation, identifying verse/chorus motifs, and building call-and-response arrangements from existing material.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks). region_index: Region index (-1 = all regions on track). min_motif_length: Minimum notes in a motif (default 3). max_motif_length: Maximum notes in a motif (default 8). min_repetitions: Minimum times a motif must appear to be reported (default 2). max_results: Maximum motifs to return, sorted by significance (default 20).

Returns list of motifs with contour, rhythm pattern, contour type, and occurrence positions.

Inputs: unit_index, max_results, track_index, region_index, +3 more. Returns: result

mcp_opendaw_extract_rhythmA

Extract rhythmic pattern from notes — onset grid, syncopation, IOI.

Returns a rhythmic analysis of notes in a region:

  • Onset grid: binary pattern showing which grid positions have note onsets

  • Inter-onset intervals (IOI): time between consecutive note starts

  • Syncopation score: how much the rhythm emphasises weak beats (0-1)

  • Rhythm density: fraction of grid positions with onsets

  • Rhythm string: compact representation (x=onset, .=rest)

  • Swing factor: ratio of odd vs even 16th positions

Grid resolutions:

  • "16th" — 16 positions per bar (default, most common)

  • "8th" — 8 positions per bar

  • "32nd" — 32 positions per bar (fine detail)

  • "quarter" — 4 positions per bar (coarse)

Useful for:

  • Understanding a rhythm before cloning it to another track

  • Measuring syncopation (high = funky, low = straight)

  • Extracting groove for groove_transfer

  • Comparing rhythms between sections

  • Feeding rhythm to generate_melody (rhythm param)

unit_index: AU index. track_index: Note track index. region_index: Region (-1 = first region). grid: Grid resolution (16th/8th/32nd/quarter).

Returns rhythm analysis.

Example: rhythm = extract_rhythm(0, 0, grid="16th")

onset_grid, syncopation, ioi, rhythm_string

Inputs: unit_index (required), track_index (required), grid, region_index. Returns: result

mcp_opendaw_filter_notesA

Filter notes by criteria — list, delete, or keep matching notes.

Applies multiple filter criteria to notes in a region:

  • Pitch range (min_pitch / max_pitch, MIDI note numbers)

  • Velocity range (min_velocity / max_velocity, 0.0-1.0)

  • Time range (from_beat / to_beat, absolute beat positions)

Any criterion set to -1 is ignored (wildcard).

Actions:

  • list: Return matching notes (read-only, no changes)

  • delete: Delete all notes matching the criteria

  • keep: Delete all notes NOT matching the criteria (inverse filter)

Use cases:

  • Remove notes below C2 (cleanup sub-bass rumble): filter_notes(0, 0, min_pitch=36, action="delete")

  • Isolate melody in upper register: filter_notes(0, 0, min_pitch=72, action="keep")

  • Remove ghost notes (velocity < 0.3): filter_notes(0, 0, min_velocity=0.3, action="delete")

  • Find notes in bar 8-12: filter_notes(0, 0, from_beat=32, to_beat=48, action="list")

  • Trim notes outside a time window: filter_notes(0, 0, from_beat=0, to_beat=16, action="keep")

unit_index: AU index. track_index: Note track index. region_index: Region (-1 = first region). min_pitch: Minimum MIDI pitch (-1 = no filter). max_pitch: Maximum MIDI pitch (-1 = no filter). min_velocity: Minimum velocity 0-1 (-1 = no filter). max_velocity: Maximum velocity 0-1 (-1 = no filter). from_beat: Start beat (-1 = no filter). to_beat: End beat (-1 = no filter). action: "list", "delete", or "keep".

Returns matching note details (list) or deletion count (delete/keep).

Example:

Delete all notes below C2

filter_notes(0, 0, min_pitch=36, action="delete")

Keep only notes in bars 1-4 (beats 0-16)

filter_notes(0, 0, from_beat=0, to_beat=16, action="keep")

Inputs: unit_index (required), track_index (required), action, to_beat, +6 more. Returns: result

mcp_opendaw_find_overlapping_notesA

Find notes that overlap a given pitch and time range within a note region.

Useful for checking if a note can be placed without colliding with existing notes, or for finding chords/harmonies at a specific pitch range.

unit_index: AU index. track_index: Note track index within the AU. region_index: Note region index. pitch: MIDI note number to check (60 = C4). from_beat: Start of time range in beats. to_beat: End of time range in beats.

Returns list of overlapping notes (position, duration, pitch, velocity), or error.

Inputs: pitch (required), to_beat (required), from_beat (required), unit_index (required), +2 more. Returns: result

mcp_opendaw_flatten_note_regionsA

Flatten (merge) multiple overlapping note regions into a single region.

Merges selected note regions on the same track into one, combining all notes. The original regions are deleted and replaced by a single flattened region.

unit_index: AU index. track_index: Track index within the AU. region_indices: Comma-separated region indices to flatten (e.g. "0,1,2").

Returns the new flattened region info, or error.

Inputs: unit_index (required), track_index (required), region_indices (required). Returns: result

mcp_opendaw_force_scale_notesA

Force all notes in a region into a specific scale — harmonic snap.

Finds every note that is NOT in the target scale and moves it to the nearest in-scale note. This is the harmonic equivalent of quantize_notes (which snaps timing to a grid). Useful after audio-to-MIDI transcription, random generation, or importing MIDI from unknown sources.

root_note: Root note name — C, C#, D, D#, E, F, F#, G, G#, A, A#, B. scale: Scale name — major, minor, dorian, phrygian, lydian, mixolydian, aeolian, locrian, pentatonic_major, pentatonic_minor, blues, harmonic_minor, melodic_minor. direction: How to resolve out-of-scale notes — "nearest" (closest, default), "up" (always shift up to next in-scale note), "down" (always shift down). preserve_octave: If True (default), keep notes in their original octave — only shift by 1-2 semitones. If False, allow octave jumps to find the nearest match.

Returns count of notes snapped, per-track breakdown, and which notes were changed.

Inputs: scale, direction, root_note, unit_index, +3 more. Returns: result

mcp_opendaw_freeze_audiounitA

Freeze an audio unit — pre-render its output offline to save CPU.

Uses audioUnitFreeze.freeze() which renders the AU's complete output via OfflineEngineRenderer and caches it. While frozen, the AU plays from cache instead of processing instruments/effects in real-time.

Cannot freeze AUs with sidechain dependents or the Output unit.

unit_index: AU index to freeze.

Returns success or error (e.g. sidechain dependents block freeze).

Inputs: unit_index (required). Returns: result

mcp_opendaw_generate_melodyA

Generate a melodic line from a scale using contour-guided random selection.

Creates a melody from scratch — no chord progression needed. The algorithm picks pitches from the specified scale, guided by a contour shape that controls the overall direction of the melodic line.

contour: Melodic shape:

  • "ascending" — starts low, rises throughout (build-up, tension)

  • "descending" — starts high, falls throughout (release, resolution)

  • "arch" — rises then falls (classic A-section, question-answer)

  • "v_shape" — falls then rises (dramatic, bridge)

  • "wave" — oscillates up and down (meandering, B-section)

  • "random" — no contour constraint, pure weighted random

rhythm: Rhythm pattern:

  • "quarter" — all quarter notes (steady, folk)

  • "eighth" — all eighth notes (driving, pop)

  • "syncopated" — mix of quarters and off-beat eighths (jazz, funk)

  • "mixed" — varied durations (16th to half, most musical)

  • "sparse" — mostly rests with occasional notes (ambient, intro)

The algorithm:

  1. Build a scale pitch list spanning 2 octaves centered on octave.

  2. For each beat position, determine the target contour height (0-1 mapping across the melody length).

  3. Map contour height to a pitch range in the scale.

  4. Weighted random selection: notes near the contour target get higher weight, notes far away get lower weight.

  5. Apply rhythm pattern to determine note durations and positions.

  6. Insert rests based on rest_probability.

root: Root note name (C, D, E, F, G, A, B + accidentals). scale: Scale name (major, minor, dorian, phrygian, lydian, mixolydian, aeolian, harmonic_minor, melodic_minor, pentatonic_major, pentatonic_minor, blues). bars: Number of bars (1-16, default 4). contour: Melodic contour shape (see above). rhythm: Rhythm pattern (see above). octave: Center MIDI octave (3=bass, 4=mid, 5=lead, 6=high, default 5). velocity: Base velocity 0-1 (default 0.7). rest_probability: Chance of a rest instead of a note (0-0.5, default 0.15). unit_index: AU index with note tracks. track_index: Note track index for the melody. start_beat: Position in beats.

Returns notes created, contour shape, scale used, pitch range.

Example:

Arch-shaped C major melody, 4 bars, mixed rhythm

generate_melody(root="C", scale="major", bars=4, contour="arch")

Ascending pentatonic build-up

generate_melody(root="A", scale="pentatonic_minor", bars=4, contour="ascending", rhythm="eighth")

Sparse ambient intro

generate_melody(root="D", scale="dorian", bars=8, contour="wave", rhythm="sparse", rest_probability=0.4)

Inputs: bars, root, scale, octave, +7 more. Returns: result

mcp_opendaw_get_audio_file_infoA
Read-only

Get metadata about the audio file referenced by an audio region.

Returns file name, start/end time in seconds, and sample loading state. Useful for inspecting audio regions before processing.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index.

Returns audio file info, or error.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_get_automation_valueA
Read-only

Get the automation value at a specific position on a value (automation) track.

Resolves the automation curve value at the given position, accounting for interpolation, region loops, and multiple overlapping regions.

unit_index: AU index. track_index: Value (automation) track index within the AU. position_beats: Position in beats (float).

Returns the normalized value (0.0-1.0), or error.

Inputs: unit_index (required), track_index (required), position_beats (required). Returns: result

mcp_opendaw_get_bar_intervalA
Read-only

Get the start and end PPQN of the bar containing the given position.

Useful for snapping regions, clips, and events to bar boundaries.

position_ppqn: Position in PPQN.

Returns bar_start (ppqn), bar_end (ppqn), bar_length (ppqn), and time signature.

Inputs: position_ppqn (required). Returns: result

mcp_opendaw_get_device_chain_detailA
Read-only

Get detailed info about all devices on an AU — instrument, audio effects, MIDI effects.

One call to inspect the full device chain: instrument name/type, all effects with labels, enabled state, minimized state, and parameter counts.

unit_index: AU index.

Returns instrument info, audio_effect array, midi_effect array.

Inputs: unit_index (required). Returns: result

mcp_opendaw_get_effect_chainB
Read-only

Get the full effect chain for an audio unit.

unit_index: Audio unit index.

Returns ordered list of effects with their type, enabled state, and index.

Inputs: unit_index (required). Returns: result

mcp_opendaw_get_effect_stateA
Read-only

Get full state of an effect: enabled, minimized, sidechain, all parameters.

More detailed than list_effect_parameters — includes enabled/bypass state, minimized state, sidechain connection, and full parameter dump.

unit_index: Audio unit index. effect_index: Effect position in the chain (0-based).

Returns complete effect state snapshot.

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_get_engine_statusA
Read-only

Get real-time engine status: playing state, position, BPM, CPU load, recording state.

Returns: is_playing: bool position_beats: current playback position in beats bpm: current BPM cpu_load: CPU load percentage (0-1) is_recording: bool is_counting_in: bool count_in_beats_remaining: beats left in count-in playback_timestamp: playback timestamp in beats marker: current marker [uuid, index] or null engine_started: whether engine is initialized

Inputs: no named parameters. Returns: result

mcp_opendaw_get_full_project_stateA
Read-only

Get a complete snapshot of the project — all AUs, tracks, regions, effects, mixer state.

One call to inspect the entire project structure. Useful for agents to understand the current state before making changes.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_midi_effect_chainA
Read-only

Get the MIDI effect chain for an audio unit.

unit_index: Audio unit index. Returns ordered list of MIDI effects with type, enabled state, and index.

Inputs: unit_index (required). Returns: result

mcp_opendaw_get_mixer_stateA
Read-only

Get the full mixer state — all audio units with volume, panning, mute, solo, and type.

Returns a list of channel strips with their current values. Useful for inspecting the mix balance and routing at a glance.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_neuralamp_modelA
Read-only

Get the NeuralAmp (Tone3000) model JSON for a NeuralAmp effect.

Returns the full NAM model JSON string, or an error if the effect is not a NeuralAmp or has no model loaded.

unit_index: AU index. effect_index: Effect index in the audio effect chain.

Returns model_json (string) or empty if no model loaded.

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_get_note_rangeA
Read-only

Get the pitch range and max duration of notes in a note region.

Returns min pitch, max pitch, and longest note duration — useful for determining the vocal/instrument range and planning transpose operations.

unit_index: AU index. track_index: Note track index within the AU. region_index: Note region index.

Returns min_pitch, max_pitch, max_duration_beats, note_count, or error.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_get_piano_modeA
Read-only

Get piano roll view settings.

Returns keyboard type (88/76/61/49), time range, note scale, note labels, transpose.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_project_durationA
Read-only

Get the total project duration — the end position of the last region across all tracks.

Returns the duration in beats and seconds, or error.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_project_infoA
Read-only

Get a quick project overview: BPM, time signature, track/AU/effect counts, total duration.

Single-call summary — lighter than get_project_state (no per-track detail).

Inputs: no named parameters. Returns: result

mcp_opendaw_get_project_metadataA
Read-only

Get project metadata: creation date, BPM, time signature, AU count, track count.

Quick overview of the project state in one call.

Returns created (ISO date), bpm, time_signature, audio_unit_count, total_track_count.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_project_stateB
Read-only

Get full project state: BPM, sample rate, playing status, track list, effects chain.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_region_infoA
Read-only

Get detailed info about a single region — position, duration, loop, mute, content.

unit_index: AU index. track_index: Track index within the AU. region_index: Region index.

Returns region metadata including type-specific info (notes count, audio file, automation events).

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_get_region_play_modeA
Read-only

Get the play mode of an audio region — stretch type, playback rate, cents, transient mode.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index.

Returns play mode details, or info if no stretch mode (plain playback).

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_get_sample_infoA
Read-only

Get detailed info about an audio sample by UUID.

Uses the SampleManager to fetch metadata about audio files registered in the project. Returns sample rate, channels, frames, and loading state.

sample_uuid: UUID of the audio sample (from list_samples).

Returns sample metadata, or error if not found.

Inputs: sample_uuid (required). Returns: result

mcp_opendaw_get_script_device_codeA
Read-only

Read the current user JavaScript code from a scriptable device.

Returns the full code string, header line, and code length.

Inputs: unit_index (required), device_type (required), device_index (required). Returns: result

mcp_opendaw_get_signature_eventsA
Read-only

List all time signature change events in the project.

Returns the base signature (4/4 by default) and all signature change events with their accumulated PPQN positions, bar counts, and nominator/denominator.

Returns base_signature, events array with index/position/bars/nominator/denominator.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_studio_settingsA
Read-only

Get all studio preferences/settings (engine, visibility, editing, debug, storage, time-display, pointer).

Returns all settings categories with current values.

Inputs: no named parameters. Returns: result

mcp_opendaw_get_tempo_atA
Read-only

Get the BPM at a specific position, accounting for tempo automation.

position_beats: Position in beats (float).

Returns BPM at that position, or error.

Inputs: position_beats (required). Returns: result

mcp_opendaw_get_track_infoA
Read-only

Get detailed info about a track — type, regions, clips, enabled state, target.

unit_index: AU index. track_index: Track index within the AU.

Returns track metadata and region/clip counts.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_get_unit_freeze_statusA
Read-only

Check if an audio unit is frozen and whether it can be frozen.

Freeze status indicates the AU's output has been pre-rendered to audio, freeing CPU. An AU with sidechain dependents cannot be frozen.

unit_index: AU index.

Returns frozen (bool), can_freeze (bool), has_sidechain_dependents (bool).

Inputs: unit_index (required). Returns: result

mcp_opendaw_groove_transferA

Transfer groove (timing + velocity feel) from a source region to a destination region.

Extracts the groove template from source notes: for each grid position within the groove cycle (groove_length beats), records the average timing offset from the grid and the average velocity ratio. Then applies this template to destination notes — shifting their timing and scaling velocity to match the source feel.

This is NOT copying notes — it transfers the feel. A 1-bar drum groove can be applied to a 4-bar programmed pattern. The groove cycles every groove_length beats.

source_unit_index: AU index of the groove source (e.g. a drum track). source_track_index: Note track index on the source AU. source_region_index: Region index on source (-1 = first). dest_unit_index: AU index of destination (-1 = same as source). dest_track_index: Note track index on destination AU (-1 = same as source track). dest_region_index: Region index on destination (-1 = all regions on track). groove_length: Groove cycle length in beats (4 = 1 bar of 4/4, 3 = waltz, 2 = half-bar). timing_strength: 0-1, how much timing offset to apply (0 = no change, 1 = full source groove). velocity_strength: 0-1, how much velocity pattern to apply (0 = no change, 1 = full source groove). grid: Grid for computing timing offsets — "16th" or "8th".

Returns groove template stats and per-region modification counts.

Inputs: source_unit_index (required), source_track_index (required), grid, groove_length, +6 more. Returns: result

mcp_opendaw_humanize_notesA

Add human-like variation to existing notes — velocity, timing, duration, and swing.

Makes programmed MIDI feel less robotic by applying small random deviations. Works on all notes in the specified track(s)/unit(s), or globally with unit_index=-1.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). velocity_amount: Velocity deviation depth 0-1 (0.15 = ±15% of current velocity). Example: 0.05 = subtle, 0.15 = natural, 0.25 = loose. timing_amount: Timing offset depth in beats 0-1 (0.15 = up to ±15% of a 16th note = ±3.6 ticks). Example: 0.05 = tight, 0.15 = natural groove, 0.30 = sloppy. duration_amount: Duration deviation depth 0-1 (0.10 = ±10% of current duration). swing: Swing amount 0-1 (0 = straight, 0.5 = light swing, 1.0 = full triplet feel). Shifts every other 16th note later by swing * 1/3 of a 16th. seed: Random seed for reproducibility (same seed = same humanization).

Returns per-track note counts and total notes humanized.

Example: humanize_notes(unit_index=0, velocity_amount=0.15, timing_amount=0.12, swing=0.35)

Inputs: seed, swing, unit_index, track_index, +3 more. Returns: result

mcp_opendaw_humanize_pitchA

Add micro-detune (cents) to notes — intonation humanization.

Real instruments and vocals never play perfectly in tune — there's always slight pitch drift. humanize_notes handles velocity/timing/duration, but pitch stays quantized. This tool adds per-note cent offsets to simulate natural intonation imperfections.

Useful for:

  • String sections that sound too perfect

  • Vocal MIDI parts that need warmth

  • Brass arrangements needing intonation character

  • Any programmed MIDI that feels sterile

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). cents_depth: Maximum deviation in cents (0-50, default 5 = +/-5 cents). 3 = subtle warmth, 5 = natural, 10 = loose, 20 = detuned, 50 = chaotic. bias: Directional bias in cents (-20 to +20, default 0 = centered). Positive = sharp tendency, negative = flat tendency. Useful for simulating ensembles that drift sharp. seed: Random seed for reproducibility (same seed = same detune pattern).

Returns per-track note counts, total notes detuned, cent range.

Example:

Subtle string warmth

humanize_pitch(unit_index=0, track_index=2, cents_depth=4, seed=7)

Detuned brass

humanize_pitch(unit_index=0, track_index=3, cents_depth=12, bias=-3)

Inputs: bias, seed, unit_index, cents_depth, +2 more. Returns: result

mcp_opendaw_identify_chordsA

Identify chords from existing notes in a region — harmonic analysis / reverse engineering.

Reads all notes from a region, groups them by temporal overlap (notes sounding together within group_tolerance beats), and for each group identifies the chord by matching the pitch-class set against known chord types (maj, min, 7, maj7, min7, sus2, sus4, add9, dim, aug).

Useful for: understanding imported MIDI, analyzing AI-generated progressions, reverse-engineering a track's harmony, or verifying that generated chords match the intended progression.

unit_index: AU index to analyze. track_index: Note track index to analyze. region_index: Region index (-1 = first region). group_tolerance: Beats of tolerance for grouping notes as simultaneous (default 0.25 = notes within a 16th note of each other are grouped together). min_notes: Minimum notes to attempt chord identification (default 3 = triad minimum).

Returns list of detected chords with time position, root, type, and confidence.

Inputs: unit_index (required), track_index (required), min_notes, region_index, +1 more. Returns: result

mcp_opendaw_import_audio_to_tracksA

Import an audio file into the DAW, optionally split into stems on separate tracks.

One-call pipeline: audio file → (optional stem separation) → create instrument tracks → load each stem → place on tracks at start_beat. This is the Suno-to-DAW bridge: generate a track with Suno, download it, then import with stem splitting for mixing and mastering.

Without mode: loads the whole file as one track (simple import). With mode: splits into stems, creates one track per stem, loads and places each.

file_path: Absolute path to WAV/MP3/FLAC/OGG file on disk. mode: Stem separation mode (empty = no split, single track). Modes: "bs6" (6-stem), "scnet" (4-stem), "ensemble" (max quality), "polarformer" (vocal/instrumental), "drumsep" (drum parts). start_beat: Beat position to place the audio region(s) (default 0). bpm: Tempo for the project (affects beat alignment, default 120).

Returns: track count, per-track info (name, sample_id, duration, stem name), and suggested next steps (apply_genre_mix, render_full).

Examples:

Simple import — one track, no splitting

import_audio_to_tracks("/tmp/suno_track.wav")

Split into 6 stems, each on its own track

import_audio_to_tracks("/tmp/suno_track.wav", mode="bs6")

Vocal/instrumental split at beat 4

import_audio_to_tracks("/tmp/vocal.wav", mode="polarformer", start_beat=4)

Inputs: file_path (required), bpm, mode, start_beat. Returns: result

mcp_opendaw_import_dawprojectA

Import a .dawproject file into the current session.

The dawproject format is a ZIP containing project.xml, metadata.xml, and audio samples. This enables loading projects created in Bitwig, Ableton, or other DAWs supporting dawproject.

Args: filename: Path to the .dawproject file to import.

Returns the import result with track and sample counts.

Inputs: filename (required). Returns: result

mcp_opendaw_import_midiA

Import a MIDI file and create note events on a note track.

Parses standard MIDI (.mid) files and creates note regions with all notes. Supports format 0 and 1. Ticks are converted to openDAW PPQN (960/quarter).

file_path: Path to .mid file (absolute or relative to MCP server). unit_index: Audio unit index with a note track (-1 = search all AUs). track_index: Note track index within the AU. offset_beats: Offset in beats to shift all notes (e.g. start at bar 2 = 4.0).

Returns note count and time range.

Inputs: file_path (required), unit_index (required), track_index (required), offset_beats (required). Returns: result

mcp_opendaw_import_presetA

Import a preset (base64-encoded binary) as a new audio unit.

Uses PresetDecoder.decode — deserializes the preset into the current project, creating a new AU with all its dependencies (instrument, effects, MIDI effects, tracks, notes).

preset_b64: Base64-encoded preset bytes from export_preset.

Returns the new AU's index, type, and label, or error.

Inputs: preset_b64 (required). Returns: result

mcp_opendaw_insert_restsA

Insert rests at specified beat positions by removing notes.

Deletes notes at given beat positions to create space, syncopation, or breathing room in dense patterns. Unlike thin_notes (which removes by interval/velocity/random strategy), this works positionally — you specify exactly where rests should appear.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) rest_positions: Comma-separated beat positions where rests should be inserted (e.g. "0,1,2,3" = every beat, "1.5,3.5" = offbeats only). tolerance_beats: Tolerance for matching note start to rest position (0.05 = within a 32nd note, 0.25 = within a 16th). mode: Deletion mode — "delete" = remove notes starting at rest positions, "truncate" = shorten notes that overlap rest positions (cut them at the rest point), "shorten" = reduce duration of notes near rest positions by half but don't delete them. shorten_neighbors: If True, also shorten notes immediately before rest positions to create cleaner separation. Only with mode="delete".

Inputs: unit_index (required), track_index (required), mode, region_index, +3 more. Returns: result

mcp_opendaw_invert_chord_notesA

Invert a chord at a specific position — move bottom N notes up an octave (or top N down).

A chord inversion (voicing change) rearranges which chord tone is lowest without changing the chord itself. 1st inversion: the 3rd is in the bass. 2nd inversion: the 5th is in the bass. This tool finds notes at a given beat position, groups them as a chord, and moves the bottom N notes up an octave (or top N down).

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index chord_position: Beat position of the chord to invert inversion: Number of notes to invert (1=first inversion, 2=second inversion, 3=third for 7th chords) direction: "up" = move bottom notes up an octave (standard), "down" = move top notes down an octave (drop voicing) Returns: JSON with notes_inverted, original pitches, new pitches, chord root.

Inputs: unit_index (required), track_index (required), region_index (required), chord_position (required), +2 more. Returns: result

mcp_opendaw_invert_notesA

Invert melody around a pitch axis — mirror reflection.

Each note's pitch is reflected around the axis: newPitch = 2*axis - oldPitch. Example: with axis=60 (C4), C4(60)→C4(60), D4(62)→Bb3(58), E4(64)→Ab3(56).

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all regions on the track). axis: Pivot pitch for inversion (default 60 = C4). Notes equidistant from axis on opposite sides swap. Use the first note's pitch for tonal inversion.

Returns count of notes inverted and notes skipped (out of MIDI range).

Inputs: unit_index (required), track_index (required), axis, region_index. Returns: result

mcp_opendaw_list_audio_busesA
Read-only

List all audio buses in the project (primary output + FX buses).

Returns bus index, name, enabled state, and the associated audio unit index.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_audio_regionsA
Read-only

List all audio regions with file name, position, and duration.

unit_index: Audio unit index. track_index: Specific audio track (-1 = all audio tracks).

Returns list of regions with: region_index, track_index, position_beats, duration_seconds, file_name.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_automatable_fieldsA
Read-only

List all automatable parameter fields on an instrument (or specific Playfield sample).

Shows which fields support Pointers.Automation — only these can be automated.

unit_index: Audio unit index containing the instrument. sample_index: For Playfield, which sample slot (-1 = top-level instrument).

Returns field names with current values and whether they're automatable.

Inputs: unit_index (required), sample_index. Returns: result

mcp_opendaw_list_automation_eventsA
Read-only

List automation events (ValueEventBox) on a unit's automation tracks.

Finds all Value-type tracks (automation) on the given audio unit and returns their automation points: position (beats), value (0-1), interpolation type.

unit_index: Audio unit index. track_index: Specific automation track (-1 = all automation tracks on the unit).

Returns list of tracks with their automation events.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_automation_events_detailA
Read-only

List all automation events on a value track with full detail — position, value, interpolation.

More detailed than list_automation_events — includes interpolation type and curve slope.

unit_index: AU index. track_index: Value (automation) track index.

Returns event list with positions in beats, values, and interpolation details.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_clipsA
Read-only

List clips (session view / clip launcher) on tracks.

Clips live on TrackBox.clips (ClipCollection). Three types:

  • NoteClipBox: MIDI clips (index, duration, mute, label, hue, triggerMode)

  • AudioClipBox: Audio clips (same + file, gain, playMode)

  • ValueClipBox: Automation clips (same + events)

unit_index: Audio unit index. track_index: Track index (-1 = all tracks on the unit).

Returns list of clips with type, index, duration, mute, label, loop.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_effect_parametersA
Read-only

List all parameters of an effect on an audio unit.

unit_index: Audio unit index. effect_index: Effect position in the chain (0-based, from add_effect return).

Returns parameter names, current values, units, and ranges.

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_list_effectsA
Read-only

List all available audio and MIDI effect types.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_genre_profilesA
Read-only

List all available genre reference profiles for mix analysis.

Each profile defines target LUFS, spectral balance, stereo width, and dynamic range for professional mixes in that genre.

Use compare_to_profile() to check your mix against any of these.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_instrument_paramsA
Read-only

List all parameters of the instrument connected to an audio unit.

unit_index: Audio unit index (-1 = auto-detect first non-master AU with an instrument).

Returns instrument type, all parameter fields with values, units, and constraints. Works with: Vaporisateur (cutoff/resonance/ADSR/etc), Tape (flutter/wow/noise/saturation), Nano (volume/release), Soundfont (presetIndex), MIDIOutput (channel), Playfield, Apparat.

Inputs: unit_index (required). Returns: result

mcp_opendaw_list_markersA
Read-only

List all timeline markers with positions and labels.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_midi_effect_paramsA
Read-only

List all parameters of a MIDI effect with current values.

unit_index: Audio unit index. effect_index: MIDI effect position in the chain (0-based).

Returns parameter names, values, units, and constraints.

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_list_midi_effectsA
Read-only

List all available MIDI effect types.

MIDI effects process note data before it reaches the instrument. They are inserted on the MIDI effect chain (au.midiEffects).

Inputs: no named parameters. Returns: result

mcp_opendaw_list_midi_output_devicesA
Read-only

List all MIDI output devices registered in the project (hardware MIDI outputs).

Returns id, label, delayInMs, sendTransportMessages for each device.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_modular_connectionsA
Read-only

List all connections (patch cables) in a Modular device.

au_index: Audio unit index. effect_index: Effect index within the AU.

Returns connections with source and target module/connector info.

Inputs: au_index (required), effect_index (required). Returns: result

mcp_opendaw_list_modular_devicesA
Read-only

List all Modular audio effect devices in the project.

Returns a list of modular devices with their AU index, label, and module/connection counts. Modular is a patchable modular synthesizer inside an audio effect slot.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_modular_modulesA
Read-only

List all modules in a Modular device.

au_index: Audio unit index. effect_index: Effect index within the AU.

Returns modules with their type, label, x/y position, inputs, outputs, and parameter values. Module types: gain, delay, multiplier, audio-input, audio-output.

Inputs: au_index (required), effect_index (required). Returns: result

mcp_opendaw_list_note_regionsA
Read-only

List all note regions with position, duration, and note count.

unit_index: Audio unit index (-1 = all AUs). track_index: Specific note track (-1 = all note tracks).

Returns list of regions with: region_index, unit_index, track_index, position_beats, duration_beats, label, note_count.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_notesA
Read-only

List all note events within a region.

Returns each note with position (beats), duration (beats), pitch (MIDI 0-127), velocity (0-1), cent, and chance (0-100).

unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region to list notes from (0-based).

Returns list of notes sorted by position.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_list_playfield_samplesA
Read-only

List all drum pads (samples) on a Playfield drum machine.

unit_index: Audio unit index (-1 = auto-detect Playfield).

Returns list of pads with MIDI note, enabled state, and effects.

Inputs: unit_index (required). Returns: result

mcp_opendaw_list_samplesA
Read-only

List all audio file samples used in the project.

Returns sample UUIDs and metadata for each audio file referenced in the project.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_script_paramsA
Read-only

List @param declarations on a scriptable device with full mapping info.

Each parameter includes: label, index, current value, default value, min, max, mapping type (unipolar/linear/exp/int/bool), and unit. Mapping info is parsed from // @param <name> <default> <min> <max> <type> <unit> declarations in the code — the code is the single source of truth.

Inputs: unit_index (required), device_type (required), device_index (required). Returns: result

mcp_opendaw_list_script_samplesA
Read-only

List @sample declaration slots on a scriptable device.

Each sample slot is a WerkstattSampleBox with: label, index, file (pointer to AudioFileBox). Sample slots are auto-created from // @sample <name> declarations in the code. The file pointer is null until a sample is loaded.

Inputs: unit_index (required), device_type (required), device_index (required). Returns: result

mcp_opendaw_list_sendsA
Read-only

List all aux sends on an audio unit.

unit_index: Audio unit index to inspect.

Returns list of sends with: send_index, target_bus_name, send_level_db, routing.

Inputs: unit_index (required). Returns: result

mcp_opendaw_list_signature_changesA
Read-only

List all time signature changes on the timeline's signature track.

Returns each signature event with position (beats), numerator, and denominator.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_split_modesA
Read-only

List available stem separation modes with descriptions.

Returns all modes supported by mcp_opendaw_split_stems, with SDR scores and use-case recommendations.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_tempo_changesA
Read-only

List all tempo (BPM) changes on the timeline's tempo track.

Returns each tempo event with position (beats), BPM, and interpolation type. The tempo track uses normalized values mapped to minBpm..maxBpm (default 60..240).

Inputs: no named parameters. Returns: result

mcp_opendaw_list_tracksA
Read-only

List all tracks across all audio units with their type, effects, and regions.

Returns structured info: audio units with their tracks (audio/note/automation), effects chain, volume, panning, and region count.

Inputs: no named parameters. Returns: result

mcp_opendaw_list_transient_markersA
Read-only

List transient markers for an audio region's audio file.

Transient markers are auto-detected hit points in the audio. Useful for beat slicing and groove extraction.

unit_index/track_index/region_index: Audio region coordinates.

Returns array of transient positions (in samples) or empty if none.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_list_value_regionsA
Read-only

List automation regions (ValueRegionBox) on value/automation tracks.

Finds all Value-type tracks (automation) and lists their regions with position, duration, loop settings, mute, and label.

unit_index: Audio unit index (-1 = search all AUs). track_index: Specific value track (-1 = all value tracks on the unit).

Returns list of automation regions.

Inputs: unit_index (required), track_index (required). Returns: result

mcp_opendaw_list_vaporisateur_paramsA
Read-only

Get full Vaporisateur synthesizer state: oscillators, LFO, noise, main params.

unit_index: Audio unit index (-1 = auto-detect Vaporisateur).

Returns:

  • oscillators: [{index, waveform, volume, octave, tune}]

  • lfo: {waveform, rate, sync, attack, decay, release}

  • noise: {volume, attack, decay, release}

  • main: cutoff, resonance, attack, release, filterEnvelope, decay, sustain, etc.

Inputs: unit_index (required). Returns: result

mcp_opendaw_list_warp_markersA
Read-only

List warp markers on a time-stretched or pitch-stretched audio region.

Warp markers define the mapping between musical position (ppqn) and audio time (seconds). Used for tempo-matching audio regions.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index.

Returns warp marker list (position, seconds, isAnchor), or empty if no stretch mode.

Inputs: unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_load_audioA

Load an audio file (WAV/MP3/FLAC/OGG) into the DAW project.

file_path: Absolute path to the audio file on disk. If the file is inside the headless-daw/public/ directory, it will be fetched via URL (much faster for large files). Otherwise loaded via base64. name: Optional display name (defaults to filename).

Inputs: name (required), file_path (required). Returns: result

mcp_opendaw_load_effect_presetB

Load a .opb preset file into the DAW and apply it to an audio unit.

Reads the preset bundle, decodes the effect chain via PresetDecoder, and inserts it onto the specified audio unit. If unit_index is -1, uses the primary (first non-output) audio unit.

filepath: Path to the .opb preset bundle file. unit_index: Target audio unit index. -1 = primary instrument unit.

Inputs: filepath (required), unit_index. Returns: result

mcp_opendaw_load_projectA

Load a previously saved project from a .odaw file.

Restores the full project state (tracks, regions, effects, notes, settings) from a serialized ArrayBuffer. The engine must be restarted after loading (call start_engine again).

filename: Name of the .odaw file in the exports directory (without path). Returns: box count and confirmation.

Inputs: filename (required). Returns: result

mcp_opendaw_map_velocity_by_pitchA

Map velocity based on pitch — expressive dynamics from note height.

Adjusts note velocity proportionally to pitch position. High notes get quieter, low notes get louder (or vice versa). This simulates natural acoustic instrument behaviour where register affects perceived intensity.

Modes:

  • "higher_quieter" — high notes quieter, low notes louder (piano natural, orchestral mockups). Default. Kick drum louder than hi-hat.

  • "lower_quieter" — low notes quieter, high notes louder (lead synth patches, bell-like timbres where highs cut through).

  • "bell_curve" — loudest in the middle register, quieter at extremes (vocal range, mid-range instruments like guitar/violin).

  • "inverse_bell" — quietest in the middle, louder at extremes (experimental).

intensity: 0-1, how much pitch affects velocity (0 = no change, 0.5 = moderate, 1.0 = full effect). At 0, velocities are unchanged.

The formula for "higher_quieter": relative_pos = (pitch - pitch_ref) / 48 (48 = 4 octaves range) factor = 1.0 - relative_pos * intensity new_vel = current_vel * factor (clamped to min/max)

pitch_ref: MIDI pitch that serves as the neutral point (no change). 60 = C4 (middle C). Adjust for your instrument's register.

Use cases:

  • Make flat MIDI velocities sound more natural (piano, orchestra)

  • Drum kits: kick (low pitch) louder than hi-hat (high pitch)

  • Lead synth: highs cut through more (lower_quieter)

  • Vocal range emphasis (bell_curve around pitch_ref=64)

unit_index: AU index. track_index: Note track index. region_index: Region (-1 = first, -2 = all regions). mode: higher_quieter / lower_quieter / bell_curve / inverse_bell. intensity: 0-1, strength of pitch-to-velocity mapping. min_velocity / max_velocity: Clamp range. pitch_ref: Neutral pitch (default 60 = C4).

Returns modification summary with per-octave velocity stats.

Inputs: unit_index (required), track_index (required), mode, intensity, +4 more. Returns: result

mcp_opendaw_match_to_referenceA

Automatically match your mix to a reference track — spectral + loudness alignment.

Like Phantom's match_to_reference: takes your mix and a reference, then:

  1. Measures LUFS difference → applies gain compensation

  2. Measures per-band spectral difference → applies EQ correction

  3. (Optional) Measures stereo width → applies stereo adjustment

Outputs a matched WAV file. This is automated A/B matching — the mix gets as close to the reference as possible without re-mixing.

filename: Your mix WAV (exports dir or absolute path). reference: Reference track WAV (exports dir or absolute path). output_filename: Output filename (default: _matched.wav). match_lufs: Match integrated LUFS. match_spectrum: Match per-band spectral energy (7-band EQ correction). match_stereo: Match stereo width (experimental).

Returns analysis of what was applied + output file path.

Example: match_to_reference("my_mix.wav", "pro_track.wav")

→ {lufs_adjusted: +1.4 dB, eq_curves: [...], output: "my_mix_matched.wav"}

Inputs: filename (required), reference (required), match_lufs, match_stereo, +2 more. Returns: result

mcp_opendaw_measure_lufsA

Measure LUFS (integrated) and true peak of an exported WAV file.

Uses ITU-R BS.1770-4 simplified algorithm:

  • K-weighting: 2nd-order high-shelf (+4dB @ ~1.5kHz) + highpass (~38Hz)

  • Gated mean squares (400ms blocks, 75% overlap, -10 LU relative gate)

  • Integrated LUFS = -0.691 + 10*log10(gated mean square)

filename: Name of the WAV file in the exports directory (without path).

Returns: LUFS (integrated), true peak (dBTP), max sample, duration seconds.

Inputs: filename (required). Returns: result

mcp_opendaw_merge_consecutive_notesA

Merge consecutive notes of the same pitch into single sustained notes.

Scans notes sorted by position. When two notes have the same pitch and the gap between them is within max_gap_beats, they are merged into one note spanning from the first note's start to the last note's end. Useful for cleaning up repeated hits, converting staccato patterns to sustained notes, or simplifying busy passages.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) same_pitch_only: If True, only merge notes with identical pitch. If False, merge any consecutive notes regardless of pitch (uses first note's pitch for the merged result). max_gap_beats: Maximum gap between note end and next note start to qualify for merging (0.0 = touching/overlapping only, 0.25 = up to a 16th note gap, 1.0 = up to 1 beat gap). velocity_mode: Velocity for merged note — "first" = use first note's velocity, "last" = use last note's velocity, "max" = use highest velocity, "avg" = use average velocity across merged notes.

Inputs: unit_index (required), track_index (required), region_index, max_gap_beats, +2 more. Returns: result

mcp_opendaw_merge_note_regionsA

Merge two note regions on the same track into one.

Copies all notes from region B into region A's note collection, adjusting positions so they remain at their original absolute timeline position. Region A's duration is extended to cover both regions. Region B is deleted.

The regions do not need to be adjacent — if there's a gap between them, the merged region spans the full range (with silence in the gap).

Use cases:

  • Join verse + chorus into one continuous region

  • Consolidate split regions back together

  • Merge separately-recorded MIDI takes

  • Simplify arrangement before export

unit_index: AU index. track_index: Note track index. region_index_a: First region (keeps its identity, absorbs B's notes). region_index_b: Second region (deleted after merge).

Returns merged region details.

Example:

Merge regions 0 and 1 into one

merge_note_regions(0, 0, 0, 1)

Inputs: unit_index (required), track_index (required), region_index_a (required), region_index_b (required). Returns: result

mcp_opendaw_merge_note_tracksA

Merge notes from a source track into a destination track.

Combines notes from two tracks into one, optionally deleting the source. Overlapping notes are resolved by the chosen strategy. Unlike copy_notes_to_track (which just copies), merge consolidates two note streams into a single coherent track — the source notes are integrated into the destination region and optionally removed from origin.

Typical use cases:

  • Merge a doubled melody into the main melody track

  • Consolidate counterpoint into the harmony track

  • Combine left-hand and right-hand piano into one track

  • Flatten multi-track MIDI into a single instrument

Args: source_unit: AU index of source track source_track: Note track index within source AU dest_unit: AU index of destination track dest_track: Note track index within destination AU source_region: Source region index (-1 = first region) dest_region: Destination region index (-1 = first region, or auto-create if none exists) delete_source: If True, delete source notes after merge. If False, notes remain in both tracks (copy mode). resolve_overlaps: Strategy for overlapping notes — "keep_higher_velocity" = keep louder note at conflict point, "keep_lower_velocity" = keep quieter note, "keep_source" = prefer source notes, "keep_dest" = prefer destination notes, "keep_both" = keep all overlapping notes (no resolution), "shorten_earlier" = truncate the earlier-starting note to end where the later one begins. transpose: Semitones to transpose source notes (-24 to 24).

Inputs: dest_unit (required), dest_track (required), source_unit (required), source_track (required), +5 more. Returns: result

mcp_opendaw_modulate_progressionA

Transpose a chord progression to a new key.

Modulation is the technique of changing key within a song. This tool takes a progression like "Am-F-C-G" (key of A minor) and transposes every chord to a new key while preserving chord qualities (major/minor/ 7th etc.) and interval relationships.

Common modulations:

  • Up a fourth (C→F): most natural, adds energy for chorus

  • Up a fifth (C→G): bright, triumphant

  • To relative major (Am→C): minor→major mood shift

  • To relative minor (C→Am): major→minor mood shift

  • Down a third (C→A): darker, bridge section

progression: Source progression (e.g. "Am-F-C-G"). target_key: Target key root note (e.g. "C", "F", "D", "Bb"). direction: "up" or "down" (affects octave placement, default "up").

Returns the modulated progression string + per-chord mapping.

Example:

A minor → C major (relative major)

modulate_progression("Am-F-C-G", target_key="C")

→ "C-G-Am-F" (I-V-vi-IV in C major)

A minor → F (up a fourth for chorus)

modulate_progression("Am-F-C-G", target_key="F")

C major → A minor (relative minor for bridge)

modulate_progression("C-G-Am-F", target_key="A")

Inputs: direction, target_key, progression. Returns: result

mcp_opendaw_move_audio_unitA

Move an audio unit up or down in the mixer order.

Uses AudioUnitBoxAdapter.move(delta) — reindexes the AU within its type group (Instrument/Aux/Output). Delta is relative: -1 = up, +1 = down.

unit_index: Current AU index. delta: Relative move (-1 up, +1 down).

Returns new index or error.

Inputs: delta (required), unit_index (required). Returns: result

mcp_opendaw_move_automation_eventA

Move an automation event to a new position on the timeline.

unit_index: AU index. track_index: Value (automation) track index. event_index: Event index (from list_automation_events). new_position_beats: New position in beats (float).

Returns success with old and new positions.

Inputs: unit_index (required), event_index (required), track_index (required), new_position_beats (required). Returns: result

mcp_opendaw_move_effectA

Reorder an effect within an audio unit's effect chain.

Chain order matters: EQ → Compressor → Reverb sounds different than Compressor → EQ → Reverb. Use this to move effects to the desired position.

unit_index: Audio unit index. from_index: Current effect position (0-based). to_index: Target effect position (0-based).

Effects between from and to shift accordingly.

Inputs: to_index (required), from_index (required), unit_index (required). Returns: result

mcp_opendaw_move_notesA

Move notes from a source region to another track — copy + delete.

Copies notes from source region to destination track (auto-creating a region or appending to an existing one), then optionally deletes the originals. Useful for splitting material across tracks, reorganising arrangements, or moving a section to a different instrument.

Args: source_unit: Source audio unit index source_track: Source note track index source_region: Source region index dest_unit: Destination audio unit index dest_track: Destination note track index time_offset: Shift all moved notes by N ticks (0 = keep positions) transpose: Transpose all moved notes by N semitones (0 = no change) velocity_scale: Multiply velocity of moved notes (1.0 = unchanged, 0.8 = quieter, 1.2 = louder, clamped to 0-1) delete_source: If True (default), delete notes from source after copy. If False, behaves like copy_notes_to_track. dest_region: Destination region index (-1 = auto-create or append to last)

Returns: JSON with notes_moved, notes_deleted, source_region_cleared, and destination region info.

Inputs: dest_unit (required), dest_track (required), source_unit (required), source_track (required), +6 more. Returns: result

mcp_opendaw_move_region_contentA

Shift the content start of a region without moving the region itself.

Moves the content inside the region by delta_beats — adjusts waveform offset (audio) or note positions (MIDI) while keeping the region position. Useful for realigning content within a region after tempo changes.

For audio regions with seconds timeBase, delta is converted via tempo map. For note regions, note positions shift by -delta (content moves left = positive delta).

unit_index: AU index. track_index: Track index within the AU. region_index: Region index. delta_beats: Shift amount in beats (positive = content moves left, region shrinks from left).

Returns new position, duration, and loopDuration, or error.

Inputs: unit_index (required), delta_beats (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_move_region_to_trackA

Move a region from one track to another (possibly in a different audio unit).

The region keeps its position, duration, and content. The source track loses the region.

src_unit_index: Source audio unit index. src_track_index: Source track index within source unit. region_index: Region index within source track. dst_unit_index: Destination audio unit index. dst_track_index: Destination track index within destination unit.

Returns success or error.

Inputs: region_index (required), dst_unit_index (required), src_unit_index (required), dst_track_index (required), +1 more. Returns: result

mcp_opendaw_move_sectionA

Move all regions within a beat range to a new position (non-destructive rearrangement).

Scans all tracks across all specified audio units, finds every region that overlaps the [from_beat, to_beat) range, and moves each one to target_beat with the same relative offset. Unlike duplicate_section, this removes the original — a true cut-and-paste operation.

This is the arrangement tool for restructuring: "move the bridge from bar 33 to bar 17" or "shift this 4-bar fill 8 bars earlier". One call replaces N delete + N create sequences.

from_beat: Start of the source section in beats. to_beat: End of the source section in beats (exclusive). target_beat: Where to move the section (beat 0 = start of project). unit_indices: Comma-separated AU indices to scan (default: all AUs).

Returns number of regions moved, per-track details, and old/new positions.

Examples: move_section(from_beat=32, to_beat=48, target_beat=16) -> Move bars 9-12 to bar 5 (shift 16 beats earlier) move_section(from_beat=0, to_beat=16, target_beat=32, unit_indices="0,1") -> Move first 4 bars from AUs 0,1 to beat 32

Inputs: to_beat (required), from_beat (required), target_beat (required), unit_indices. Returns: result

mcp_opendaw_move_signature_eventA

Move a time signature change event to a new PPQN position.

Automatically recalculates relative positions of subsequent events.

event_index: Index of the signature event (from add_signature_change list). target_ppqn: New position in PPQN.

Returns success or error.

Inputs: event_index (required), target_ppqn (required). Returns: result

mcp_opendaw_move_trackA

Move a track up or down within an audio unit.

Uses AudioUnitBoxAdapter.moveTrack(adapter, delta) — reindexes the track. Delta is relative: -1 = up, +1 = down.

unit_index: AU index. track_index: Track index within AU. delta: Relative move (-1 up, +1 down).

Returns new index or error.

Inputs: delta (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_note_statsA

Get comprehensive statistics for notes in a region.

Returns a full statistical profile of the MIDI content:

  • Note count, pitch range (min/max/span)

  • Velocity statistics (min/max/mean/median/std)

  • Duration statistics (min/max/mean in beats)

  • Density (notes per beat)

  • Pitch class histogram (how often each of 12 pitch classes appears)

  • Most common pitches (top 5)

  • Time span (first note to last note end)

Useful for:

  • Analyzing imported MIDI before processing

  • Comparing regions (which has more notes, wider range)

  • Identifying register (is this bass, mid, or lead?)

  • Detecting programming issues (all same velocity = robotic)

  • Feeding data to arrangement decisions

unit_index: AU index. track_index: Note track index. region_index: Region (-1 = first region).

Returns statistics object.

Example: stats = note_stats(0, 0)

stats includes: note_count, pitch_range, velocity_stats, density, pitch_class_histogram

Inputs: unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_place_audio_regionA

Place a previously loaded audio sample as a region on a track.

sample_id: The ID returned by mcp_opendaw_load_audio. unit_index: Audio unit index (default 0). start_beat: Beat position to place the region. track_index: Track index within the audio unit (default 0).

NOTE: The audio unit must be an instrument AU with a Tape device. Use mcp_opendaw_create_instrument_track first if no instrument AU exists.

Inputs: sample_id (required), start_beat (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_ppqn_to_partsA

Convert a PPQN position to musical parts: bars, beats, semiquavers, ticks.

Useful for understanding where a position falls in the musical grid, accounting for time signature changes.

position_ppqn: Position in PPQN (960 = 1 quarter note).

Returns bars, beats, semiquavers, ticks, and the active time signature.

Inputs: position_ppqn (required). Returns: result

mcp_opendaw_ppqn_to_secondsA

Convert a position in beats (PPQN units) to seconds using the project's tempo map.

Accounts for tempo automation — each segment of the timeline may have a different BPM, so the conversion integrates over tempo change events. 1 beat = PPQN.Quarter = 960 pulses.

position_beats: Position in beats (float, e.g. 4.0 = beat 4).

Returns seconds (float), or error.

Inputs: position_beats (required). Returns: result

mcp_opendaw_quantize_notesA

Quantize note positions to a grid division.

Snaps each note's start position to the nearest grid line.

division: Grid division — '1/4', '1/8', '1/16', '1/32', or '1/64'. unit_index: Audio unit index (-1 = all AUs). track_index: Specific note track (-1 = all note tracks). strength: 1.0 = full quantize, 0.5 = 50% (keeps some groove).

Returns count of notes quantized.

Inputs: division (required), strength (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_quantize_velocitiesA

Quantize note velocities to discrete stepped levels.

Snaps each note's velocity to the nearest of N evenly-spaced levels, like MPC 16-level mode or stepped dynamics. Great for creating uniform, robotic feel (techno, industrial) or restoring clean velocity tiers from humanized performance data.

Args: unit_index: Audio unit index (from list_tracks) track_index: Note track index within the unit levels: Number of velocity steps (2-128). 2 = on/off, 4 = pp/p/mf/f, 8 = classical dynamics, 16 = MPC classic, 32 = fine control. mode: "snap" = nearest level, "floor" = round down to level, "ceil" = round up to level, "round_random" = probabilistic round (coins flip for half-values) min_velocity: Floor for the quantized range (0.0-1.0) max_velocity: Ceiling for the quantized range (0.0-1.0) region_index: Specific region to process (-1 = all regions)

Returns: JSON with per-region stats: notes_processed, velocity distribution across levels, original avg, new avg, changes count.

Inputs: unit_index (required), track_index (required), mode, levels, +3 more. Returns: result

mcp_opendaw_query_loading_completeA

Check if all audio samples are loaded and ready for playback.

Returns: loaded: true if all samples have finished loading is_ready: true if engine is fully initialized

Inputs: no named parameters. Returns: result

mcp_opendaw_randomize_note_chanceA

Randomize note playback probability (chance) — generative variation.

Sets a random chance value (0-100%) for each note, controlling whether it plays on each run. This is the core of generative MIDI — patterns that are different every time while maintaining structure. Notes with chance=100 always play, chance=50 play half the time, chance=0 never play (silent ghost).

Perfect for:

  • Ghost notes that appear/disappear (drum variation)

  • Generative melodies where notes drop in/out

  • Call-and-response patterns with probabilistic responses

  • Evolving textures that change per iteration

mode: Distribution of chance values:

  • "uniform" — random between min_chance and max_chance, evenly distributed. Each note gets an independent random chance. Default mode.

  • "decreasing" — chance decreases linearly from max to min across the region. First notes are most likely, last notes least. Creates fade-out of probability — pattern dissolves.

  • "increasing" — chance increases from min to max. Pattern emerges from silence. Builds anticipation.

  • "sparse" — most notes get min_chance, but some get max_chance. Creates sparse texture with occasional hits. Good for ghost notes.

  • "binary" — each note gets either min_chance or max_chance (coin flip). Creates stark on/off patterns.

min_chance: Minimum chance value (0-100, default 50). max_chance: Maximum chance value (0-100, default 100). seed: Random seed for reproducibility.

Returns per-track note counts, chance range applied.

Example:

Ghost note variation — 30-80% chance

randomize_note_chance(unit_index=0, track_index=0, min_chance=30, max_chance=80)

Dissolving pattern — high to low

randomize_note_chance(unit_index=0, track_index=2, mode="decreasing", min_chance=0, max_chance=100)

Inputs: mode, seed, max_chance, min_chance, +3 more. Returns: result

mcp_opendaw_randomize_note_durationsA

Randomize note durations with controllable distribution.

Adds generative variation to note lengths. Unlike humanize_notes (which adjusts timing+velocity), this focuses purely on duration with 5 distribution modes for different musical characters.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) variation: Amount of variation (0.0=no change, 0.3=moderate, 1.0=extreme). Applied as percentage of original duration. distribution: Distribution mode — "uniform" = equal probability across range, "increasing" = durations tend to get longer over time, "decreasing" = durations tend to get shorter over time, "bimodal" = clusters around short and long extremes, "jitter" = small perturbations around original values. min_duration_beats: Minimum duration in beats (0.0625=1/64th, 0.125=1/32nd, 0.25=1/16th). max_duration_beats: Maximum duration in beats (4=whole note, 8=two whole notes). preserve_total: If True, scale all durations so the total summed duration equals the original. Useful for maintaining phrase length. seed: PRNG seed for reproducibility.

Inputs: unit_index (required), track_index (required), seed, variation, +5 more. Returns: result

mcp_opendaw_redoA

Redo the last undone operation.

Inputs: no named parameters. Returns: result

mcp_opendaw_reharmonize_progressionA

Reharmonize a chord progression — substitute chords with functionally equivalent alternatives for richer harmony.

Reharmonization is the art of replacing chords while preserving (or enhancing) the harmonic function. This tool applies classical and jazz substitution techniques to transform a progression without changing its fundamental direction.

progression: Hyphen-separated chords (same format as create_chord_pads). "Am-F-C-G" = i-VI-III-VII in A minor. "C-Am-F-G" = I-vi-IV-V in C major.

technique: Substitution technique:

  • "tritone_sub" — Replace V7 with ♭II7 (Db7 for G7). Guide tones (3rd+7th) are shared, creates chromatic bass motion. Jazz standard.

  • "secondary_dominant" — Insert V7 of the target chord before it. e.g. before Am → insert E7 (V7 of Am). Adds forward motion.

  • "diatonic_sub" — Replace with functionally equivalent diatonic chord. I→iii or I→vi (submediant), IV→ii (supertonic). Shares tones.

  • "modal_interchange" — Borrow chords from parallel key (minor↔major). In major: ♭VI, ♭III, ♭VII from natural minor. In minor: IV, II from major. Adds color and emotional depth.

  • "passing_dim" — Insert diminished passing chord for chromatic bass motion between chords a whole step apart. Creates smooth bass lines.

intensity: How many chords to substitute:

  • "light" — substitute 1 chord (the most impactful)

  • "medium" — substitute ~30% of eligible chords

  • "heavy" — substitute all eligible chords

target_chord: Index of specific chord to substitute (0-based). -1 = auto select. Only used for tritone_sub and diatonic_sub.

Returns the reharmonized progression string + per-chord mapping + explanation of each substitution.

Example:

Tritone substitution on a ii-V-I

reharmonize_progression("Dm7-G7-Cmaj7", technique="tritone_sub")

→ "Dm7-Db7-Cmaj7" (G7→Db7, guide tones shared)

Modal interchange on pop progression

reharmonize_progression("C-G-Am-F", technique="modal_interchange")

→ "C-G-Am-Fm" (F→Fm, borrowed from C minor)

Secondary dominants for jazz

reharmonize_progression("C-Am-Dm-G7", technique="secondary_dominant")

→ "C-E7-Am-A7-Dm-G7" (E7 before Am, A7 before Dm)

Inputs: intensity, technique, progression, target_chord. Returns: result

mcp_opendaw_remix_trackA

Full Suno remix pipeline in one call — analyze → import → harmony → mix → master.

Takes any audio file (from download_audio or local) and creates a complete remix: detect BPM + key → set project tempo → import stems → auto-generate matching chord progression → harmonic arrangement → genre mix → mastering. One call replaces 8-10 individual tool calls.

Steps performed:

  1. analyze_track (BPM + key + mode + LUFS)

  2. set_bpm to detected tempo

  3. import_audio_to_tracks (with stem separation if stem_mode set)

  4. create_progression_from_key (diatonic, style-appropriate)

  5. create_harmonic_arrangement (arp + melody on top of stems)

  6. apply_genre_mix (genre-specific processing)

  7. add_mastering_chain (LUFS target)

After this call, the project is remix-ready — call render_full to export.

filename: Path to audio file (from download_audio or local path). genre: Genre for mix processing (synthwave, house, techno, dnb, trap, etc). style: Progression style (pop, jazz, rock, synthwave, folk, lofi). stem_mode: Stem separation mode ("bs2", "bs4", "bs6") or "" for simple import. master_lufs: Mastering target (-14 Spotify, -10 loud, -16 Apple). add_harmony: If True, generates harmonic layers (arp + melody). Default True. add_counter_melody: If True, adds counter-melody layer. Default False. bars: Arrangement length in bars. Default 8.

Returns: analysis results, tracks created, harmony layers, effects, mastering.

Example:

Full pipeline: Suno → download → remix

chirp_generate → audio_url download_audio(audio_url) → /tmp/track.wav remix_track("/tmp/track.wav", genre="synthwave", style="synthwave", stem_mode="bs6", add_counter_melody=True) render_full() → export

Inputs: filename (required), bars, genre, style, +4 more. Returns: result

mcp_opendaw_remove_audio_busA

Remove an FX audio bus and its associated audio unit.

Provide either bus_index (from list_audio_buses) or fx_unit_index (from create_send). Cannot remove the primary output bus (index 0).

bus_index: Bus index to remove (must be > 0, i.e. not primary). fx_unit_index: Alternative — the FX AU index returned by create_send.

Inputs: bus_index (required), fx_unit_index (required). Returns: result

mcp_opendaw_remove_effectA

Remove an audio effect from an audio unit's chain.

unit_index: Audio unit index. effect_index: Effect position to remove (0-based).

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_remove_midi_effectA

Remove a MIDI effect from an audio unit's MIDI chain.

unit_index: Audio unit index. effect_index: MIDI effect position to remove (0-based).

Inputs: unit_index (required), effect_index (required). Returns: result

mcp_opendaw_remove_modular_moduleA

Remove a module from a Modular device.

au_index: Audio unit index. effect_index: Effect index within the AU. module_index: Module index to remove.

Returns success or error. All connections to/from this module are also removed.

Inputs: au_index (required), effect_index (required), module_index (required). Returns: result

mcp_opendaw_remove_sendA

Remove an aux send from an audio unit.

unit_index: Source audio unit index. send_index: Send index to remove (from list_sends).

Inputs: send_index (required), unit_index (required). Returns: result

mcp_opendaw_rename_unitA

Rename an audio unit's instrument and optionally set its icon.

Instrument AUs have a label (display name) and icon (symbol) on their InstrumentBox. This sets both. The output AU (index 0) has no instrument and cannot be renamed.

unit_index: Audio unit index (must be >= 1, not the output AU). name: New display name (empty = skip). icon: New icon symbol (empty = skip, e.g. 'piano', 'guitar', 'drums').

Returns old and new name/icon.

Inputs: icon (required), name (required), unit_index (required). Returns: result

mcp_opendaw_render_and_analyzeA

Render the current project and run full audio analysis in one call.

Combines export_audio + analyze_mix into a single tool — the feedback loop for iterative mixing. Agent renders, listens, and gets concrete numbers: LUFS, spectrum, stereo, dynamics, and prioritized suggestions.

This is the 'ears' tool. After making mix changes, call this to verify:

  1. Renders project to WAV via offline engine

  2. Runs full mix analysis (LUFS, spectrum, stereo, dynamics)

  3. Returns concrete numbers + prioritized suggestions

filename: Output filename (without .wav extension). sample_rate: Render sample rate (48000 recommended). analysis_depth: "full" (all analyses) or "quick" (LUFS + spectrum only).

Returns analysis JSON with mix_suggestions, master_check, and file path.

Example:

After adjusting mix

result = render_and_analyze("my_mix")

→ {lufs: -14.2, spectrum: {...}, suggestions: [...], file: "..."}

Inputs: filename, sample_rate, analysis_depth. Returns: result

mcp_opendaw_render_fullA

Render the entire project as a single stereo WAV file (full mixdown).

filename: Output filename (without .wav extension). sample_rate: Export sample rate (default 48000).

Uses OfflineEngineRenderer with Option.None (no stems config = full mix). Renders from beat 0 to the end of the last region.

Returns the path to the exported WAV and audio metadata.

Inputs: filename, sample_rate. Returns: result

mcp_opendaw_render_full_formatA

Render the entire project and convert to MP3 or FLAC in one step.

filename: Output filename (without extension). sample_rate: Export sample rate (default 48000). format: 'wav' (default), 'mp3', or 'flac'. MP3/FLAC uses system ffmpeg. bitrate: MP3 bitrate for CBR (default '320k'). Ignored for WAV/FLAC.

Combines render_full + convert_audio. Returns both WAV and converted file paths.

Inputs: format, bitrate, filename, sample_rate. Returns: result

mcp_opendaw_render_full_songA

Render the entire project — auto-detects song length from all regions.

Scans all note and audio regions across all tracks to find the latest ending point, then renders from beat 0 to that point plus a configurable tail for reverb/delay tails. No manual beat counting needed.

This closes the pipeline gap: after create_song_with_variations (or any arrangement tool), call render_full_song to get the final WAV.

filename: Output filename (without .wav extension). sample_rate: Export sample rate (default 48000). tail_beats: Extra beats at the end for reverb/delay tails (default 4 = 1 bar).

Returns the path to the exported WAV, song duration in seconds, and audio metadata (peak, has_audio).

Example:

After building a song

create_song_with_variations("dnb") render_full_song(filename="my_dnb_track")

Shorter tail for tight electronic

render_full_song(filename="techno_mix", tail_beats=2)

Inputs: filename, tail_beats, sample_rate. Returns: result

mcp_opendaw_render_rangeA

Render only a portion of the project (e.g. chorus only) for quick A/B comparison.

start_beat: Start position in beats (0 = project start). end_beat: End position in beats. filename: Output filename (without .wav extension). sample_rate: Export sample rate (default 48000).

Uses OfflineEngineRenderer with custom range. Faster than full export for checking specific sections during mixing.

Returns the path to the exported WAV and audio metadata.

Inputs: end_beat (required), filename (required), start_beat (required), sample_rate. Returns: result

mcp_opendaw_reorder_sectionsA

Reorder song sections — rearrange blocks on the timeline.

Takes a list of section boundaries and rearranges them into a new order. Each section is defined by its start and end beat. The tool collects all note content from each section, then places them in the specified new order, back-to-back, starting from the first section's original start position.

This is the full song structure editor: instead of swapping two sections (swap_sections), you can completely rearrange the form. Turn verse-chorus-verse-chorus-bridge-chorus into chorus-verse-bridge-chorus-verse-chorus in one call.

section_order: JSON array of section objects, each with "start" and "end" beat positions, listed in the NEW desired order. Example: '[{"start":0,"end":8},{"start":16,"end":24},{"start":8,"end":16}]' This takes sections at [0-8], [16-24], [8-16] and places them in that order, starting at beat 0.

Sections can overlap in the original but not in the output — they are placed sequentially. Section lengths are preserved.

unit_indices: Comma-separated unit indices to process ("" = all units).

Returns sections reordered, notes moved per unit, new section layout.

Example:

Move chorus to front

reorder_sections('[{"start":16,"end":32},{"start":0,"end":8},{"start":8,"end":16}]')

Inputs: section_order (required), unit_indices. Returns: result

mcp_opendaw_repeat_notesA

Repeat existing notes in a region N times with per-repeat transformations.

Takes the notes already in the region and copies them repeats times, each copy offset in time, pitch, and velocity. Unlike create_midi_echo (which decays feedback repeats), this tool preserves note structure and applies a uniform transform per repeat cycle — ideal for sequences, ostinato patterns, and motivic development.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) repeats: Number of repeat cycles (1-16, each cycle = full copy of source notes) transpose_semitones: Semitones added per repeat cycle (0=same, 12=octave up, -12=octave down, 7=fifth up). Cumulative. velocity_decay: Velocity multiplier per repeat (0=fade out, 1=constant, 0.8=gradual fade). Applied cumulatively. time_gap_beats: Extra gap between repeats in beats (0=back-to-back, 0.5=half-beat rest between cycles) direction: Transpose direction — "up" or "down" (affects sign of transpose) dest_track_index: Destination track (-1 = same track)

Inputs: unit_index (required), track_index (required), repeats, direction, +5 more. Returns: result

mcp_opendaw_repeat_phraseA

Repeat a melodic phrase N times with transposition — melodic sequence.

A sequence is one of the most powerful development techniques in Western music: repeat a melodic idea at different pitch levels. Each repetition is transposed by a fixed interval, creating a chain of related but evolving phrases.

Unlike repeat_notes (which repeats individual notes), create_sequence copies an entire phrase — all notes in the source region — and places each copy after the previous one, transposed and optionally with velocity and timing transformations.

Diatonic transposition moves through the scale (preserving scale membership), while chromatic transposition shifts by exact semitones. Sequences can ascend or descend, accelerating or decelerating.

Bach fugues, jazz ii-V-I chains, pop chorus lifts, film score ostinato builds, and minimalistic pattern music all use sequences.

Args: unit_index: Audio unit index track_index: Note track index with source phrase region_index: Region index (-1 = first region) repetitions: Number of sequence copies (2-16, default 4). Each copy is placed after the previous one in time. transpose_semitones: Transposition interval per repetition (1-12, default 2 = step). Positive = ascending, negative = descending. Used as scale steps in diatonic mode, exact semitones in chromatic mode. transpose_mode: Transposition method — "diatonic": move through scale (preserves scale membership) "chromatic": shift by exact semitones (may leave scale) scale: Scale for diatonic transposition ("major", "minor", "dorian", "phrygian", "lydian", "mixolydian", "locrian", "harmonic_minor", "melodic_minor", "pentatonic", "blues", "chromatic") root: Root note for scale velocity_pattern: Velocity transformation across repetitions — "constant": same velocity as source "crescendo": linear ramp from velocity_start to velocity_end "decrescendo": linear ramp from velocity_end to velocity_start "fade_out": each repetition softer than previous "build": exponential increase, climax at last repetition velocity_start: Starting velocity (0-1, default 0.8) velocity_end: Ending velocity (0-1, default 0.8) time_stretch: Duration multiplier per repetition (0.5-2.0, default 1.0 = same duration). 0.5 = accelerating, 2.0 = slowing down. Creates rhythmic sequences. cross_track: If >= 0, place sequences on this track index instead of source track (preserves original phrase).

Inputs: unit_index (required), track_index (required), root, scale, +9 more. Returns: result

mcp_opendaw_replace_from_presetA

Replace an audio unit's instrument/effects/timeline from a preset.

Uses PresetDecoder.replaceAudioUnit — swaps the instrument in an existing AU, optionally keeping the target's MIDI effects, audio effects, and/or timeline. The preset must contain a compatible instrument type (MIDI→MIDI, Audio→Audio).

unit_index: Target AU index to replace. preset_b64: Base64 preset bytes from export_preset. keep_midi_effects: If true, keep target's existing MIDI effects. keep_audio_effects: If true, keep target's existing audio effects. keep_timeline: If true, keep target's existing tracks/regions/notes.

Returns success or error with reason.

Inputs: preset_b64 (required), unit_index (required), keep_timeline, keep_midi_effects, +1 more. Returns: result

mcp_opendaw_replace_instrumentA

Replace the instrument on an audio unit with a different MIDI instrument.

Uses ProjectApi.replaceMIDIInstrument — deletes the old instrument and creates a new one on the same AU. Only works for MIDI instruments (Nano, Vaporisateur, Soundfont, Apparat). Tape (audio player) cannot be replaced this way.

The AU must have a CaptureMidiBox (i.e. it was created as a synth/note instrument, not an audio track).

unit_index: Audio unit index (must be >= 1). new_instrument: Factory key — 'Vaporisateur', 'Nano', 'Soundfont', 'Apparat'.

Returns old and new instrument type.

Inputs: unit_index (required), new_instrument (required). Returns: result

mcp_opendaw_reset_playfield_paramsA
Destructive

Reset all parameters of a Playfield drum sample to defaults.

Resets mute, solo, exclude, polyphone, pitch, attack, release, sampleStart, sampleEnd, gate to their default values.

unit_index: AU index containing the Playfield. sample_index: Sample slot index to reset.

Returns success or error.

Inputs: unit_index (required), sample_index (required). Returns: result

mcp_opendaw_reset_projectA
Destructive

Reset the project to a fresh state — removes all audio units, tracks, regions, effects.

Useful for starting a new mix session without reloading the browser. The output audio unit is preserved (required for audio routing).

Inputs: no named parameters. Returns: result

mcp_opendaw_reverse_notesA

Reverse the order of notes in a region — retrograde variation.

Swaps note positions so the last note becomes first and vice versa. Durations and velocities are preserved; only positions are mirrored.

unit_index: AU index. track_index: Note track index. region_index: Region index (-1 = all regions on the track).

Returns count of notes reversed.

Inputs: unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_rotate_notesA

Rotate notes in a region by N positions (cyclic shift).

Shifts notes cyclically — the first rotate_by notes move to the end, and the remaining notes shift left to fill the gap. This is a fundamental compositional technique used in serialism (rotational arrays — Berg, Webern), jazz melodic variation, and pattern transformation in electronic music.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) rotate_by: Number of positions to rotate (positive = left shift, negative = right shift). Wrapped modulo note count. axis: Rotation axis — "position" = rotate note order by position (notes keep pitch, positions are reassigned in rotated order), "pitch" = rotate pitches (positions stay, pitches shift cyclically among the notes), "both" = rotate both position and pitch together (true permutation — notes swap places entirely). preserve_pitch_contour: If True, after rotation adjust pitches to maintain the original melodic contour (interval sequence). Useful for melodic rotation that stays singable.

Inputs: unit_index (required), track_index (required), axis, rotate_by, +2 more. Returns: result

mcp_opendaw_save_effect_presetA

Save an audio effect chain as a .opb preset file.

Encodes the specified effect (and its position in the chain) into an openDAW preset bundle (.opb) using PresetEncoder.encodeEffects(). The file can be shared, drag-and-dropped into openDAW, or loaded via mcp_opendaw_load_effect_preset.

unit_index: Audio unit index containing the effect. effect_index: Index of the effect within the unit's audio effect chain. name: Preset name (shown in preset browser). description: Optional description of what the preset does. output_path: Directory to save the .opb file. Defaults to OPENDAW_EXPORT_DIR or /tmp.

Inputs: name (required), unit_index (required), effect_index (required), description, +1 more. Returns: result

mcp_opendaw_save_projectA

Save the current project state to a binary file.

Serializes the boxGraph (all tracks, regions, effects, notes, settings) to an ArrayBuffer and saves it as a .odaw file in the exports directory. Use load_project to restore later.

filename: Name for the saved project (without extension). Returns: file path, size, and box count.

Inputs: filename (required). Returns: result

mcp_opendaw_scale_durationsA

Scale the duration of all notes in a region — MIDI note length control.

Like scale_velocity but for note durations. Multiply, set, add, quantize, or snap to grid. Useful for changing articulation globally — make all notes shorter (staccato feel), longer (legato feel), or snap to a grid.

mode: How to scale durations:

  • "multiply" — multiply each note's duration by value (0.5 = half length, 2.0 = double). Clamped to min/max.

  • "add" — add value (in beats) to each duration. Clamped.

  • "set" — set all durations to value (in beats).

  • "quantize" — snap each duration to the nearest grid division. value = grid in beats (0.25 = 16th, 0.5 = 8th, 1.0 = quarter).

  • "legato" — extend each note to just before the next note's start. value = gap fraction (0.0 = touch next note, 0.1 = 10% gap before next).

value: The scaling parameter (meaning depends on mode). region_index: Region index (-1 = first region). min_duration / max_duration: Clamp range in beats. quantize: Grid for quantize mode ("16th", "8th", "quarter", "half") — overrides value if mode="quantize".

Returns count of notes modified, original and new duration stats.

Example:

Make everything half length (staccato feel)

scale_durations(0, 0, mode="multiply", value=0.5)

All notes to quarter note length

scale_durations(0, 3, mode="set", value=1.0)

Snap durations to 16th grid

scale_durations(0, 0, mode="quantize", quantize="16th")

Legato — extend to next note with small gap

scale_durations(0, 1, mode="legato", value=0.1)

Inputs: unit_index (required), track_index (required), mode, value, +4 more. Returns: result

mcp_opendaw_scale_velocityA

Scale the velocity of all notes in a region — MIDI dynamics control.

Unlike create_crescendo (which creates a gradient from start to end), this uniformly scales all existing velocities. Think of it as gain for MIDI dynamics — boost, attenuate, normalize, or compress the velocity range of an entire track or region.

mode: How to scale velocities:

  • "multiply" — multiply each velocity by value (1.0 = no change, 0.8 = 20% quieter, 1.2 = 20% louder). Clamped to 0-1.

  • "add" — add value to each velocity (0.1 = louder, -0.1 = quieter). Clamped to 0-1.

  • "set" — set all velocities to value (0.8 = uniform velocity).

  • "normalize" — scale all velocities so the maximum equals value (0.95 = normalize to 95% max). Preserves relative dynamics.

  • "compress" — compress velocity range around midpoint. value = ratio (0.5 = halve the dynamic range, 1.0 = no change). Pulls extremes toward center — makes quiet notes louder, loud notes quieter.

value: The scaling parameter (meaning depends on mode). region_index: Region index (-1 = first region). min_velocity / max_velocity: Clamp range (0-1). Use to limit extremes.

Returns count of notes modified, original velocity range, new range.

Example:

Make drums 20% quieter

scale_velocity(0, 0, mode="multiply", value=0.8)

Normalize melody to 95% max velocity

scale_velocity(0, 3, mode="normalize", value=0.95)

Compress velocity range — reduce dynamics

scale_velocity(0, 0, mode="compress", value=0.6)

Inputs: unit_index (required), track_index (required), mode, value, +3 more. Returns: result

mcp_opendaw_schedule_clip_playA

Schedule clips to play in session view (live triggering).

Args: clip_ids: Comma-separated list of clip UUIDs to trigger

Inputs: clip_ids (required). Returns: result

mcp_opendaw_schedule_clip_stopA

Schedule clips to stop on specified tracks (session view).

Args: track_ids: Comma-separated list of track UUIDs to stop clips on

Inputs: track_ids (required). Returns: result

mcp_opendaw_screenshot_dawA

Take a screenshot of the openDAW UI. Returns base64-encoded PNG image. Useful for visual debugging and verifying project state.

Inputs: no named parameters. Returns: result

mcp_opendaw_seconds_to_beatsA

Convert a time in seconds to beats using the project's tempo map.

Accounts for tempo automation. Useful for aligning audio regions to the musical grid when tempo changes mid-song.

seconds: Time in seconds (float).

Returns beats (float) and PPQN position, or error.

Inputs: seconds (required). Returns: result

mcp_opendaw_separate_stemsA

Separate audio into stems using SOTA AI models — SCNet, BS-Roformer, PolarFormer.

Uses the creative-studio stem-splitter pipeline (much better than Demucs alone). Models available:

  • "ensemble": Max quality — HTDemucs FT + PolarFormer vocals + BS-Roformer (3 passes)

  • "scnet": SCNet XL — best 4-stem (drums, bass, other, vocals), SDR 10.08

  • "bs6": BS-Roformer 6-stem (bass, drums, other, vocals, guitar, piano) — fast

  • "polarformer": Best vocal extraction (vocals + instrumental), SDR 11.00

  • "dereverb": Remove reverb from vocals (dry + reverb)

  • "drumsep": Separate drums into kick/snare/toms/cymbals

  • "denoise": Clean noise from low-quality audio (128kbps MP3)

input_file: Path to audio file (absolute or relative to cwd). model: Model name from the list above. output_dir: Output directory (default: /tmp/stems).

Returns paths to separated stem files.

Example: separate_stems("suno_track.wav", model="bs6")

→ {stems: {bass: "...", drums: "...", vocals: "...", ...}}

Inputs: input_file (required), model, output_dir. Returns: result

mcp_opendaw_serializeB

Serialize the current project state to JSON. Returns the serialized project data.

Inputs: no named parameters. Returns: result

mcp_opendaw_set_articulationA

Set articulation for notes — legato, staccato, or tenuto.

Articulation defines how notes connect to each other — the space or overlap between consecutive notes. This is what makes strings sound smooth (legato) or plucky (staccato), and it's separate from pitch and velocity.

Three articulations:

  • "legato" — each note extends to the start of the next note (minus a micro_gap in PPQN for articulation separation). Notes flow into each other seamlessly. Use for smooth string lines, vocal phrases, wind instruments, lead melodies.

  • "staccato" — each note is shortened to staccato_ratio of the distance to the next note. 0.5 = half the gap, 0.25 = very short and detached, 0.75 = portato (lightly separated). Creates space between notes.

  • "tenuto" — each note holds to its full available duration (up to the next note's start, no gap). Slightly longer than legato — full value with no separation. Use for sustained passages, horn sustains.

The last note in each region keeps its original duration (no next note to reference). Notes at the same position (chords) are treated as one unit — they all get the same treatment based on the next distinct position.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). articulation: "legato", "staccato", or "tenuto". staccato_ratio: For "staccato" — fraction of gap to fill (0.1-0.9, default 0.5 = half the available time). micro_gap: For "legato" — PPQN gap to leave between notes (default 20, ~1/48 of a beat). 0 = notes touch exactly. Higher = more separation.

Returns per-track notes adjusted, articulation type.

Example:

Smooth legato strings

set_articulation(unit_index=0, track_index=2, articulation="legato")

Crisp staccato — 30% of available time

set_articulation(unit_index=0, track_index=2, articulation="staccato", staccato_ratio=0.3)

Full tenuto — horns holding full value

set_articulation(unit_index=0, track_index=3, articulation="tenuto")

Inputs: micro_gap, unit_index, track_index, articulation, +2 more. Returns: result

mcp_opendaw_set_audio_region_fadeA

Set fade in/out on an audio region.

Audio regions have a Fading object with four params:

  • in: fade-in duration in seconds (0 = no fade-in)

  • out: fade-out duration in seconds (0 = no fade-out)

  • inSlope: fade-in curve (0.5 = linear, 0.75 = fast start, 0.25 = slow start)

  • outSlope: fade-out curve (0.5 = linear, 0.25 = fast end, 0.75 = slow end)

Pass -1.0 for any parameter to skip changing it (keep current value).

unit_index: Audio unit index. track_index: Audio track index. region_index: Region index within the track. fade_in: Fade-in duration in seconds (-1 = skip). fade_out: Fade-out duration in seconds (-1 = skip). in_slope: Fade-in curve 0-1 (-1 = skip). out_slope: Fade-out curve 0-1 (-1 = skip).

Returns updated fade values.

Inputs: fade_in (required), fade_out (required), in_slope (required), out_slope (required), +3 more. Returns: result

mcp_opendaw_set_audio_region_gainA

Set gain (in dB) on an audio region.

Audio regions have a per-region gain control (Float32Field, decibel). Use this for trim automation or balancing clips within a track.

unit_index: Audio unit index. track_index: Audio track index. region_index: Region index within the track. gain_db: Gain in dB (0 = unity, -6 = half volume, +6 = double).

Returns updated gain value.

Inputs: gain_db (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_audio_region_time_baseA

Set the time base of an audio region.

Controls how the region's duration is interpreted:

  • 'musical' — duration in PPQN (musical beats, follows tempo changes)

  • 'seconds' — duration in seconds (fixed wall-clock time, independent of tempo)

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. time_base: 'musical' or 'seconds'.

Returns old and new time base.

Inputs: time_base (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_audio_region_waveform_offsetA

Set the waveform display offset of an audio region.

The waveform offset shifts the visual start of the waveform within the region, useful for aligning the waveform display with the actual audio content.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. offset: Waveform offset value (in seconds).

Returns old and new offset.

Inputs: offset (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_automation_interpolationA

Set the interpolation type of an existing automation event.

Changes how the automation curve transitions from this event to the next.

unit_index: AU index. track_index: Value (automation) track index. region_index: Region index containing the event. event_index: Event index within the region's collection. interpolation: "none" (step/hold), "linear" (straight ramp), or "curve" (custom slope). curve_slope: Slope for curve interpolation (0.0-1.0). Only used if interpolation="curve".

Returns success, or error.

Inputs: unit_index (required), event_index (required), track_index (required), region_index (required), +2 more. Returns: result

mcp_opendaw_set_bpmA

Set the project tempo in BPM.

Inputs: bpm (required). Returns: result

mcp_opendaw_set_bus_colorA

Set the color (hue 0-360) of an audio bus.

bus_index: Bus index. hue: Color hue 0-360 (HSL).

Returns success or error.

Inputs: hue (required), bus_index (required). Returns: result

mcp_opendaw_set_bus_enabledA

Enable or mute an audio bus (FX bus A/B comparison).

bus_index: Bus index from list_audio_buses (0 = primary output). enabled: True to enable, False to mute.

Inputs: enabled (required), bus_index (required). Returns: result

mcp_opendaw_set_bus_labelA

Set the label (name) of an audio bus.

bus_index: Bus index from create_audio_bus. label: New name for the bus (e.g. "Reverb Bus", "Drum Bus").

Returns success or error.

Inputs: label (required), bus_index (required). Returns: result

mcp_opendaw_set_clip_hueA

Set the color (hue) of a clip in the session view.

unit_index: AU index. track_index: Track index within the AU. clip_index: Clip index. hue: Color hue 0-360.

Returns success with old and new hue.

Inputs: hue (required), clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_set_clip_labelA

Set the label (name) of a clip in the session view.

unit_index: AU index. track_index: Track index within the AU. clip_index: Clip index. label: New clip name.

Returns success with old and new label.

Inputs: label (required), clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_set_clip_muteA

Mute or unmute a clip in the session view.

unit_index: AU index. track_index: Track index within the AU. clip_index: Clip index. mute: True to mute, false to unmute.

Returns success with old and new mute state.

Inputs: mute (required), clip_index (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_set_clip_playbackA

Set clip playback parameters (loop, reverse, speed) on a clip.

Clips have a ClipPlaybackFields (triggerMode) object with:

  • loop: Whether the clip loops (true/false)

  • reverse: Play in reverse (true/false)

  • speed: Playback speed multiplier (1 = normal)

  • quantise: Quantise value

  • trigger: Trigger mode

Pass None for any parameter to skip changing it.

unit_index: Audio unit index. track_index: Track index. clip_index: Clip index (from list_clips). loop: Enable looping (None = skip). reverse: Reverse playback (None = skip). speed: Speed multiplier (None = skip).

Returns updated playback values.

Inputs: loop (required), speed (required), reverse (required), clip_index (required), +2 more. Returns: result

mcp_opendaw_set_clip_propertiesA

Set properties on a clip (session view): label, color, mute, duration.

Pass empty string for label to skip, -1 for hue/duration to skip, None for mute to skip.

unit_index: Audio unit index. track_index: Track index. clip_index: Clip index (from list_clips). label: New label (empty = skip). hue: New color hue 0-360 (-1 = skip). mute: Mute state (None = skip). duration_beats: New duration in beats (-1 = skip).

Returns updated clip properties.

Inputs: hue (required), mute (required), label (required), clip_index (required), +3 more. Returns: result

mcp_opendaw_set_crusher_bitsA

Set the bit depth on a Crusher (bitcrusher) effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Crusher). bits: Bit depth (1-16, where 16=no crushing, 1=extreme).

Inputs: bits (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_crusher_crushA

Set the sample-rate reduction (crush) on a Crusher effect.

The crush value is inverted internally: 0.0=clean (20kHz), 0.15=retro lo-fi (~8kHz), 0.25=AM radio (~3.5kHz), 0.55=glitchy (~500Hz), 1.0=inaudible (20Hz).

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Crusher). crush: Sample rate reduction amount (0.0-1.0, 0=clean, 1=max destruction).

Inputs: crush (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_delay_syncA

Set the synced delay time on a Delay effect using a musical fraction string.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Delay). fraction: Musical fraction — one of: "off", "1/128", "1/96", "1/64", "1/48", "1/32", "1/24", "3/64", "1/16", "1/12", "3/32", "1/8", "1/6", "3/16", "1/4", "5/16", "1/3", "3/8", "7/16", "1/2", "1/1".

Inputs: fraction (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_device_labelA

Rename an effect or MIDI effect device.

unit_index: AU index. effect_index: Effect index in the chain. label: New label/name for the device. is_midi_effect: If true, target MIDI effects chain instead of audio effects.

Returns success, or error.

Inputs: label (required), unit_index (required), effect_index (required), is_midi_effect. Returns: result

mcp_opendaw_set_effect_enabledB

Enable or bypass an specific effect on an audio unit.

unit_index: Audio unit index. effect_index: Effect position in the chain. enabled: true to enable, false to bypass.

Inputs: enabled (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_effect_parameterB

Set a parameter on an audio effect.

unit_index: Audio unit index. effect_index: Effect position in the chain (0-based). parameter_name: Parameter name from mcp_opendaw_list_effect_parameters (e.g. "inputGain", "mix", "equation"). value: Numeric value for float params. For string params (like Waveshaper equation), pass the string as parameter_name=value pair — use parameter_name="equation" and value as a special case.

Examples: set_effect_parameter(0, 0, "inputGain", 12.0) # Waveshaper +12dB input set_effect_parameter(0, 0, "mix", 1.0) # 100% wet set_effect_parameter(0, 0, "equation", 0) # Use string_value for equation

Inputs: value (required), unit_index (required), effect_index (required), parameter_name (required). Returns: result

mcp_opendaw_set_effect_parameter_boolA

Set a boolean parameter on an audio effect.

Covers device-specific boolean fields not exposed through the generic float setter:

  • Compressor: lookahead, automakeup, autoattack, autorelease

  • Gate: inverse

  • Maximizer: lookahead

  • StereoTool: invertL, invertR, swap

  • NeuralAmp: mono

  • Delay: freeTimeSync (if available)

unit_index: Audio unit index. effect_index: Effect position in the chain (0-based). parameter_name: Boolean field name (e.g. "lookahead", "automakeup", "inverse", "mono"). value: true or false.

Inputs: value (required), unit_index (required), effect_index (required), parameter_name (required). Returns: result

mcp_opendaw_set_effect_parameter_intA

Set an integer parameter on an audio effect.

Covers device-specific integer fields not exposed through the generic float setter:

  • Vocoder: bandCount

  • StereoTool: panningMixing

  • Fold: overSampling

  • Crusher: bits

  • Delay: version (internal)

Note: device-specific tools (set_vocoder_band_count, set_fold_oversampling, etc.) are preferred when available. This is a generic fallback for any Int32Field.

unit_index: Audio unit index. effect_index: Effect position in the chain (0-based). parameter_name: Integer field name (e.g. "bandCount", "bits", "overSampling"). value: Integer value.

Inputs: value (required), unit_index (required), effect_index (required), parameter_name (required). Returns: result

mcp_opendaw_set_effect_parameter_stringA

Set a string parameter on an audio effect (e.g. Waveshaper equation).

unit_index: Audio unit index. effect_index: Effect position in the chain. parameter_name: Parameter name (e.g. "equation"). string_value: String value (e.g. "hardclip", "tanh", "cubicSoft", "sigmoid", "arctan", "asymmetric").

Inputs: unit_index (required), effect_index (required), string_value (required), parameter_name (required). Returns: result

mcp_opendaw_set_fold_oversamplingA

Set the oversampling level on a Fold (wavefolding) effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Fold). oversampling: 0=off, 1=2x, 2=4x.

Inputs: unit_index (required), effect_index (required), oversampling (required). Returns: result

mcp_opendaw_set_groove_shuffleA

Set the groove/shuffle (swing) amount for the project.

amount: 0.0 = straight (no swing), 1.0 = full swing. Typical values: 0.15 = light swing, 0.25 = moderate, 0.5 = strong triplet feel.

Inputs: amount (required). Returns: result

mcp_opendaw_set_instrument_paramA

Set a parameter on the instrument connected to an audio unit.

unit_index: Audio unit index (-1 = auto-detect first non-master AU with an instrument). param_name: Field name (e.g. "cutoff", "resonance", "attack", "flutter", "volume", "channel"). value: New value for the parameter. param_index: Alternative — set by field index instead of name (-1 = use name).

Works with any instrument type. Returns old and new values.

Inputs: value (required), param_name (required), unit_index (required), param_index (required). Returns: result

mcp_opendaw_set_loop_regionA

Set the playback loop region.

When enabled, playback loops between from_beat and to_beat. Set enabled=false to disable loop (region is kept but inactive).

from_beat: Loop start in beats. to_beat: Loop end in beats. enabled: Whether loop is active.

Inputs: enabled (required), to_beat (required), from_beat (required). Returns: result

mcp_opendaw_set_marker_labelA

Rename a timeline marker.

marker_index: Index from list_markers (0-based). label: New label text.

Inputs: label (required), marker_index (required). Returns: result

mcp_opendaw_set_marker_positionA

Move a timeline marker to a new position.

marker_index: Index from list_markers (0-based). position_beats: New position in beats.

Inputs: marker_index (required), position_beats (required). Returns: result

mcp_opendaw_set_marker_repeatA

Set the repeat count on a timeline marker.

marker_index: Index from list_markers (0-based). repeat_count: 0 = infinite repeat, 1-16 = N repeats.

Inputs: marker_index (required), repeat_count (required). Returns: result

mcp_opendaw_set_metronomeA

Configure the metronome settings.

Args: enabled: Toggle metronome on/off. None = leave unchanged. gain: Click volume 0.0-1.0 (default 0.5). None = leave unchanged. beat_subdivision: Beats per click (1=quarter, 2=eighths, 4=sixteenths, 8=thirty-seconds, default 4). None = leave unchanged.

Inputs: gain, enabled, beat_subdivision. Returns: result

mcp_opendaw_set_midi_effect_paramA

Set a parameter on a MIDI effect.

unit_index: Audio unit index. effect_index: MIDI effect position in the chain (0-based). param_name: Field name (e.g. "semiTones", "rateIndex", "gate"). value: New value for the parameter. param_index: Alternative — set by field index instead of name (-1 = use name).

Returns old and new values.

Inputs: value (required), param_name (required), unit_index (required), param_index (required), +1 more. Returns: result

mcp_opendaw_set_modular_module_paramA

Set a parameter on a module in a Modular device.

au_index: Audio unit index. effect_index: Effect index within the AU. module_index: Module index. param_name: Parameter name — "gain" for ModuleGain, "time" for ModuleDelay. value: New parameter value (in physical units: dB for gain, ms for delay).

Returns success or error.

Inputs: value (required), au_index (required), param_name (required), effect_index (required), +1 more. Returns: result

mcp_opendaw_set_neuralamp_modelA

Load a Neural Amp Modeler (NAM/Tone3000) model JSON into a NeuralAmp effect.

Creates a NeuralAmpModelBox with the provided model JSON and links it to the NeuralAmp device. This bypasses the popup-based Tone3000 Select Flow, enabling headless model loading.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a NeuralAmp). model_json: Full NAM model JSON string (the model architecture + weights). label: Optional label for the model box (default "NAM Model"). pack_id: Optional pack identifier.

Returns success + model_size, or error if the effect is not a NeuralAmp.

Inputs: model_json (required), unit_index (required), effect_index (required), label, +1 more. Returns: result

mcp_opendaw_set_note_advancedA

Set advanced note properties — chance, cent, playCount, playCurve.

These properties are beyond basic position/duration/pitch/velocity:

  • chance: Probability of note playing (0-100%, 100 = always)

  • cent: Micro-tuning in cents (-50 to +50, 0 = exact pitch)

  • play_count: Number of repeats (1-16, 1 = single note)

  • play_curve: Repeat curve (-1 to +1, 0 = even spacing)

Pass -1 (or -999 for float fields) to skip a property (leave unchanged).

unit_index: AU index. track_index: Note track index. region_index: Note region index. note_index: Note index within the region.

Returns updated values, or error.

Inputs: note_index (required), unit_index (required), track_index (required), region_index (required), +4 more. Returns: result

mcp_opendaw_set_note_centsA

Set detune (cents) on notes — deterministic microtonal pitch control.

Unlike humanize_pitch (random cents), this tool applies SPECIFIC cent offsets to targeted notes. This enables:

  • Piano honky-tonk: detune alternate notes by +8/-8 cents

  • Quarter-tone scales: +50 cents on selected pitches

  • Sympathetic resonance: subtle +3 cents on sustained notes

  • Just intonation corrections: -2 cents on major thirds, +14 on fifths

  • Arabic maqam: quarter tones between semitones

  • Synth drift: gradual cent increase across a sequence

  • Chorus effect (MIDI): duplicate track detuned +7 cents

Modes:

  • "all": Apply to all notes in the region(s)

  • "pitch": Apply only to notes matching target_pitch (e.g. "60" or "C4")

  • "beats": Apply at specific beat positions (comma-separated, e.g. "0,4,8")

  • "indices": Apply to specific note indices (comma-separated, e.g. "0,2,4")

  • "alternating": Alternate +cents and -cents on consecutive notes

  • "gradient": Linearly increase cents from 0 to target across all notes

  • "scale_degree": Apply to notes on specific scale degrees (requires scale + root_note + target_pitch as degree numbers)

Args: unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks). region_index: Region index (-1 = all regions on track). cents: Cent offset to apply (-100 to +100). 100 cents = 1 semitone. mode: Targeting mode (see above). target_pitch: For "pitch" mode: MIDI note number (e.g. "60") or note name (e.g. "C4"). For "scale_degree" mode: comma-separated degree numbers (e.g. "3,7" = apply to 3rd and 7th degrees). beat_positions: For "beats" mode: comma-separated beat positions. note_indices: For "indices" mode: comma-separated note indices. direction: "up" (positive cents) or "down" (negative cents). For alternating mode, this sets the first note's direction. scale: For "scale_degree" mode: scale name (major, minor, dorian, etc.). root_note: For "scale_degree" mode: root note name.

Returns notes modified, per-mode details, and average cents applied.

Inputs: mode, cents, scale, direction, +7 more. Returns: result

mcp_opendaw_set_note_propertiesA

Edit properties of a single note within a region.

Pass -1 for any parameter to skip changing it (keep current value). Use list_notes first to find the note_index.

note_index: Index of the note in the region (0-based, sorted by position). unit_index: Audio unit index (-1 = search all AUs). track_index: Note track index within the AU. region_index: Region containing the note (0-based). position_beats: New position in beats (-1 = skip). duration_beats: New duration in beats (-1 = skip). pitch: New MIDI pitch 0-127 (-1 = skip). velocity: New velocity 0-1 (-1 = skip). cent: New cent offset in cents (-1 = skip). chance: New chance 0-100 (-1 = skip).

Returns updated note properties.

Inputs: cent (required), pitch (required), chance (required), velocity (required), +6 more. Returns: result

mcp_opendaw_set_piano_keyboardA

Set the piano roll keyboard type.

keyboard_type: One of 88 (full piano), 76 (stage), 61 (compact), 49 (controller).

Returns success with old and new values.

Inputs: keyboard_type (required). Returns: result

mcp_opendaw_set_piano_note_labelsA

Toggle note labels (C, C#, D, etc.) in the piano roll.

show: True to show note labels, false to hide.

Returns success with old and new values.

Inputs: show (required). Returns: result

mcp_opendaw_set_piano_note_scaleA

Set the piano roll note scale (vertical zoom).

scale: Note scale factor (0.5 to 2.0). 1.0 = default, 2.0 = maximum zoom in, 0.5 = maximum zoom out.

Returns success with old and new values.

Inputs: scale (required). Returns: result

mcp_opendaw_set_piano_time_rangeA

Set the piano roll time range (horizontal view width in quarter notes).

quarters: Time range in quarter notes (1.0 to 64.0). Smaller = more zoomed in.

Returns success with old and new values.

Inputs: quarters (required). Returns: result

mcp_opendaw_set_playfield_sample_enabledA

Enable/disable a drum pad on a Playfield drum machine.

sample_index: Pad index (0-based). enabled: true to enable, false to mute the pad. unit_index: Audio unit index (-1 = auto-detect Playfield).

Inputs: enabled (required), unit_index (required), sample_index (required). Returns: result

mcp_opendaw_set_positionB

Set the playback position in beats.

Inputs: position (required). Returns: result

mcp_opendaw_set_region_colorA

Set the color (hue) of a region or clip.

Regions and clips use an Int32Field 'hue' for color. The hue is an integer that maps to a color in the HSL spectrum (0-360). Use this to visually distinguish sections (e.g. red for choruses, blue for verses).

track_index: Track index within the AU. region_index: Region/clip to color (0-based). hue: Color hue (0-360, e.g. 0=red, 120=green, 240=blue). unit_index: Audio unit index (-1 = search all AUs).

Returns old and new hue values.

Inputs: hue (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_region_durationB

Set the duration of a region.

duration_beats: New duration in beats (e.g. 4.0 = 1 bar in 4/4).

Inputs: track_index (required), region_index (required), duration_beats (required), unit_index. Returns: result

mcp_opendaw_set_region_labelA

Rename a region's label (display name).

label: New label text. unit_index: Audio unit index (-1 = search all AUs). track_index: Track index within the AU. region_index: Region to rename (0-based).

Inputs: label (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_region_loopA

Set loop parameters for a note region.

Looping repeats the note pattern within the region. The region duration can be longer than the loop, causing the notes to repeat.

loop_beats: Loop length in beats (e.g. 4.0 = 1 bar in 4/4). Set to 0 to disable loop. loop_offset_beats: Offset within the event collection where the loop starts. event_offset_beats: Offset added to all note positions. unit_index: Audio unit index (-1 = search all AUs). track_index: Track index within the AU. region_index: Region to modify (0-based).

Inputs: loop_beats (required), unit_index (required), track_index (required), region_index (required), +2 more. Returns: result

mcp_opendaw_set_region_muteA

Mute or unmute a specific region without deleting it.

mute: true to mute, false to unmute.

Inputs: mute (required), track_index (required), region_index (required), unit_index. Returns: result

mcp_opendaw_set_region_positionA

Move a region to a new position on the timeline.

position_beats: New position in beats (e.g. 4.0 = start of bar 2 in 4/4). region_type: 'note' or 'audio'. unit_index: Audio unit index (-1 = search all AUs). track_index: Track index within the AU. region_index: Region to move (0-based).

Inputs: unit_index (required), region_type (required), track_index (required), region_index (required), +1 more. Returns: result

mcp_opendaw_set_revamp_filterA

Configure a filter section on a Revamp (parametric EQ) effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Revamp). section: One of: "highpass", "lowshelf", "lowbell", "midbell", "highbell", "highshelf", "lowpass". enabled: Enable/disable this filter section. frequency: Center/cutoff frequency in Hz (20-20000, exponential). gain: Boost/cut in dB (-24 to 24, for shelves and bells only). q: Bandwidth/resonance (0.01-10, for bells and LPF). order: Filter steepness 1-4 (for HPF/LPF only).

Inputs: enabled (required), section (required), unit_index (required), effect_index (required), +4 more. Returns: result

mcp_opendaw_set_script_device_codeA

Set the user JavaScript code on a scriptable device (Apparat/Werkstatt/Spielwerk).

Compiles the code using the official OpenDAW ScriptCompiler, which:

  • Parses @param declarations and creates WerkstattParameterBox children

  • Parses @sample declarations and creates WerkstattSampleBox children

  • Validates the JavaScript (new Function check)

  • Registers the worklet module on the AudioContext

  • Writes the code with proper // @ header back to the device

The code defines a Processor class that the host instantiates in the audio worklet. @param declarations: // @param [type] [unit] @sample declarations: // @sample See the openDAW plans/apparat.md, plans/spielwerk.md for the full API.

device_type: "apparat" (instrument), "werkstatt" (audio effect), "spielwerk" (MIDI effect)

Inputs: code (required), unit_index (required), device_type (required), device_index (required). Returns: result

mcp_opendaw_set_script_paramA

Set a parameter value on a scriptable device by label.

The parameter must exist (created from a // @param declaration in the code). The value is validated against the declaration's range (min/max) and mapping type:

  • bool: snaps to 0 or 1

  • int: rounds to nearest integer within [min, max]

  • linear/exp/unipolar: clamps to [min, max] Response includes clamped flag and range info if the value was adjusted.

Inputs: value (required), unit_index (required), device_type (required), param_label (required), +1 more. Returns: result

mcp_opendaw_set_send_levelA

Set the send level for an existing aux send.

src_unit: Source audio unit index. send_index: Send index on the source AU (from create_send return). level_db: Send level in dB.

Inputs: level_db (required), src_unit (required), send_index (required). Returns: result

mcp_opendaw_set_send_panA

Set the stereo pan for an aux send (-1.0 = full left, 0.0 = center, 1.0 = full right).

unit_index: Source audio unit index. send_index: Send index on the source AU. pan: Pan value from -1.0 (left) to 1.0 (right).

Inputs: pan (required), send_index (required), unit_index (required). Returns: result

mcp_opendaw_set_send_routingA

Set the routing mode for an aux send (pre-fader or post-fader).

unit_index: Source audio unit index. send_index: Send index on the source AU. routing: 'pre' (pre-fader, before volume/pan) or 'post' (post-fader, default).

Inputs: routing (required), send_index (required), unit_index (required). Returns: result

mcp_opendaw_set_stereo_tool_panningA

Set the panning mixing mode on a StereoTool effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a StereoTool). panning_mixing: Panning law (0=linear, 1=equal-power, or other supported values).

Inputs: unit_index (required), effect_index (required), panning_mixing (required). Returns: result

mcp_opendaw_set_studio_settingA

Set a studio preference setting.

Args: category: Settings category — one of: 'engine', 'visibility', 'editing', 'debug', 'storage', 'time-display', 'pointer' key: Setting key within the category (e.g. 'auto-create-output-maximizer', 'overlapping-regions-behaviour', 'enable-beta-features') value: New value as string — 'true'/'false' for booleans, or string values for enums

Common settings: engine.auto-create-output-maximizer (bool): auto-create Maximizer on Output unit engine.note-audition-while-editing (bool): play notes when editing engine.stop-playback-when-overloading (bool): stop playback on CPU overload editing.overlapping-regions-behaviour ('clip'|'push-existing'|'keep-existing'): how overlapping regions interact editing.show-clipboard-menu (bool): show clipboard menu debug.enable-beta-features (bool): enable beta features debug.enable-debug-menu (bool): enable debug menu debug.show-cpu-stats (bool): show CPU stats storage.auto-delete-orphaned-samples (bool): auto-delete unused samples visibility.auto-open-clips (bool): auto-open clips visibility.base-frequency (bool): show base frequency

Inputs: key (required), value (required), category (required). Returns: result

mcp_opendaw_set_tidal_rateA

Set the LFO rate on a Tidal effect using a musical fraction string.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Tidal). rate: Musical fraction — one of: "1/1", "1/2", "1/3", "3/16", "1/6", "1/8", "3/32", "1/12", "1/16", "3/64", "1/24", "1/32", "1/48", "1/64", "1/96", "1/128".

Inputs: rate (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_time_signatureA

Set the project time signature (e.g. 4/4, 3/4, 6/8, 7/8).

numerator: Number of beats per bar (top number, e.g. 4, 3, 6, 7). denominator: Note value per beat (bottom number: 4=quarter, 8=eighth).

Inputs: numerator (required), denominator (required). Returns: result

mcp_opendaw_set_time_stretch_centsA

Set the pitch shift (in cents) on a time-stretched audio region.

100 cents = 1 semitone. Range: -1200 to +1200 cents (clamped). Only works on time-stretched regions (created with create_time_stretched_region).

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. cents: Pitch shift in cents (-1200 to +1200).

Returns new playback rate and cents, or error.

Inputs: cents (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_set_track_enabledA

Enable or disable a track (equivalent to track mute in the UI).

unit_index: AU index. track_index: Track index within the AU. enabled: True to enable, false to mute/disable.

Returns success with old and new enabled state.

Inputs: enabled (required), unit_index (required), track_index (required). Returns: result

mcp_opendaw_set_track_muteC

Mute or unmute an audio unit.

Inputs: mute (required), unit_index (required). Returns: result

mcp_opendaw_set_track_panningB

Set panning of an audio unit. -1.0 = full left, 0.0 = center, 1.0 = full right.

Inputs: panning (required), unit_index (required). Returns: result

mcp_opendaw_set_track_soloC

Solo or unsolo an audio unit.

Inputs: solo (required), unit_index (required). Returns: result

mcp_opendaw_set_track_volumeA

Set volume of an audio unit in dB.

Uses VolumeMapper.decibel(-96, -9, +6) powerByCenter mapping. Range: -96 dB (mute) to +6 dB. 0 dB = raw 0.768.

Inputs: volume_db (required), unit_index (required). Returns: result

mcp_opendaw_set_transposeA

Set global transpose for the piano roll view (does not affect audio playback).

semitones: Number of semitones to transpose (-48 to +48).

Returns success with old and new values.

Inputs: semitones (required). Returns: result

mcp_opendaw_set_tuningA

Set the A4 base frequency (concert pitch tuning).

frequency: A4 frequency in Hz. Default 440. Common alternatives: 432 (verdi), 415 (baroque), 466 (baroque organ).

Inputs: frequency (required). Returns: result

mcp_opendaw_set_unit_minimizedA

Minimize or expand an audio unit in the mixer view.

Minimized AUs take less space in the mixer — useful for decluttering when working with many tracks.

unit_index: AU index. minimized: True to minimize, False to expand.

Returns success with old and new minimized state.

Inputs: minimized (required), unit_index (required). Returns: result

mcp_opendaw_set_vaporisateur_osc_paramA

Set a parameter on a Vaporisateur oscillator.

osc_index: Oscillator index (0, 1). param_name: One of: waveform, volume, octave, tune. waveform: 0=Sine, 1=Triangle, 2=Saw, 3=Square volume: dB (-Infinity to +6) octave: integer offset tune: semitone offset (float) value: New value. unit_index: Audio unit index (-1 = auto-detect).

Returns old and new values.

Inputs: value (required), osc_index (required), param_name (required), unit_index (required). Returns: result

mcp_opendaw_set_vocoder_band_countA

Set the band count on a Vocoder effect (number of filter bands, typically 8-32).

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Vocoder). band_count: Number of bands (8, 16, 24, 32 are common values).

Inputs: band_count (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_vocoder_modulator_sourceA

Set the modulator source on a Vocoder effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Vocoder). source: One of "noise-white", "noise-pink", "noise-brown", "self", "external".

Inputs: source (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_set_waveshaper_equationA

Set the transfer function equation on a Waveshaper effect.

unit_index: AU index. effect_index: Effect index in the audio effect chain (must be a Waveshaper). equation: One of: "hardclip", "cubicSoft", "tanh", "sigmoid", "arctan", "asymmetric". - hardclip: harsh digital clipping - cubicSoft: warm soft clipping, odd harmonics - tanh: classic smooth saturation - sigmoid: exponential saturation - arctan: gentlest symmetric saturation - asymmetric: tube-like, even harmonics from asymmetry

Inputs: equation (required), unit_index (required), effect_index (required). Returns: result

mcp_opendaw_shift_modeA

Transform notes from one scale/mode to another, keeping the tonic.

Finds which scale degrees differ between from_scale and to_scale, then shifts ONLY the notes on those degrees by the interval difference. The tonic (degree 1) and unchanged degrees stay put — the transformation is surgical, not a blanket snap.

Examples: shift_mode(root_note="A", from_scale="minor", to_scale="dorian") → minor 6th (Ab) becomes major 6th (F#). A minor → A dorian. Only notes on degree 6 shift (+1 semitone). Everything else stays. shift_mode(root_note="E", from_scale="minor", to_scale="phrygian") → degree 2 (F#) becomes F natural (-1 semitone). E minor → E phrygian. shift_mode(root_note="D", from_scale="major", to_scale="mixolydian") → degree 7 (C#) becomes C natural (-1 semitone). D major → D mixolydian. shift_mode(root_note="C", from_scale="minor", to_scale="harmonic_minor") → degree 7 (Bb) becomes B natural (+1 semitone). C minor → C harmonic minor.

Unlike force_scale_notes (snaps to nearest scale tone — can change the melodic shape), shift_mode preserves the contour: notes that are already in the target scale don't move. Only the specific degrees that differ between the two scales are shifted.

Unlike reharmonize_progression (works on chord symbols), shift_mode works on individual notes in a region.

Args: unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks). region_index: Region index (-1 = all regions on track). root_note: Tonic note (C, C#, D, ...). Stays the same for both scales. from_scale: Source scale name. to_scale: Target scale name. preserve_root: If True (default), never shift the tonic pitch class. If False, allow tonic to shift (rare, only for non-modal transformations).

Returns per-note shift details: which pitch classes moved, by how much, and total notes affected.

Inputs: to_scale, root_note, from_scale, unit_index, +3 more. Returns: result

mcp_opendaw_shuffle_notesA

Shuffle note data randomly within a region.

Random permutation of notes — unlike rotate_notes (deterministic cyclic shift), this creates non-repeating orderings. Seeded for reproducibility: same seed = same shuffle.

Modes:

  • "pitches": shuffle which pitch goes to which position (keeps rhythm, changes melody). Most musical — generates melodic variations from existing note set.

  • "rhythm": shuffle which position+duration goes to which pitch (keeps pitches, changes rhythm). Reassigns onset times among existing pitch values.

  • "full": shuffle pitch + position + duration + velocity together (complete randomization of all note attributes).

  • "within_groups": shuffle pitches within groups of group_beats beats. Notes stay in their time window but pitches get randomized within each group. Creates localized variation.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) mode: Shuffle mode — "pitches", "rhythm", "full", "within_groups" seed: PRNG seed (0 = random each call, >0 = reproducible) shuffle_amount: 0.0-1.0, fraction of notes to shuffle (0=no change, 1=full shuffle, 0.5=shuffle half) preserve_first: Keep first note unchanged (anchor point) preserve_last: Keep last note unchanged (resolution point) group_beats: Group size in beats for within_groups mode (e.g. 4 = shuffle within each bar, 2 = within half bars)

Inputs: unit_index (required), track_index (required), mode, seed, +5 more. Returns: result

mcp_opendaw_split_note_regionA

Split a note region into two at a given beat position.

Creates a new region starting at split_beat containing all notes from that position onward. The original region's duration is trimmed to split_beat. Notes that straddle the split point are kept in the original region (they will play their full duration even if they extend past the trimmed region boundary — this matches DAW behaviour).

Use cases:

  • Divide a long region into sections (e.g. split at bar 8 for verse/chorus)

  • Cut silence off the end of a region

  • Create variations: split, then modify one half

  • Prepare for arrangement edits (move one half elsewhere)

unit_index: AU index. track_index: Note track index. region_index: Region to split (0-based). split_beat: Absolute beat position to split at (must be within region range).

Returns original and new region details.

Example:

Split region 0 at bar 8 (beat 32 in 4/4)

split_note_region(0, 0, 0, 32)

Inputs: split_beat (required), unit_index (required), track_index (required), region_index (required). Returns: result

mcp_opendaw_split_stemsA

Split an audio file into stems using SOTA open-source separation models.

Runs locally on GPU (GTX 1650 4GB, ~4.5 min for 4-min track). All models trained at 44100Hz — auto-resampling handled internally.

input_path: Absolute path to input audio file (WAV/MP3/FLAC/OGG). mode: Separation mode (default "bs6"): - "ensemble": Max quality, 4 passes (bass/drums/vocals/other). Slowest, best SDR. - "scnet": 4-stem (drums/bass/other/vocals). Best single-pass multi-stem. - "bs6": 6-stem (bass/drums/other/vocals/guitar/piano). Fast, low bleeding. - "polarformer": Vocal extraction only (vocals/instrumental). - "dereverb": Remove reverb from vocals (dry/reverb). - "drumsep": Drum separation (kick/snare/cymbals/toms). - "denoise": Noise cleanup for low-quality sources (clean/noise). output_dir: Directory for stem files (default: /tmp/stems_<input_basename>). import_to_daw: If True, load each stem into the DAW and return sample IDs for use with place_audio_region. Requires DAW bridge running.

Returns list of stem file paths (and sample IDs if import_to_daw=True).

Workflow: split_stems("track.wav", "bs6") → 6 stem WAVs split_stems("track.wav", "ensemble", import_to_daw=True) → 4 stems loaded into DAW

Inputs: input_path (required), mode, output_dir, import_to_daw. Returns: result

mcp_opendaw_spread_voicingA

Spread or compact a chord voicing — open vs close harmony.

Transforms the spacing between chord tones at a specific beat position. Close voicing (all notes within one octave) sounds tight and focused. Open voicing (notes spread across multiple octaves) sounds wide and spacious — the hallmark of jazz piano, film score strings, and orchestral arrangements.

mode: "open" — move every other note up by spread_octaves octaves. This creates drop-2/drop-3 style open voicings from close chords. The lowest note stays, the next goes up an octave, the next stays, etc. Result: wider intervallic spacing, more airy sound. mode: "close" — collapse all chord tones into the lowest possible octave (within 12 semitones from the lowest note). Compresses spread voicings back to close harmony. Useful for tight block chords after open passages. mode: "drop2" — drop the second-highest note down an octave. Classic jazz piano voicing technique. Creates the quintessential "comping" sound. mode: "drop3" — drop the third-highest note down an octave. Another standard jazz voicing, slightly wider than drop2.

chord_position: Beat position where the chord starts (finds all notes at this position, groups them as a chord). spread_octaves: For "open" mode — how many octaves to spread (1-3, default 1). 1 = subtle widening, 2 = very open, 3 = extreme.

Returns original pitches, new pitches, mode used, chord size.

Example:

Open up a close triad for jazz piano sound

spread_voicing(0, 2, 0, 4.0, mode="open")

Classic drop-2 jazz voicing

spread_voicing(0, 2, 0, 4.0, mode="drop2")

Inputs: unit_index (required), track_index (required), region_index (required), chord_position (required), +2 more. Returns: result

mcp_opendaw_start_engineA

Start the audio engine (AudioWorklet) after setting up tracks and regions.

Call this AFTER loading audio, creating tracks, and placing regions — but BEFORE playback or effects. The engine serializes the current project state into the AudioWorklet processor, so all boxes must exist first.

Inputs: no named parameters. Returns: result

mcp_opendaw_strum_notesA

Strum simultaneous notes — convert block chords into guitar-style strums.

Finds groups of notes that start at the same position (within a small tolerance) and offsets them in time to simulate a pick or strum crossing the strings. This transforms static chord pads into lifelike guitar parts.

direction: Strum direction:

  • "down" — low to high (bass strings first, treble last). Default for downstrokes. Most natural for guitar.

  • "up" — high to low (treble first, bass last). Upstroke feel.

  • "random" — random order per chord. Banjo/ukulele feel.

speed: Time between consecutive strings in beats. 0.03125 = 1/32 note (fast shred), 0.0625 = 1/16 (standard strum), 0.125 = 1/8 (slow arpeggiated strum), 0.25 = 1/4 (very slow, harp-like). Range 0.005 to 0.5.

jitter: Random timing variation per string (0.0 = exact, 0.02 = ±2% of speed as humanization). Adds realism. Range 0.0-0.1.

Notes are sorted by pitch within each chord group, then offset by speed × index from the original start position. The first note stays at the original position; subsequent notes are delayed.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track).

Returns per-track chord groups found, notes strummed.

Example:

Standard downstroke — 1/16 between strings

strum_notes(unit_index=0, track_index=2, direction="down", speed=0.0625)

Slow harp-like arpeggiation

strum_notes(unit_index=0, track_index=2, direction="down", speed=0.25)

Upstroke with humanization

strum_notes(unit_index=0, track_index=2, direction="up", speed=0.0625, jitter=0.03)

Inputs: speed, jitter, direction, unit_index, +2 more. Returns: result

mcp_opendaw_subdivide_notesA

Subdivide each note in a region into N smaller notes.

Splits every note into subdivisions equal parts. Useful for diminution (quarter → 2 eighths), rhythmic fragmentation, and creating faster passagework from longer notes.

Args: unit_index: Audio unit index track_index: Note track index region_index: Region index (-1 = first region) subdivisions: Number of parts per note (2-16). 2=diminution, 4=sixteenth fragmentation, 3=triplet subdivision. pitch_pattern: Pitch variation per subdivision — "same" = keep original pitch, "scale_up" = ascend scale degrees within the octave, "scale_down" = descend scale degrees, "octave_up" = alternate original and octave up, "octave_down" = alternate original and octave down, "chromatic_up" = semitone steps up, "chromatic_down" = semitone steps down. velocity_pattern: Velocity variation per subdivision — "same" = keep original velocity, "decrescendo" = fade from full to half, "crescendo" = build from half to full, "accent_first" = first sub-note accented, rest softer, "accent_last" = last sub-note accented, "alternating" = strong-weak-strong-weak pattern. accent_first: If True, first subdivision note keeps full velocity (traditional articulation). Overridden by velocity_pattern. dest_track_index: Destination track (-1 = same track). Original notes are replaced in place when same track.

Inputs: unit_index (required), track_index (required), accent_first, region_index, +4 more. Returns: result

mcp_opendaw_swap_sectionsA

Swap two sections of the arrangement — exchange their positions on the timeline.

Exchanges all note/audio content between two time ranges, moving section A to where section B was and vice versa. Useful for song structure experimentation: try chorus before verse, swap bridge with solo, reorder sections without manual cut/paste.

Both sections can be different lengths — the swap preserves each section's content and shifts everything accordingly. If sections are adjacent, it's a simple swap. If there's a gap between them, the gap content stays in place.

Args: section1_start: Start beat of first section section1_end: End beat of first section section2_start: Start beat of second section (must be > section1_end) section2_end: End beat of second section unit_indices: Comma-separated unit indices to process ("" = all units)

Returns: JSON with sections_swapped, notes_moved per unit, section sizes.

Inputs: section1_end (required), section2_end (required), section1_start (required), section2_start (required), +1 more. Returns: result

mcp_opendaw_switch_phaseA

Switch the active tool phase for phase-based tool loading.

When OPENDAW_MCP_MODE=phase, only tools for the active phase are registered. This reduces the tool schema payload by showing only relevant tools.

Phases:

  • inspect: read-only — project state, list tracks/regions/effects, meters, analysis

  • compose: create — tracks, instruments, notes, regions, sections, arrangements, chords, melodies

  • mix: effects — add/configure effects, sends, buses, mixing, mastering, genre effects, automation

  • render: output — render, export, audio I/O, time/pitch stretch, presets

Meta-tools (evaluate_raw, get_full_project_state, switch_phase) are always available.

phase: inspect | compose | mix | render

Example: switch_phase("compose") # activate composition tools switch_phase("mix") # switch to mixing tools

Inputs: phase (required). Returns: result

mcp_opendaw_thin_notesA

Thin out notes in a region — reduce note density for cleaner patterns.

After AI generation, transcription, or dense arrangement, MIDI can be cluttered with too many notes. This tool selectively removes notes to clean up the pattern while preserving musical intent.

Three strategies:

  • "interval" — keep every Nth note (sorted by position). interval=2 keeps every 2nd note, interval=3 keeps every 3rd. Creates space.

  • "velocity_threshold" — remove notes below a velocity threshold. Cleans up ghost notes from transcription or AI generation.

  • "random" — probabilistic removal. random_chance=0.3 means 30% of notes are removed at random. Creates organic variation.

preserve_strong_beats: When True, notes on strong beats (beat 1 and 3 in 4/4) are never removed, regardless of strategy. This maintains the rhythmic foundation while thinning fills and embellishments.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). strategy: "interval", "velocity_threshold", or "random". interval: For "interval" strategy — keep every Nth note (2=halve, 3=third). Must be 2-16. velocity_threshold: For "velocity_threshold" strategy — remove notes with velocity below this value (0.0-1.0, default 0.3). random_chance: For "random" strategy — probability of removing each note (0.0-1.0, default 0.3 = 30% removed). preserve_strong_beats: Keep notes on beat 1 and 3 (0 and 1920 PPQN in 4/4).

Returns per-track original count, removed count, remaining count.

Example:

Halve note density — keep every 2nd note

thin_notes(unit_index=0, track_index=0, strategy="interval", interval=2)

Remove ghost notes below velocity 0.25

thin_notes(unit_index=0, track_index=0, strategy="velocity_threshold", velocity_threshold=0.25)

Random 40% thinning for organic variation

thin_notes(unit_index=0, track_index=0, strategy="random", random_chance=0.4)

Inputs: interval, strategy, unit_index, track_index, +4 more. Returns: result

mcp_opendaw_time_warp_notesA

Warp note positions and durations by a factor — half-time / double-time / custom stretch.

Scales both the position and duration of every note in a region by warp_factor. Unlike scale_durations (which only changes note length, not position), this moves notes in time — creating true half-time (0.5×) or double-time (2.0×) feel without changing the DAW's BPM.

Half-time (0.5): notes spread out — a 1-bar pattern becomes 2 bars. Classic for trap, lofi, and creating build-ups before a drop. Double-time (2.0): notes compress — a 2-bar pattern becomes 1 bar. Useful for intensifying a section or creating fills.

unit_index: AU index (-1 = all AUs). track_index: Note track index (-1 = all note tracks on the AU). region_index: Region index (-1 = all regions on the track). warp_factor: Time scaling factor. 0.5 = half-time, 2.0 = double-time, 0.25 = quarter-time, 1.5 = 1.5× stretch. Range 0.1-8.0. origin: Anchor point for the warp — "start" (region start), or "zero" (position 0). "start" preserves relative spacing from region start. "zero" warps from absolute zero.

Returns per-track modification counts and new region extent.

Inputs: origin, unit_index, track_index, warp_factor, +1 more. Returns: result

mcp_opendaw_transcribe_audioA

Transcribe a full audio track — drums + melody — into MIDI notes in one call.

Composite tool that runs transcribe_drums + transcribe_melody on the same WAV file, placing drum notes on one track and melody notes on another. Eliminates 2 separate calls. Essential for Suno-to-MIDI pipeline: download_audio → transcribe_audio → full MIDI reconstruction on 2 tracks.

Pipeline:

  1. Parse WAV file

  2. Auto-detect BPM (if bpm=0)

  3. Transcribe drums → kick/snare/hat on drum_track (pitch 36/38/42)

  4. Transcribe melody → pitched notes on melody_track (with cents + clarity)

  5. Create MIDI notes via create_notes_batch on both tracks

Use cases:

  • Extract full groove from a Suno track → remix in DAW

  • Convert a loop to MIDI → quantize, replace instruments, rearrange

  • Capture a performance → edit and enhance

filename: WAV file name (in exports dir) or absolute path. bpm: Tempo for beat conversion (0 = auto-detect). unit_index: AU index with note tracks. drum_track: Track for drum notes (default 0). melody_track: Track for melody notes (default 1).

Returns: drum notes, melody notes, bpm, duration, band counts, avg clarity.

Example:

Full transcription of a Suno track

result = transcribe_audio("suno_track.wav", bpm=120)

Auto-detect BPM

result = transcribe_audio("loop.wav") # bpm=0 → auto-detect

Inputs: filename (required), bpm, drum_track, unit_index, +1 more. Returns: result

mcp_opendaw_transcribe_drumsA

Transcribe drum onsets from an audio file into MIDI notes on a DAW track.

Audio-to-MIDI drum transcription — converts a drum recording (or any audio with percussive content) into MIDI notes. Pure Python, no external deps.

Pipeline:

  1. Parse WAV file

  2. Split into 3 frequency bands (kick <250Hz, snare 250-2500Hz, hat >2500Hz)

  3. Per-band onset detection (energy spike above local average)

  4. Classify each onset: kick (pitch 36), snare (38), hat (42)

  5. Estimate velocity from onset amplitude

  6. Convert onset times to beat positions (if bpm provided)

  7. Create MIDI notes on the specified track via create_notes_batch

Use cases:

  • Extract a drum groove from a Suno track → reuse as MIDI pattern

  • Transcribe a real drum recording → edit/quantize in DAW

  • Replace original drums with a different instrument

filename: WAV file name (in exports dir) or absolute path. bpm: Tempo for beat conversion (0 = auto-detect via detect_bpm first). sensitivity: Onset detection threshold (1.0=more sensitive, 2.0=less, default 1.5). unit_index: AU index with note tracks. track_index: Track to place transcribed notes.

Returns: notes created, onset count, band counts (kick/snare/hat), bpm, duration.

Example:

Transcribe a drum loop from a downloaded Suno track

result = transcribe_drums("suno_track.wav", bpm=120)

Auto-detect BPM first

result = transcribe_drums("drum_loop.wav") # bpm=0 → auto-detect

Inputs: filename (required), bpm, unit_index, sensitivity, +1 more. Returns: result

mcp_opendaw_transcribe_melodyA

Transcribe monophonic melody from an audio file into MIDI notes on a DAW track.

Audio-to-MIDI melody transcription — converts a monophonic instrument recording (bass, vocal, lead synth, horn) into MIDI notes. Pure Python, no external deps.

Pipeline:

  1. Parse WAV file

  2. Frame-by-frame autocorrelation pitch detection

  3. Convert frequency → MIDI pitch (with cents deviation for tuning accuracy)

  4. Group consecutive similar-pitch frames into sustained notes

  5. Estimate velocity from frame energy

  6. Create MIDI notes on the specified track via create_notes_batch

Use cases:

  • Extract a bass line from a Suno track → reuse as MIDI

  • Transcribe a vocal melody → harmonize or transform

  • Capture a horn line → arrange for other instruments

  • Convert any monophonic audio to editable MIDI

filename: WAV file name (in exports dir) or absolute path. bpm: Tempo for beat conversion (0 = auto-detect via detect_bpm). unit_index: AU index with note tracks. track_index: Track to place transcribed notes.

Returns: notes created, note count, bpm, duration, average clarity.

Example:

Transcribe a bass line from a Suno track

result = transcribe_melody("suno_bass.wav", bpm=120)

Auto-detect BPM

result = transcribe_melody("vocal.wav") # bpm=0 → auto-detect

Inputs: filename (required), bpm, unit_index, track_index. Returns: result

mcp_opendaw_transfer_audiounitA

Transfer/copy an audio unit (instrument/effects/tracks/regions) within the project.

Uses TransferAudioUnits.transfer — deep-copy an AU with all dependencies (instrument, effects, MIDI effects, tracks, regions, notes, automation) via box-graph serialization. Much more complete than duplicate_audiounit (which uses Python orchestration). Output unit cannot be copied.

unit_index: Source AU index to copy. delete_source: If true, delete source AU after copy (move semantics). insert_index: Position in mixer order for the new AU (-1 = auto-place by type ordering).

Returns the new AU's index, type, and label, or error.

Inputs: unit_index (required), insert_index, delete_source. Returns: result

mcp_opendaw_transfer_regionA

Transfer/copy a region to another track at a specific position.

Uses TransferRegions.transfer — copies the region and all its dependencies (notes, events, audio files) to the target track. Works across different audio units. Preserved resources (AudioFileBox) are shared, not duplicated. The source region can optionally be deleted (move semantics).

src_unit_index: Source AU index. src_track_index: Source track index within AU. region_index: Region index within source track (0-based, sorted by position). dst_unit_index: Destination AU index. dst_track_index: Destination track index within AU. insert_position: Position in beats for the new region. delete_source: If true, delete the source region (move). If false, keep source (copy).

Returns the new region's type, position, and duration, or error.

Inputs: region_index (required), dst_unit_index (required), src_unit_index (required), dst_track_index (required), +3 more. Returns: result

mcp_opendaw_transportA

Control transport: play, stop, or toggle.

action: "play", "stop", or "toggle"

Inputs: action (required). Returns: result

mcp_opendaw_transpose_notesA

Transpose all notes by a number of semitones.

semitones: Positive = up, negative = down (e.g. +12 = octave up, -5 = perfect fourth down). unit_index: Audio unit index (-1 = all AUs with note tracks). track_index: Specific note track (-1 = all note tracks on the AU). region_index: Specific region index (-1 = all regions on the track).

Returns count of notes transposed and notes skipped (out of MIDI range 0-127).

Inputs: semitones (required), unit_index (required), track_index (required), region_index. Returns: result

mcp_opendaw_undoB

Undo the last editing operation.

Inputs: no named parameters. Returns: result

mcp_opendaw_unfreeze_audiounitA

Unfreeze a frozen audio unit — resume real-time processing.

Removes the cached audio and resumes live processing of instruments, effects, and sends for the specified audio unit.

unit_index: AU index to unfreeze.

Returns success or error.

Inputs: unit_index (required). Returns: result

mcp_opendaw_update_automation_eventA

Update an existing automation event's value and/or interpolation.

Only updates parameters that are provided (value >= 0, non-empty interpolation, curve_slope >= 0).

unit_index: AU index. track_index: Value (automation) track index. event_index: Event index (from list_automation_events). value: New normalized value 0.0-1.0 (skip if -1). interpolation: "none", "linear", or "curve" (skip if empty string). curve_slope: Slope for curve interpolation 0.0-1.0 (skip if -1).

Returns success with updated values.

Inputs: unit_index (required), event_index (required), track_index (required), value, +2 more. Returns: result

mcp_opendaw_update_warp_markerA

Update a warp marker's position and/or seconds value.

Pass -1.0 for either parameter to leave it unchanged.

unit_index: AU index. track_index: Track index within the AU. region_index: Audio region index. marker_index: Warp marker index (0-based). position_beats: New musical position in beats (-1 = unchanged). seconds: New audio time in seconds (-1 = unchanged).

Returns updated marker values.

Inputs: unit_index (required), track_index (required), marker_index (required), region_index (required), +2 more. Returns: result

mcp_opendaw_validate_projectA

Check if the project is valid — detects overlapping regions on the same track.

Returns valid (bool) and details about any issues found.

Inputs: no named parameters. Returns: result

mcp_opendaw_wait_for_conditionA

Wait for a JavaScript condition to evaluate to true in the DAW context.

Polls the condition at regular intervals until it returns true or timeout is reached.

condition_js: JavaScript expression that returns a truthy value when the condition is met. timeout_ms: Maximum wait time in milliseconds (default 10000). poll_interval_ms: Polling interval in milliseconds (default 500).

Inputs: condition_js (required), timeout_ms, poll_interval_ms. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 515 tools

    Disambiguation1/5

    Dozens of tool pairs are functionally indistinguishable: apply_articulation vs set_articulation, split_stems vs separate_stems, create_break vs create_breakbeat, create_chord_progression vs create_chord_pads, create_arpeggio vs create_arpeggiated_progression, get_project_state vs get_full_project_state vs get_project_info vs get_project_metadata, and 30+ genre arrangement tools differing only in genre. An agent cannot reliably select between these without reading every description.

    Naming Consistency3/5

    The dominant pattern is consistent verb_noun (create_*, set_*, get_*, list_*, delete_*) under a uniform mcp_opendaw_ prefix. However, there are notable deviations: bare nouns (transport, undo, redo, serialize, note_stats), inconsistent compound spelling (audio_unit vs audiounit in duplicate_audiounit vs delete_audio_unit), and mixed noun-verb forms (engine_sleep, ppqn_to_seconds).

    Tool Count1/5

    515 tools is extreme by any standard — over 10x the high end of a typical well-scoped server. Even for a comprehensive DAW, the count is inflated by ~30 near-identical genre arrangement generators, at least 7 melody generation tools, 3 stem-splitting tools, 4 project-state tools, and dozens of micro-variations. The switch_phase mechanism acknowledges this bloat but doesn't reduce the total surface.

    Completeness5/5

    The DAW domain is covered end-to-end with no obvious dead ends: project lifecycle (create/load/save/reset), track/region/note editing, instruments, effects, sends/buses, automation, mixing, mastering, rendering/export (WAV/stems/MIDI/dawproject), audio analysis (BPM/key/LUFS/spectrum/stereo/dynamics/masking), transcription, stem separation, and AI-assisted composition. Every workflow from import to master has tooling.

    Maintenance

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers