Skip to main content
Glama

transform_notes

Destructive

Edit MIDI clip notes with musical transforms such as transpose, quantize, or arpeggiate, previewing changes and writing results in one undo step.

Instructions

Change notes already in a MIDI clip with a music transform: reads the notes, transforms them, writes the result in ONE undo step. address: a MIDI clip; transform + params. Transforms: transpose, fit_to_scale, invert, reverse, stretch, shift, humanize, swing, quantize, legato, gate, velocity_shape, strum, recombine, arpeggiate, chop, stack, grace_notes, trill, repeat. Use transform 'help' for every transform's parameters and kind. Select notes with a range (from_time/time_span/from_pitch/pitch_span) or, for in-place transforms, ids from get_notes; default is every note. dry_run previews without writing. In-place transforms keep note ids and settings; rebuilds replace the selected notes in one step; additions keep them. Notes that would land outside MIDI range or before beat 0 refuse in-place transforms. Times are beats, pitches C3 = 60.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idsNoOnly these note ids (in-place transforms)
expectNoGuard: {"name": "..."} must match the clip
paramsNoThe transform's parameters (see the list in the tool description)
addressNoA MIDI clip, e.g. 'tracks/2/slots/0/clip'
dry_runNoPreview the result without changing the clip
from_timeNoOnly notes starting at or after this beat
time_spanNoLength of the time range in beats
transformYesWhich transform (help lists them all with parameters)
from_pitchNoLowest pitch of the range
pitch_spanNoNumber of pitches in the range

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv2.0.3

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructive=true, idempotent=false, readOnly=false, but the description adds material behavior beyond them: single-undo-step atomicity, in-place vs rebuild vs addition semantics for note ids, refusal when notes land outside MIDI range or before beat 0, dry_run preview, and unit conventions (beats, C3=60). This is exactly the extra context a mutation tool needs.

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

Conciseness4/5

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

Front-loaded purpose and atomicity, then addressing, transforms, selection, and semantics in a tight, dense paragraph. Minor redundancy: the full list of 20 transforms repeats the schema enum verbatim, which costs space without adding information.

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

Completeness4/5

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

For a 10-param, nested-object, destructive mutation tool with no output schema, the description covers selection, addressing, units, atomicity, and failure conditions. It could say more about what dry_run returns or error reporting, but an agent has enough to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes further by explaining that range params are an alternative to `ids`, that the default selection is every note, that `ids` only applies to in-place transforms, and that times are beats with C3 = 60. It adds real meaning over the schema's terse per-param lines.

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

Purpose5/5

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

States a specific verb (change/transform) and resource (notes in a MIDI clip), and pins down the atomic behavior ('reads the notes, transforms them, writes the result in ONE undo step'). An agent can distinguish this from write_notes/get_notes/edit_notes by the described read-transform-write cycle and the named transform set.

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

Usage Guidelines4/5

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

Gives clear context: use range params (from_time/time_span/from_pitch/pitch_span) or `ids` from get_notes for in-place transforms, with default = every note, and points to transform 'help' for per-transform params. It names one sibling (get_notes) as a source of ids but never states when to prefer edit_notes or generate_notes instead, so it stops short of explicit when-not guidance.

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