Tool tree
gradeNot graded
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
}
}