{"ok":true,"site":{"host":"duet-tau.vercel.app","url":"https://duet-tau.vercel.app/","type":"live","desc":"A piano your agent can play, teach from, and answer you on.","tools":[{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"bars":{"type":"integer","minimum":0,"maximum":2,"description":"Bars of clicks before playing."}},"required":["bars"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"left":{"type":"string","enum":["on","muted"],"description":"Left hand."},"right":{"type":"string","enum":["on","muted"],"description":"Right hand."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"fromBar":{"type":"integer","minimum":1,"description":"Bar to start from. Defaults to the top."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"duet.stop","kind":"act","impl":"imperative","description":"Stop playback immediately. Side effects: silences every sounding note.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"duet.read_phrase","kind":"act","impl":"imperative","description":"Read the most recent sung phrase again as notes, without opening the microphone.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","apiSurface":"spec","toolCount":21}}