← WebMCP Directory

Tool tree

duetstudio.mehmetcan.me

Media & PersonalTools verified
Website
A browser music studio where you and your AI agent produce a track together. Built on WebMCP: the whole song is exposed as tools the agent can hear and play.
Explore capabilities
    get_songAnswer

    Read the song as text: tempo, swing, bars, key/scale, tracks, transport and human selection. Call this first; use get_recent_changes for later human edits. Long note lists are shortened here — pass track to read that one track in full. Steps are 0-indexed 16ths, 16 per bar. Drums: X accent, x hit, o soft, . rest. Melodic notes: step:Note(length).

    View tool JSON
    {
      "name": "get_song",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the song as text: tempo, swing, bars, key/scale, tracks, transport and human selection. Call this first; use get_recent_changes for later human edits. Long note lists are shortened here — pass track to read that one track in full. Steps are 0-indexed 16ths, 16 per bar. Drums: X accent, x hit, o soft, . rest. Melodic notes: step:Note(length).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Omit for the whole song. Pass a track id (preferred), exact track name, instrument id, or 1-based position to read that track's notes in full."
          }
        },
        "additionalProperties": false
      }
    }
    get_recent_changesAnswer

    Read what the human changed since the agent last observed the song with get_song or this tool. Returns up to 10 session-log entries in chronological order; call get_song afterwards when you need the full current notes or patterns.

    View tool JSON
    {
      "name": "get_recent_changes",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read what the human changed since the agent last observed the song with get_song or this tool. Returns up to 10 session-log entries in chronological order; call get_song afterwards when you need the full current notes or patterns.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    list_instrumentsAnswer

    List the available instruments: id, drum or melodic, character and recommended pitch range. Drums take patterns, melodic instruments take notes.

    View tool JSON
    {
      "name": "list_instruments",
      "kind": "answer",
      "impl": "imperative",
      "description": "List the available instruments: id, drum or melodic, character and recommended pitch range. Drums take patterns, melodic instruments take notes.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    get_scale_notesAnswer

    Music theory helper: list the notes of a scale within a pitch range, so melodies and basslines stay in key.

    View tool JSON
    {
      "name": "get_scale_notes",
      "kind": "answer",
      "impl": "imperative",
      "description": "Music theory helper: list the notes of a scale within a pitch range, so melodies and basslines stay in key.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "root": {
            "type": "string",
            "maxLength": 3,
            "description": "Root pitch class, e.g. \"A\", \"F#\", \"Bb\". Defaults to the song key."
          },
          "scale": {
            "type": "string",
            "enum": [
              "major",
              "minor",
              "dorian",
              "phrygian",
              "lydian",
              "mixolydian",
              "harmonic_minor",
              "pentatonic_major",
              "pentatonic_minor",
              "blues"
            ],
            "description": "Defaults to the song scale."
          },
          "low_note": {
            "type": "string",
            "maxLength": 4,
            "description": "Lowest note to include, e.g. \"A1\". Default C2."
          },
          "high_note": {
            "type": "string",
            "maxLength": 4,
            "description": "Highest note to include, e.g. \"A4\". Default C5."
          }
        },
        "additionalProperties": false
      }
    }
    set_tempoAction

    Change tempo (BPM) and/or swing. Swing is 0 (straight) to 0.6 (heavy shuffle), applied to off-beat 16ths.

    View tool JSON
    {
      "name": "set_tempo",
      "kind": "act",
      "impl": "imperative",
      "description": "Change tempo (BPM) and/or swing. Swing is 0 (straight) to 0.6 (heavy shuffle), applied to off-beat 16ths.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bpm": {
            "type": "number",
            "minimum": 40,
            "maximum": 240
          },
          "swing": {
            "type": "number",
            "minimum": 0,
            "maximum": 0.6
          }
        },
        "additionalProperties": false
      }
    }
    set_playbackAction

    Start or stop playback. The loop plays continuously and picks up edits live. Audio can only start after the human has clicked somewhere on the page at least once.

    View tool JSON
    {
      "name": "set_playback",
      "kind": "act",
      "impl": "imperative",
      "description": "Start or stop playback. The loop plays continuously and picks up edits live. Audio can only start after the human has clicked somewhere on the page at least once.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "playing": {
            "type": "boolean"
          }
        },
        "required": [
          "playing"
        ],
        "additionalProperties": false
      }
    }
    set_song_metaAction

    Set the song title, key, scale and/or length in bars (1, 2 or 4). Growing the song tiles existing material; shrinking drops the extra bars.

    View tool JSON
    {
      "name": "set_song_meta",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the song title, key, scale and/or length in bars (1, 2 or 4). Growing the song tiles existing material; shrinking drops the extra bars.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 60
          },
          "key": {
            "type": "string",
            "maxLength": 3,
            "description": "Pitch class such as \"A\" or \"F#\""
          },
          "scale": {
            "type": "string",
            "enum": [
              "major",
              "minor",
              "dorian",
              "phrygian",
              "lydian",
              "mixolydian",
              "harmonic_minor",
              "pentatonic_major",
              "pentatonic_minor",
              "blues"
            ]
          },
          "bars": {
            "type": "integer",
            "enum": [
              1,
              2,
              4
            ]
          }
        },
        "additionalProperties": false
      }
    }
    add_trackAction

    Add a new track. Drum tracks take an optional pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit; 16 chars per bar, short patterns repeat). Melodic tracks take optional notes. Returns the new track id.

    View tool JSON
    {
      "name": "add_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Add a new track. Drum tracks take an optional pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit; 16 chars per bar, short patterns repeat). Melodic tracks take optional notes. Returns the new track id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "instrument": {
            "type": "string",
            "enum": [
              "kick",
              "snare",
              "hat_closed",
              "hat_open",
              "clap",
              "tom",
              "rim",
              "cowbell",
              "shaker",
              "bass",
              "lead",
              "pad",
              "pluck",
              "keys"
            ]
          },
          "name": {
            "type": "string",
            "maxLength": 32,
            "description": "Display name, defaults to the instrument label"
          },
          "pattern": {
            "type": "string",
            "maxLength": 96,
            "description": "Drums only, e.g. \"x.x.x.x.x.x.x.x.\""
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "0-indexed 16th-note step (0-15 in bar 1, 16-31 in bar 2, ...)"
                },
                "note": {
                  "type": [
                    "string",
                    "integer"
                  ],
                  "description": "Scientific pitch such as \"A2\", \"C#3\", \"Bb1\", or a MIDI number"
                },
                "length": {
                  "type": "integer",
                  "description": "Length in steps, default 1",
                  "minimum": 1,
                  "maximum": 64
                },
                "velocity": {
                  "type": "number",
                  "description": "0.05-1, default 0.8",
                  "minimum": 0.05,
                  "maximum": 1
                }
              },
              "required": [
                "step",
                "note"
              ],
              "additionalProperties": false
            },
            "maxItems": 256,
            "description": "Melodic only"
          }
        },
        "required": [
          "instrument"
        ],
        "additionalProperties": false
      }
    }
    remove_trackAction

    Remove a track from the song.

    View tool JSON
    {
      "name": "remove_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove a track from the song.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      }
    }
    update_trackAction

    Rename a track or change its mixer settings: volume (0-1), mute, solo.

    View tool JSON
    {
      "name": "update_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Rename a track or change its mixer settings: volume (0-1), mute, solo.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          },
          "name": {
            "type": "string",
            "maxLength": 32
          },
          "volume": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "mute": {
            "type": "boolean"
          },
          "solo": {
            "type": "boolean"
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      }
    }
    set_drum_patternAction

    Replace a drum track using either a pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit) or euclid { hits, steps, rotate? }. Short patterns repeat across the song; `bar` targets one 16-step bar.

    View tool JSON
    {
      "name": "set_drum_pattern",
      "kind": "act",
      "impl": "imperative",
      "description": "Replace a drum track using either a pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit) or euclid { hits, steps, rotate? }. Short patterns repeat across the song; `bar` targets one 16-step bar.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          },
          "pattern": {
            "type": "string",
            "maxLength": 96,
            "description": "e.g. \"X...x...X...x...\" or \"x.x.x.x.x.x.x.x.\""
          },
          "euclid": {
            "type": "object",
            "properties": {
              "hits": {
                "type": "integer",
                "minimum": 0,
                "maximum": 64
              },
              "steps": {
                "type": "integer",
                "minimum": 1,
                "maximum": 64
              },
              "rotate": {
                "type": "integer",
                "minimum": -64,
                "maximum": 64
              }
            },
            "required": [
              "hits",
              "steps"
            ],
            "additionalProperties": false,
            "description": "Evenly distribute hits across steps; rotate moves the pattern right"
          },
          "bar": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "description": "Only write this bar (1-based)"
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      }
    }
    set_notesAction

    Write exact notes on a melodic track (bass, lead, pad, pluck, keys). mode 'replace' (default) rewrites the whole track; 'merge' adds notes. Stack notes at one step for custom chords; set_chords generates Roman progressions.

    View tool JSON
    {
      "name": "set_notes",
      "kind": "act",
      "impl": "imperative",
      "description": "Write exact notes on a melodic track (bass, lead, pad, pluck, keys). mode 'replace' (default) rewrites the whole track; 'merge' adds notes. Stack notes at one step for custom chords; set_chords generates Roman progressions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "0-indexed 16th-note step (0-15 in bar 1, 16-31 in bar 2, ...)"
                },
                "note": {
                  "type": [
                    "string",
                    "integer"
                  ],
                  "description": "Scientific pitch such as \"A2\", \"C#3\", \"Bb1\", or a MIDI number"
                },
                "length": {
                  "type": "integer",
                  "description": "Length in steps, default 1",
                  "minimum": 1,
                  "maximum": 64
                },
                "velocity": {
                  "type": "number",
                  "description": "0.05-1, default 0.8",
                  "minimum": 0.05,
                  "maximum": 1
                }
              },
              "required": [
                "step",
                "note"
              ],
              "additionalProperties": false
            },
            "maxItems": 256
          },
          "mode": {
            "type": "string",
            "enum": [
              "replace",
              "merge"
            ]
          }
        },
        "required": [
          "track",
          "notes"
        ],
        "additionalProperties": false
      }
    }
    set_chordsAction

    Write a scale-relative Roman-numeral progression such as `i VI III VII` across the whole song. Uses close voice leading on a pad or keys track. Omit track to reuse the first pad/keys track or create a Chords pad.

    View tool JSON
    {
      "name": "set_chords",
      "kind": "act",
      "impl": "imperative",
      "description": "Write a scale-relative Roman-numeral progression such as `i VI III VII` across the whole song. Uses close voice leading on a pad or keys track. Omit track to reuse the first pad/keys track or create a Chords pad.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "progression": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Space-separated Roman chords relative to the song scale, e.g. \"i VI III VII\""
          },
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          },
          "velocity": {
            "type": "number",
            "minimum": 0.05,
            "maximum": 1,
            "description": "Chord velocity, default 0.7"
          }
        },
        "required": [
          "progression"
        ],
        "additionalProperties": false
      }
    }
    humanizeAction

    Add natural velocity variation to one track (or every track). amount 0-1, default 0.3. Great for hats and shakers.

    View tool JSON
    {
      "name": "humanize",
      "kind": "act",
      "impl": "imperative",
      "description": "Add natural velocity variation to one track (or every track). amount 0-1, default 0.3. Great for hats and shakers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "maxLength": 64,
            "description": "Track id (preferred), exact track name, instrument id, or 1-based position from get_song"
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "additionalProperties": false
      }
    }
    undoAction

    Undo the last change (by anyone). Call get_song afterwards if you need the details.

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Undo the last change (by anyone). Call get_song afterwards if you need the details.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    redoAction

    Redo the last undone change.

    View tool JSON
    {
      "name": "redo",
      "kind": "act",
      "impl": "imperative",
      "description": "Redo the last undone change.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    clear_songAction

    Remove every track and start over. This asks the human for confirmation in the app and only proceeds if they approve.

    View tool JSON
    {
      "name": "clear_song",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove every track and start over. This asks the human for confirmation in the app and only proceeds if they approve.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }