← WebMCP Directory

Tool tree

duet-tau.vercel.app

Health & EducationTools verified
Website
A piano your agent can play, teach from, and answer you on.
Explore capabilities
    duet.get_stateAnswer

    Read the piano: whether audio is unlocked, whether the microphone is listening, what piece is loaded, its tempo and range, the built-in library, and whether practice mode is on. Call this first.

    View tool JSON
    {
      "name": "duet.get_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the piano: whether audio is unlocked, whether the microphone is listening, what piece is loaded, its tempo and range, the built-in library, and whether practice mode is on. Call this first.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.get_capabilitiesAnswer

    Discover what this build of Duet supports before planning: contract version, whether audio is unlocked, microphone availability, keyboard range, note limits, transport features, library size and the available modes.

    View tool JSON
    {
      "name": "duet.get_capabilities",
      "kind": "answer",
      "impl": "imperative",
      "description": "Discover what this build of Duet supports before planning: contract version, whether audio is unlocked, microphone availability, keyboard range, note limits, transport features, library size and the available modes.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.read_transportAnswer

    Read precise transport state: playing, paused or stopped, whether a count-in is running, position in bars and beats, tempo and percentage of the original, loop range, metronome, count-in bars and the hand mix.

    View tool JSON
    {
      "name": "duet.read_transport",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read precise transport state: playing, paused or stopped, whether a count-in is running, position in bars and beats, tempo and percentage of the original, loop range, metronome, count-in bars and the hand mix.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.read_scoreAnswer

    Read the loaded score a page at a time, with each note given as a name plus its bar, beat, length and hand. Use fromBar and toBar to narrow it, or pass the nextCursor from a previous call to continue. Nothing is silently truncated.

    View tool JSON
    {
      "name": "duet.read_score",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the loaded score a page at a time, with each note given as a name plus its bar, beat, length and hand. Use fromBar and toBar to narrow it, or pass the nextCursor from a previous call to continue. Nothing is silently truncated.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromBar": {
            "type": "integer",
            "minimum": 1,
            "description": "First bar to read."
          },
          "toBar": {
            "type": "integer",
            "minimum": 1,
            "description": "Last bar to read."
          },
          "cursor": {
            "type": "integer",
            "minimum": 0,
            "description": "Continue from a previous nextCursor."
          }
        },
        "additionalProperties": false
      }
    }
    duet.pauseAction

    Pause playback where it is, keeping the position so it can be resumed. Side effects: silences every sounding note and stops the playhead.

    View tool JSON
    {
      "name": "duet.pause",
      "kind": "act",
      "impl": "imperative",
      "description": "Pause playback where it is, keeping the position so it can be resumed. Side effects: silences every sounding note and stops the playhead.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.resumeAction

    Resume from where playback was paused, without a count-in. Side effects: restarts the playhead and sound from the paused position.

    View tool JSON
    {
      "name": "duet.resume",
      "kind": "act",
      "impl": "imperative",
      "description": "Resume from where playback was paused, without a count-in. Side effects: restarts the playhead and sound from the paused position.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.seekAction

    Move the playhead to a bar or beat without starting playback, or jump there if it is already playing. Side effects: moves the playhead and the note strip.

    View tool JSON
    {
      "name": "duet.seek",
      "kind": "act",
      "impl": "imperative",
      "description": "Move the playhead to a bar or beat without starting playback, or jump there if it is already playing. Side effects: moves the playhead and the note strip.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bar": {
            "type": "integer",
            "minimum": 1,
            "description": "Bar to move the playhead to."
          },
          "beat": {
            "type": "number",
            "minimum": 0,
            "description": "Exact beat, if you need finer than a bar."
          }
        },
        "additionalProperties": false
      }
    }
    duet.set_loopAction

    Loop a range of bars so a phrase repeats seamlessly, or switch looping off. Side effects: reschedules playback and shows the loop on the transport.

    View tool JSON
    {
      "name": "duet.set_loop",
      "kind": "act",
      "impl": "imperative",
      "description": "Loop a range of bars so a phrase repeats seamlessly, or switch looping off. Side effects: reschedules playback and shows the loop on the transport.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean",
            "description": "Set false to switch looping off."
          },
          "fromBar": {
            "type": "integer",
            "minimum": 1,
            "description": "First bar of the loop."
          },
          "toBar": {
            "type": "integer",
            "minimum": 1,
            "description": "Last bar of the loop."
          }
        },
        "additionalProperties": false
      }
    }
    duet.set_metronomeAction

    Turn the metronome on or off and set its subdivision and level. Side effects: adds or removes clicks from playback. It does not start playback by itself.

    View tool JSON
    {
      "name": "duet.set_metronome",
      "kind": "act",
      "impl": "imperative",
      "description": "Turn the metronome on or off and set its subdivision and level. Side effects: adds or removes clicks from playback. It does not start playback by itself.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "subdivision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "description": "1 for beats, 2 for eighths."
          },
          "level": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "additionalProperties": false
      }
    }
    duet.set_count_inAction

    Set how many bars of clicks play before the music starts, from zero to two. Side effects: applies to the next play, not the current one.

    View tool JSON
    {
      "name": "duet.set_count_in",
      "kind": "act",
      "impl": "imperative",
      "description": "Set how many bars of clicks play before the music starts, from zero to two. Side effects: applies to the next play, not the current one.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bars": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2,
            "description": "Bars of clicks before playing."
          }
        },
        "required": [
          "bars"
        ],
        "additionalProperties": false
      }
    }
    duet.set_mixAction

    Mute or unmute a hand so the learner can play along with the other one. Side effects: reschedules playback. Both hands cannot be muted at once.

    View tool JSON
    {
      "name": "duet.set_mix",
      "kind": "act",
      "impl": "imperative",
      "description": "Mute or unmute a hand so the learner can play along with the other one. Side effects: reschedules playback. Both hands cannot be muted at once.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "left": {
            "type": "string",
            "enum": [
              "on",
              "muted"
            ],
            "description": "Left hand."
          },
          "right": {
            "type": "string",
            "enum": [
              "on",
              "muted"
            ],
            "description": "Right hand."
          }
        },
        "additionalProperties": false
      }
    }
    duet.play_notesAction

    Play notes on the piano right now. Give each note a name or MIDI number, a start in beats and a length in beats. Side effects: the keys light up and the notes sound through the speakers.

    View tool JSON
    {
      "name": "duet.play_notes",
      "kind": "act",
      "impl": "imperative",
      "description": "Play notes on the piano right now. Give each note a name or MIDI number, a start in beats and a length in beats. Side effects: the keys light up and the notes sound through the speakers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "notes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 400,
            "items": {
              "type": "object",
              "properties": {
                "note": {
                  "type": [
                    "string",
                    "number"
                  ],
                  "description": "Note name such as C4, F#3 or Bb5, or a MIDI number 21-108."
                },
                "start": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Start position in beats from zero."
                },
                "duration": {
                  "type": "number",
                  "minimum": 0.05,
                  "description": "Length in beats."
                },
                "velocity": {
                  "type": "number",
                  "minimum": 0.05,
                  "maximum": 1,
                  "description": "How hard to strike."
                },
                "hand": {
                  "type": "string",
                  "enum": [
                    "left",
                    "right"
                  ],
                  "description": "Which hand plays it."
                }
              },
              "required": [
                "note",
                "start",
                "duration"
              ],
              "additionalProperties": false
            }
          },
          "bpm": {
            "type": "number",
            "minimum": 20,
            "maximum": 240,
            "description": "Tempo for these notes."
          },
          "label": {
            "type": "string",
            "maxLength": 80,
            "description": "What this is, shown in the activity log."
          }
        },
        "required": [
          "notes"
        ],
        "additionalProperties": false
      }
    }
    duet.load_pieceAction

    Load a score so it can be played, transformed and practised. Either pass a built-in pieceId, or send your own arrangement as notes with a title and tempo. Side effects: replaces the current score and stops playback.

    View tool JSON
    {
      "name": "duet.load_piece",
      "kind": "act",
      "impl": "imperative",
      "description": "Load a score so it can be played, transformed and practised. Either pass a built-in pieceId, or send your own arrangement as notes with a title and tempo. Side effects: replaces the current score and stops playback.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pieceId": {
            "type": "string",
            "description": "Id of a built-in piece. Call get_state for the list."
          },
          "title": {
            "type": "string",
            "maxLength": 80
          },
          "composer": {
            "type": "string",
            "maxLength": 80
          },
          "bpm": {
            "type": "number",
            "minimum": 20,
            "maximum": 240
          },
          "beatsPerBar": {
            "type": "integer",
            "minimum": 1,
            "maximum": 12
          },
          "notes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 600,
            "items": {
              "type": "object",
              "properties": {
                "note": {
                  "type": [
                    "string",
                    "number"
                  ],
                  "description": "Note name such as C4, F#3 or Bb5, or a MIDI number 21-108."
                },
                "start": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Start position in beats from zero."
                },
                "duration": {
                  "type": "number",
                  "minimum": 0.05,
                  "description": "Length in beats."
                },
                "velocity": {
                  "type": "number",
                  "minimum": 0.05,
                  "maximum": 1,
                  "description": "How hard to strike."
                },
                "hand": {
                  "type": "string",
                  "enum": [
                    "left",
                    "right"
                  ],
                  "description": "Which hand plays it."
                }
              },
              "required": [
                "note",
                "start",
                "duration"
              ],
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      }
    }
    duet.play_pieceAction

    Play the loaded score from the top or from a given bar. Side effects: the keys light up, the falling notes scroll and the piece sounds.

    View tool JSON
    {
      "name": "duet.play_piece",
      "kind": "act",
      "impl": "imperative",
      "description": "Play the loaded score from the top or from a given bar. Side effects: the keys light up, the falling notes scroll and the piece sounds.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromBar": {
            "type": "integer",
            "minimum": 1,
            "description": "Bar to start from. Defaults to the top."
          }
        },
        "additionalProperties": false
      }
    }
    duet.stopAction

    Stop playback immediately. Side effects: silences every sounding note.

    View tool JSON
    {
      "name": "duet.stop",
      "kind": "act",
      "impl": "imperative",
      "description": "Stop playback immediately. Side effects: silences every sounding note.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.transform_pieceAction

    Change the loaded score: transpose it, change tempo, keep one hand, simplify it to one note per hand per beat, or take a range of bars. Always applied to the original score, so changes do not stack up. Side effects: replaces the current score.

    View tool JSON
    {
      "name": "duet.transform_piece",
      "kind": "act",
      "impl": "imperative",
      "description": "Change the loaded score: transpose it, change tempo, keep one hand, simplify it to one note per hand per beat, or take a range of bars. Always applied to the original score, so changes do not stack up. Side effects: replaces the current score.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "transposeSemitones": {
            "type": "integer",
            "minimum": -24,
            "maximum": 24
          },
          "bpm": {
            "type": "number",
            "minimum": 20,
            "maximum": 240
          },
          "tempoScale": {
            "type": "number",
            "minimum": 0.25,
            "maximum": 3,
            "description": "0.7 means 70 percent speed."
          },
          "hands": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "left",
                "right"
              ]
            },
            "minItems": 1,
            "maxItems": 2
          },
          "simplify": {
            "type": "boolean",
            "description": "Keep one note per hand per beat."
          },
          "fromBar": {
            "type": "integer",
            "minimum": 1
          },
          "toBar": {
            "type": "integer",
            "minimum": 1
          }
        },
        "additionalProperties": false
      }
    }
    duet.highlight_keysAction

    Light up keys on the keyboard without playing them, for teaching a scale, a chord shape or a fingering. Side effects: draws the highlight and its label on the keyboard.

    View tool JSON
    {
      "name": "duet.highlight_keys",
      "kind": "act",
      "impl": "imperative",
      "description": "Light up keys on the keyboard without playing them, for teaching a scale, a chord shape or a fingering. Side effects: draws the highlight and its label on the keyboard.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "keys": {
            "type": "array",
            "minItems": 1,
            "maxItems": 24,
            "items": {
              "type": [
                "string",
                "number"
              ]
            },
            "description": "Notes to light up without sounding them."
          },
          "label": {
            "type": "string",
            "maxLength": 60,
            "description": "What these keys are, shown on screen."
          }
        },
        "required": [
          "keys",
          "label"
        ],
        "additionalProperties": false
      }
    }
    duet.listenAction

    Start listening to the microphone so the person can sing or hum a phrase. The page detects the pitches; you cannot hear the microphone yourself. Side effects: opens the microphone and shows the listening state.

    View tool JSON
    {
      "name": "duet.listen",
      "kind": "act",
      "impl": "imperative",
      "description": "Start listening to the microphone so the person can sing or hum a phrase. The page detects the pitches; you cannot hear the microphone yourself. Side effects: opens the microphone and shows the listening state.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.stop_listeningAction

    Stop listening and read back what was sung as a list of notes with their timing, so you can answer it, harmonise it or turn it into a piece. Side effects: closes the microphone.

    View tool JSON
    {
      "name": "duet.stop_listening",
      "kind": "act",
      "impl": "imperative",
      "description": "Stop listening and read back what was sung as a list of notes with their timing, so you can answer it, harmonise it or turn it into a piece. Side effects: closes the microphone.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.read_phraseAction

    Read the most recent sung phrase again as notes, without opening the microphone.

    View tool JSON
    {
      "name": "duet.read_phrase",
      "kind": "act",
      "impl": "imperative",
      "description": "Read the most recent sung phrase again as notes, without opening the microphone.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    duet.start_practiceAction

    Turn on practice mode for the loaded score. The keyboard waits for the person to play each chord in turn and counts hits and misses. Side effects: stops playback and arms the keyboard.

    View tool JSON
    {
      "name": "duet.start_practice",
      "kind": "act",
      "impl": "imperative",
      "description": "Turn on practice mode for the loaded score. The keyboard waits for the person to play each chord in turn and counts hits and misses. Side effects: stops playback and arms the keyboard.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }