← WebMCP Directory

Tool tree

duet-pearl.vercel.app

Media & PersonalTools verified
Website
Duet — record a melody, then ask your browser agent to become the rest of your band. A shared human + agent music studio built on WebMCP.
Explore capabilities
    studio_get_sessionAnswer

    Read the complete live Duet session: title, tempo, key/scale, mode, every instrument track with its exact notes, drum pattern, chords, mixer settings, and recent activity. Call this first — the human may have recorded a melody that exists only in this browser session. Call it again after the human edits to see their changes.

    View tool JSON
    {
      "name": "studio_get_session",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the complete live Duet session: title, tempo, key/scale, mode, every instrument track with its exact notes, drum pattern, chords, mixer settings, and recent activity. Call this first — the human may have recorded a melody that exists only in this browser session. Call it again after the human edits to see their changes.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    studio_list_instrumentsAction

    List instrument modules currently in the rack and which can still be added. Adding an instrument exposes its dedicated editing tool (e.g. drums_edit).

    View tool JSON
    {
      "name": "studio_list_instruments",
      "kind": "act",
      "impl": "imperative",
      "description": "List instrument modules currently in the rack and which can still be added. Adding an instrument exposes its dedicated editing tool (e.g. drums_edit).",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    studio_add_instrumentAction

    Add an instrument module (keys, drums, bass, or pad) to the studio rack. The module appears visually for the human, and its dedicated editing tool (keys_edit / drums_edit / bass_edit / pad_edit) becomes available to you immediately after.

    View tool JSON
    {
      "name": "studio_add_instrument",
      "kind": "act",
      "impl": "imperative",
      "description": "Add an instrument module (keys, drums, bass, or pad) to the studio rack. The module appears visually for the human, and its dedicated editing tool (keys_edit / drums_edit / bass_edit / pad_edit) becomes available to you immediately after.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "instrument": {
            "type": "string",
            "enum": [
              "keys",
              "drums",
              "bass",
              "pad"
            ],
            "description": "Instrument to add."
          }
        },
        "required": [
          "instrument"
        ]
      }
    }
    studio_remove_instrumentAction

    Remove an instrument module (keys, drums, bass, or pad) from the rack. Its content is cleared and its editing tool disappears. The lead synth carries the human melody and cannot be removed.

    View tool JSON
    {
      "name": "studio_remove_instrument",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove an instrument module (keys, drums, bass, or pad) from the rack. Its content is cleared and its editing tool disappears. The lead synth carries the human melody and cannot be removed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "instrument": {
            "type": "string",
            "enum": [
              "keys",
              "drums",
              "bass",
              "pad"
            ]
          }
        },
        "required": [
          "instrument"
        ]
      }
    }
    studio_set_tempoAction

    Set the loop tempo in BPM (60-200). Takes effect immediately, even during playback.

    View tool JSON
    {
      "name": "studio_set_tempo",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the loop tempo in BPM (60-200). Takes effect immediately, even during playback.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bpm": {
            "type": "number",
            "minimum": 60,
            "maximum": 200
          }
        },
        "required": [
          "bpm"
        ]
      }
    }
    studio_set_keyAction

    Set the musical key and/or scale. By default a key change transposes all existing notes and chords by the shortest path to the new root, so the change is immediately audible. Set transposeExisting to false to relabel the key without moving any notes. Scale changes never move notes.

    View tool JSON
    {
      "name": "studio_set_key",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the musical key and/or scale. By default a key change transposes all existing notes and chords by the shortest path to the new root, so the change is immediately audible. Set transposeExisting to false to relabel the key without moving any notes. Scale changes never move notes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "enum": [
              "C",
              "Db",
              "D",
              "Eb",
              "E",
              "F",
              "F#",
              "G",
              "Ab",
              "A",
              "Bb",
              "B"
            ],
            "description": "Root pitch class."
          },
          "scale": {
            "type": "string",
            "enum": [
              "major",
              "minor",
              "harmonicMinor",
              "dorian",
              "phrygian",
              "mixolydian",
              "majorPentatonic",
              "minorPentatonic"
            ]
          },
          "transposeExisting": {
            "type": "boolean",
            "description": "Transpose existing notes/chords to the new key (default true)."
          }
        }
      }
    }
    studio_set_grooveAction

    Set global groove settings: swing (0-0.6, delays every off-beat 16th — 0 straight, 0.2 gentle shuffle), space (0-1, global reverb send on lead, keys and pad), and/or humanize (0-1, deterministic micro-timing and velocity variation seeded per step — subtle values around 0.2-0.4 sound human; high values sound sloppy). Groove comes from timing AND velocity together — combine swing/humanize with accented note velocities.

    View tool JSON
    {
      "name": "studio_set_groove",
      "kind": "act",
      "impl": "imperative",
      "description": "Set global groove settings: swing (0-0.6, delays every off-beat 16th — 0 straight, 0.2 gentle shuffle), space (0-1, global reverb send on lead, keys and pad), and/or humanize (0-1, deterministic micro-timing and velocity variation seeded per step — subtle values around 0.2-0.4 sound human; high values sound sloppy). Groove comes from timing AND velocity together — combine swing/humanize with accented note velocities.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "swing": {
            "type": "number",
            "minimum": 0,
            "maximum": 0.6
          },
          "space": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "humanize": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    }
    studio_enter_performanceAction

    Switch the studio into Performance mode. Composition tools are withdrawn and replaced with performance tools (performance_play, performance_set_energy, performance_set_track_mix, performance_launch_breakdown, ...). Use this when the arrangement is ready to perform.

    View tool JSON
    {
      "name": "studio_enter_performance",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the studio into Performance mode. Composition tools are withdrawn and replaced with performance tools (performance_play, performance_set_energy, performance_set_track_mix, performance_launch_breakdown, ...). Use this when the arrangement is ready to perform.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    studio_publishAction

    Publish the current composition as a shareable remix link. This pauses and asks the human to approve (and possibly edit) the song title in the Duet UI before anything is created — the result reports whether they approved, and the remix URL if so.

    View tool JSON
    {
      "name": "studio_publish",
      "kind": "act",
      "impl": "imperative",
      "description": "Publish the current composition as a shareable remix link. This pauses and asks the human to approve (and possibly edit) the song title in the Duet UI before anything is created — the result reports whether they approved, and the remix URL if so.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 80,
            "description": "Suggested song title for the human to review."
          }
        }
      }
    }
    lead_editAction

    Edit the Lead Synth track. Operations: replace_notes (rewrite the whole track), add_notes, patch_steps (change pitch/velocity/duration/offset of notes starting at given steps), remove_steps, set_preset (neon, hyper, glass, saw, wire, laser, chip, velvet, brass, air), set_mix (volume/mute). Notes carry velocity and a small timing offset — preserve the human’s expressive values; vary your own (identical velocities sound mechanical). The lead holds the human melody and is protected by the Musical Contract: when locked, note edits pause and ask the human for permission.

    View tool JSON
    {
      "name": "lead_edit",
      "kind": "act",
      "impl": "imperative",
      "description": "Edit the Lead Synth track. Operations: replace_notes (rewrite the whole track), add_notes, patch_steps (change pitch/velocity/duration/offset of notes starting at given steps), remove_steps, set_preset (neon, hyper, glass, saw, wire, laser, chip, velvet, brass, air), set_mix (volume/mute). Notes carry velocity and a small timing offset — preserve the human’s expressive values; vary your own (identical velocities sound mechanical). The lead holds the human melody and is protected by the Musical Contract: when locked, note edits pause and ask the human for permission.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "replace_notes",
              "add_notes",
              "patch_steps",
              "remove_steps",
              "set_preset",
              "set_mix"
            ]
          },
          "notes": {
            "type": "array",
            "description": "For replace_notes / add_notes.",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 15,
                  "description": "Start step, 0-15."
                },
                "pitch": {
                  "type": "string",
                  "description": "Scientific pitch between C1 and C7, e.g. \"C4\", \"Eb3\", \"F#5\"."
                },
                "duration": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16,
                  "description": "Length in steps (default 1). step + duration must be <= 16."
                },
                "velocity": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1,
                  "description": "Loudness 0-1 (default 0.8). Vary it — identical velocities sound mechanical."
                },
                "offset": {
                  "type": "number",
                  "minimum": -0.45,
                  "maximum": 0.45,
                  "description": "Expressive micro-timing in steps (default 0). ±0.05 is subtle; keep it small."
                }
              },
              "required": [
                "step",
                "pitch"
              ]
            }
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 15
            },
            "description": "For patch_steps / remove_steps: steps where target notes start."
          },
          "pitch": {
            "type": "string",
            "description": "patch_steps: new pitch for the targeted notes."
          },
          "velocity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "patch_steps: new velocity."
          },
          "duration": {
            "type": "integer",
            "minimum": 1,
            "maximum": 16,
            "description": "patch_steps: new duration in steps."
          },
          "offset": {
            "type": "number",
            "minimum": -0.45,
            "maximum": 0.45,
            "description": "patch_steps: new timing offset in steps."
          },
          "preset": {
            "type": "string",
            "enum": [
              "neon",
              "hyper",
              "glass",
              "saw",
              "wire",
              "laser",
              "chip",
              "velvet",
              "brass",
              "air"
            ],
            "description": "For set_preset."
          },
          "volume": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Track volume 0-1."
          },
          "muted": {
            "type": "boolean"
          }
        },
        "required": [
          "op"
        ]
      }
    }