gradeNot graded
get-instrument-stateAnswer
Return the live KEYBED state: layers, FX, phrase, and who is holding which keys (you vs agent).
View tool JSON
{
"name": "get-instrument-state",
"kind": "answer",
"impl": "imperative",
"description": "Return the live KEYBED state: layers, FX, phrase, and who is holding which keys (you vs agent).",
"inputSchema": {
"type": "object",
"properties": {}
}
}play-notesAction
Play MIDI notes as the agent on the shared piano. Lights keys green. The human's amber keys stay theirs.
View tool JSON
{
"name": "play-notes",
"kind": "act",
"impl": "imperative",
"description": "Play MIDI notes as the agent on the shared piano. Lights keys green. The human's amber keys stay theirs.",
"inputSchema": {
"type": "object",
"properties": {
"notes": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 127
}
},
"velocity": {
"type": "integer",
"minimum": 1,
"maximum": 127,
"default": 100
},
"durationMs": {
"type": "integer",
"minimum": 20,
"maximum": 8000,
"default": 420
}
},
"required": [
"notes"
]
}
}get-duet-stateAnswer
See what the human is playing on this live page right now: held notes, last take, and whether you can harmonize, answer, or follow. Use this before acting.
View tool JSON
{
"name": "get-duet-state",
"kind": "answer",
"impl": "imperative",
"description": "See what the human is playing on this live page right now: held notes, last take, and whether you can harmonize, answer, or follow. Use this before acting.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list-lessonsAnswer
List the piano curriculum on this live page in ladder order, with each lesson's tier and timing mode. First steps: landmarks, first-keys, rh-c-position, lh-c-position, hands-together, c-chord. Basic: hot-cross-buns, mary-lamb, twinkle. Intermediate: ode, birthday, heart-and-soul. Advanced: c-scale, chopsticks, fur-elise.
View tool JSON
{
"name": "list-lessons",
"kind": "answer",
"impl": "imperative",
"description": "List the piano curriculum on this live page in ladder order, with each lesson's tier and timing mode. First steps: landmarks, first-keys, rh-c-position, lh-c-position, hands-together, c-chord. Basic: hot-cross-buns, mary-lamb, twinkle. Intermediate: ode, birthday, heart-and-soul. Advanced: c-scale, chopsticks, fur-elise.",
"inputSchema": {
"type": "object",
"properties": {}
}
}start-lessonAction
Start a piano lesson on this shared keyboard. Lights the next keys the student must play. Basic lessons wait forever; Intermediate ones run a metronome and grade timing; Advanced ones add a falling-note highway. heart-and-soul is a duet — the page plays the backing loop while the student plays the melody. Teaching only works if they play those keys on this page.
View tool JSON
{
"name": "start-lesson",
"kind": "act",
"impl": "imperative",
"description": "Start a piano lesson on this shared keyboard. Lights the next keys the student must play. Basic lessons wait forever; Intermediate ones run a metronome and grade timing; Advanced ones add a falling-note highway. heart-and-soul is a duet — the page plays the backing loop while the student plays the melody. Teaching only works if they play those keys on this page.",
"inputSchema": {
"type": "object",
"properties": {
"lesson": {
"type": "string",
"description": "landmarks, first-keys, rh-c-position, lh-c-position, hands-together, c-chord, hot-cross-buns, mary-lamb, twinkle, ode, birthday, heart-and-soul, c-scale, chopsticks, fur-elise, or a song name"
}
}
}
}set-next-keysAction
Light specific next keys for the student to play, in order. Use this to invent a drill. They must press those glowing keys — you cannot play them for the student.
View tool JSON
{
"name": "set-next-keys",
"kind": "act",
"impl": "imperative",
"description": "Light specific next keys for the student to play, in order. Use this to invent a drill. They must press those glowing keys — you cannot play them for the student.",
"inputSchema": {
"type": "object",
"properties": {
"notes": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 127
}
},
"title": {
"type": "string"
},
"coach": {
"type": "string"
}
},
"required": [
"notes"
]
}
}teach-phraseAction
Turn the phrase you last generated into a lesson: light its top line, first two bars, one key at a time. Call this after generate-phrase when the student asks to learn what you made. Stops any backing beat.
View tool JSON
{
"name": "teach-phrase",
"kind": "act",
"impl": "imperative",
"description": "Turn the phrase you last generated into a lesson: light its top line, first two bars, one key at a time. Call this after generate-phrase when the student asks to learn what you made. Stops any backing beat.",
"inputSchema": {
"type": "object",
"properties": {
"title": {
"type": "string"
}
}
}
}get-lesson-stateAnswer
See the live piano lesson: which keys to play next, computer-key hints, hits, misses, and what the student just played. Call this after they play.
View tool JSON
{
"name": "get-lesson-state",
"kind": "answer",
"impl": "imperative",
"description": "See the live piano lesson: which keys to play next, computer-key hints, hits, misses, and what the student just played. Call this after they play.",
"inputSchema": {
"type": "object",
"properties": {}
}
}show-next-keysAction
Show the student the next keys on the shared piano. Target keys glow cyan; on a find-the-note step the black-key group that locates them glows violet. Starts the landmarks lesson if none is running. Does not play the notes for them.
View tool JSON
{
"name": "show-next-keys",
"kind": "act",
"impl": "imperative",
"description": "Show the student the next keys on the shared piano. Target keys glow cyan; on a find-the-note step the black-key group that locates them glows violet. Starts the landmarks lesson if none is running. Does not play the notes for them.",
"inputSchema": {
"type": "object",
"properties": {}
}
}demo-nextAction
Play the next lesson notes as the agent (green keys) so the student can hear them, then they copy on the glowing keys. Requires an active lesson.
View tool JSON
{
"name": "demo-next",
"kind": "act",
"impl": "imperative",
"description": "Play the next lesson notes as the agent (green keys) so the student can hear them, then they copy on the glowing keys. Requires an active lesson.",
"inputSchema": {
"type": "object",
"properties": {}
}
}stop-lessonAction
End the current piano lesson and clear the next-key glow.
View tool JSON
{
"name": "stop-lesson",
"kind": "act",
"impl": "imperative",
"description": "End the current piano lesson and clear the next-key glow.",
"inputSchema": {
"type": "object",
"properties": {}
}
}harmonize-heldAction
Add agent notes around the chord the human is holding on the shared keyboard. Does nothing useful if they are not holding keys — this is the together feature.
View tool JSON
{
"name": "harmonize-held",
"kind": "act",
"impl": "imperative",
"description": "Add agent notes around the chord the human is holding on the shared keyboard. Does nothing useful if they are not holding keys — this is the together feature.",
"inputSchema": {
"type": "object",
"properties": {}
}
}answer-humanAction
Play a call-and-response on the shared keys using the human's last take. Requires that they already played.
View tool JSON
{
"name": "answer-human",
"kind": "act",
"impl": "imperative",
"description": "Play a call-and-response on the shared keys using the human's last take. Requires that they already played.",
"inputSchema": {
"type": "object",
"properties": {}
}
}follow-humanAction
Shadow the human an octave up in real time on the same keyboard. Toggle off to stop. Better only when they keep playing.
View tool JSON
{
"name": "follow-human",
"kind": "act",
"impl": "imperative",
"description": "Shadow the human an octave up in real time on the same keyboard. Toggle off to stop. Better only when they keep playing.",
"inputSchema": {
"type": "object",
"properties": {
"on": {
"type": "boolean"
}
}
}
}arrange-human-takeAction
Turn the human's last live take into the shared phrase roll and play it back. Requires notes they already played on this page.
View tool JSON
{
"name": "arrange-human-take",
"kind": "act",
"impl": "imperative",
"description": "Turn the human's last live take into the shared phrase roll and play it back. Requires notes they already played on this page.",
"inputSchema": {
"type": "object",
"properties": {}
}
}design-instrumentAction
Build a whole instrument sound in one call from a description like "metallic digital orchestral stab" or "thunderous staccato strikes". Prefer this over separate set-layer/set-adsr/set-fx calls. Samples (layer A is the main voice, layer B is optional and layers on top at a lower volume): pn-ivory (Steinway): bright acoustic grand piano, hard percussive attack, long ringing decay pn-felt (Soft Grand): soft felt piano, muted and intimate, gentle attack, close and quiet or-chapel (Chapel Org): church pipe organ, holds forever with no decay, huge and airy or-reed (Drawbar): drawbar jazz organ, reedy and punchy, hard edge sy-rail (Yamaha CP80): Yamaha CP80 electric grand, metallic bell-like attack, hard and glassy sy-razor (Wurlitzer): Wurlitzer electric piano, barking slappy attack, warm dirty growl ok-bloom (Ensemble): orchestral string ensemble, slow swelling attack, wide and cinematic bs-sub (Upright Bs): upright acoustic bass, deep and woody, short plucked notes ml-stack (Grand+Pad): grand piano stacked with strings, big dramatic and cinematic Shaping the sound: filter 0=dark and muffled, 1=bright and open. distortion and crush add grit and metal. delay and reverb add space. attack is seconds to reach full volume (0.001=percussive slap, 0.6=slow swell). release is seconds to fade after key-up (0.05=staccato stab, 2.5=long tail). transpose is semitones, use -12 on layer B for weight or +12 for shimmer. Out-of-range or unknown values are dropped, not clamped to a guess.
View tool JSON
{
"name": "design-instrument",
"kind": "act",
"impl": "imperative",
"description": "Build a whole instrument sound in one call from a description like \"metallic digital orchestral stab\" or \"thunderous staccato strikes\". Prefer this over separate set-layer/set-adsr/set-fx calls.\n\nSamples (layer A is the main voice, layer B is optional and layers on top at a lower volume):\npn-ivory (Steinway): bright acoustic grand piano, hard percussive attack, long ringing decay\npn-felt (Soft Grand): soft felt piano, muted and intimate, gentle attack, close and quiet\nor-chapel (Chapel Org): church pipe organ, holds forever with no decay, huge and airy\nor-reed (Drawbar): drawbar jazz organ, reedy and punchy, hard edge\nsy-rail (Yamaha CP80): Yamaha CP80 electric grand, metallic bell-like attack, hard and glassy\nsy-razor (Wurlitzer): Wurlitzer electric piano, barking slappy attack, warm dirty growl\nok-bloom (Ensemble): orchestral string ensemble, slow swelling attack, wide and cinematic\nbs-sub (Upright Bs): upright acoustic bass, deep and woody, short plucked notes\nml-stack (Grand+Pad): grand piano stacked with strings, big dramatic and cinematic\n\nShaping the sound: filter 0=dark and muffled, 1=bright and open. distortion and crush add grit and metal. delay and reverb add space. attack is seconds to reach full volume (0.001=percussive slap, 0.6=slow swell). release is seconds to fade after key-up (0.05=staccato stab, 2.5=long tail). transpose is semitones, use -12 on layer B for weight or +12 for shimmer. Out-of-range or unknown values are dropped, not clamped to a guess.",
"inputSchema": {
"type": "object",
"properties": {
"presetName": {
"type": "string",
"description": "Short name for the LCD, e.g. THUNDER STAB"
},
"layerA": {
"type": "object",
"properties": {
"sampleId": {
"type": "string",
"enum": [
"pn-ivory",
"pn-felt",
"or-chapel",
"or-reed",
"sy-rail",
"sy-razor",
"ok-bloom",
"bs-sub",
"ml-stack"
]
},
"volume": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"transpose": {
"type": "integer",
"minimum": -24,
"maximum": 24
}
}
},
"layerB": {
"type": "object",
"properties": {
"sampleId": {
"type": "string",
"enum": [
"pn-ivory",
"pn-felt",
"or-chapel",
"or-reed",
"sy-rail",
"sy-razor",
"ok-bloom",
"bs-sub",
"ml-stack"
]
},
"volume": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"transpose": {
"type": "integer",
"minimum": -24,
"maximum": 24
}
}
},
"adsr": {
"type": "object",
"properties": {
"attack": {
"type": "number",
"minimum": 0.001,
"maximum": 2
},
"decay": {
"type": "number",
"minimum": 0.01,
"maximum": 2
},
"sustain": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"release": {
"type": "number",
"minimum": 0.02,
"maximum": 3
}
}
},
"fx": {
"type": "object",
"properties": {
"filter": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"distortion": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"crush": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delay": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"reverb": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
}
}set-layerAction
Set layer A or B sample, volume, transpose, or lock. Samples: pn-ivory (Steinway): bright acoustic grand piano, hard percussive attack, long ringing decay pn-felt (Soft Grand): soft felt piano, muted and intimate, gentle attack, close and quiet or-chapel (Chapel Org): church pipe organ, holds forever with no decay, huge and airy or-reed (Drawbar): drawbar jazz organ, reedy and punchy, hard edge sy-rail (Yamaha CP80): Yamaha CP80 electric grand, metallic bell-like attack, hard and glassy sy-razor (Wurlitzer): Wurlitzer electric piano, barking slappy attack, warm dirty growl ok-bloom (Ensemble): orchestral string ensemble, slow swelling attack, wide and cinematic bs-sub (Upright Bs): upright acoustic bass, deep and woody, short plucked notes ml-stack (Grand+Pad): grand piano stacked with strings, big dramatic and cinematic
View tool JSON
{
"name": "set-layer",
"kind": "act",
"impl": "imperative",
"description": "Set layer A or B sample, volume, transpose, or lock. Samples:\npn-ivory (Steinway): bright acoustic grand piano, hard percussive attack, long ringing decay\npn-felt (Soft Grand): soft felt piano, muted and intimate, gentle attack, close and quiet\nor-chapel (Chapel Org): church pipe organ, holds forever with no decay, huge and airy\nor-reed (Drawbar): drawbar jazz organ, reedy and punchy, hard edge\nsy-rail (Yamaha CP80): Yamaha CP80 electric grand, metallic bell-like attack, hard and glassy\nsy-razor (Wurlitzer): Wurlitzer electric piano, barking slappy attack, warm dirty growl\nok-bloom (Ensemble): orchestral string ensemble, slow swelling attack, wide and cinematic\nbs-sub (Upright Bs): upright acoustic bass, deep and woody, short plucked notes\nml-stack (Grand+Pad): grand piano stacked with strings, big dramatic and cinematic",
"inputSchema": {
"type": "object",
"properties": {
"layer": {
"type": "string",
"enum": [
"A",
"B"
]
},
"sampleId": {
"type": "string"
},
"volume": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"transpose": {
"type": "integer",
"minimum": -24,
"maximum": 24
},
"locked": {
"type": "boolean"
},
"cycle": {
"type": "integer",
"enum": [
-1,
1
]
}
},
"required": [
"layer"
]
}
}set-adsrAction
Set the shared ADSR envelope. Switches the LCD to Envelope.
View tool JSON
{
"name": "set-adsr",
"kind": "act",
"impl": "imperative",
"description": "Set the shared ADSR envelope. Switches the LCD to Envelope.",
"inputSchema": {
"type": "object",
"properties": {
"attack": {
"type": "number",
"minimum": 0.001,
"maximum": 2
},
"decay": {
"type": "number",
"minimum": 0.01,
"maximum": 2
},
"sustain": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"release": {
"type": "number",
"minimum": 0.02,
"maximum": 3
}
}
}
}set-fxAction
Set the 5-stage FX chain: filter, distortion, crush, delay, reverb (0-1).
View tool JSON
{
"name": "set-fx",
"kind": "act",
"impl": "imperative",
"description": "Set the 5-stage FX chain: filter, distortion, crush, delay, reverb (0-1).",
"inputSchema": {
"type": "object",
"properties": {
"filter": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"distortion": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"crush": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delay": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"reverb": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}set-drumsAction
Start or stop a looping backing beat under the keys. Patterns: backbeat, house, techno, garage. Pass an empty pattern to stop. The keys stay a piano; this is accompaniment, not a drum map.
View tool JSON
{
"name": "set-drums",
"kind": "act",
"impl": "imperative",
"description": "Start or stop a looping backing beat under the keys. Patterns: backbeat, house, techno, garage. Pass an empty pattern to stop. The keys stay a piano; this is accompaniment, not a drum map.",
"inputSchema": {
"type": "object",
"properties": {
"pattern": {
"type": "string",
"description": "backbeat, house, techno, garage, or empty to stop"
}
}
}
}generate-phraseAction
Generate a musical stab phrase in a style and play it on the shared instrument.
View tool JSON
{
"name": "generate-phrase",
"kind": "act",
"impl": "imperative",
"description": "Generate a musical stab phrase in a style and play it on the shared instrument.",
"inputSchema": {
"type": "object",
"properties": {
"style": {
"type": "string",
"enum": [
"rave",
"house",
"techno",
"piano",
"garage"
]
},
"bars": {
"type": "integer",
"enum": [
4,
8
]
}
}
}
}lock-layerAction
Lock or unlock layer A or B so generate/cycle will not replace it.
View tool JSON
{
"name": "lock-layer",
"kind": "act",
"impl": "imperative",
"description": "Lock or unlock layer A or B so generate/cycle will not replace it.",
"inputSchema": {
"type": "object",
"properties": {
"layer": {
"type": "string",
"enum": [
"A",
"B"
]
},
"locked": {
"type": "boolean"
}
},
"required": [
"layer"
]
}
}save-presetAction
Save the current KEYBED preset to localStorage.
View tool JSON
{
"name": "save-preset",
"kind": "act",
"impl": "imperative",
"description": "Save the current KEYBED preset to localStorage.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
}
}load-presetAction
Load the last saved KEYBED preset from localStorage.
View tool JSON
{
"name": "load-preset",
"kind": "act",
"impl": "imperative",
"description": "Load the last saved KEYBED preset from localStorage.",
"inputSchema": {
"type": "object",
"properties": {}
}
}reset-soundAction
Put the instrument back to its factory sound: Steinway, clean effects, default envelope. Keeps the running lesson and the master volume.
View tool JSON
{
"name": "reset-sound",
"kind": "act",
"impl": "imperative",
"description": "Put the instrument back to its factory sound: Steinway, clean effects, default envelope. Keeps the running lesson and the master volume.",
"inputSchema": {
"type": "object",
"properties": {}
}
}export-midiAction
Download the current phrase as a Standard MIDI File.
View tool JSON
{
"name": "export-midi",
"kind": "act",
"impl": "imperative",
"description": "Download the current phrase as a Standard MIDI File.",
"inputSchema": {
"type": "object",
"properties": {}
}
}set-masterAction
Set master volume from 0 to 1.
View tool JSON
{
"name": "set-master",
"kind": "act",
"impl": "imperative",
"description": "Set master volume from 0 to 1.",
"inputSchema": {
"type": "object",
"properties": {
"volume": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"volume"
]
}
}set-sustainAction
Hold or release the sustain pedal (MIDI CC 64). Same as a pedal on an APC Key 25, Roland, or Yamaha controller.
View tool JSON
{
"name": "set-sustain",
"kind": "act",
"impl": "imperative",
"description": "Hold or release the sustain pedal (MIDI CC 64). Same as a pedal on an APC Key 25, Roland, or Yamaha controller.",
"inputSchema": {
"type": "object",
"properties": {
"down": {
"type": "boolean"
}
},
"required": [
"down"
]
}
}set-bpmAction
Set the tempo from 40 to 200 BPM. This is the single most useful thing you can do for a struggling student: halve the tempo, let them play it right, then put it back. Also drives the metronome and the duet loop.
View tool JSON
{
"name": "set-bpm",
"kind": "act",
"impl": "imperative",
"description": "Set the tempo from 40 to 200 BPM. This is the single most useful thing you can do for a struggling student: halve the tempo, let them play it right, then put it back. Also drives the metronome and the duet loop.",
"inputSchema": {
"type": "object",
"properties": {
"bpm": {
"type": "number",
"minimum": 40,
"maximum": 200
},
"scale": {
"type": "number",
"minimum": 0.25,
"maximum": 4,
"description": "Multiply the current tempo instead, e.g. 0.5 for half speed"
}
}
}
}set-swingAction
Set phrase swing from 0 to 0.4.
View tool JSON
{
"name": "set-swing",
"kind": "act",
"impl": "imperative",
"description": "Set phrase swing from 0 to 0.4.",
"inputSchema": {
"type": "object",
"properties": {
"swing": {
"type": "number",
"minimum": 0,
"maximum": 0.4
}
},
"required": [
"swing"
]
}
}set-modeAction
Switch what the page is for. 'teach' shows the lesson curriculum, the next-key glow and the hand map. 'dj' hides all of that and opens the STUDIO deck: styles, FX knobs, generated loops, MIDI export.
View tool JSON
{
"name": "set-mode",
"kind": "act",
"impl": "imperative",
"description": "Switch what the page is for. 'teach' shows the lesson curriculum, the next-key glow and the hand map. 'dj' hides all of that and opens the STUDIO deck: styles, FX knobs, generated loops, MIDI export.",
"inputSchema": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"teach",
"dj"
]
}
},
"required": [
"mode"
]
}
}focus-controlAction
Open the STUDIO drawer and visually highlight controls: 'fx', 'layers', 'tempo', 'phrase', or 'studio'.
View tool JSON
{
"name": "focus-control",
"kind": "act",
"impl": "imperative",
"description": "Open the STUDIO drawer and visually highlight controls: 'fx', 'layers', 'tempo', 'phrase', or 'studio'.",
"inputSchema": {
"type": "object",
"properties": {
"target": {
"type": "string",
"enum": [
"fx",
"layers",
"tempo",
"phrase",
"studio"
]
}
},
"required": [
"target"
]
}
}make-trackAction
Generate a complete track in one of the 5 styles (piano, rave, house, techno, garage) with matching sound design, BPM, and drum groove.
View tool JSON
{
"name": "make-track",
"kind": "act",
"impl": "imperative",
"description": "Generate a complete track in one of the 5 styles (piano, rave, house, techno, garage) with matching sound design, BPM, and drum groove.",
"inputSchema": {
"type": "object",
"properties": {
"style": {
"type": "string",
"enum": [
"piano",
"rave",
"house",
"techno",
"garage"
]
},
"bars": {
"type": "integer",
"enum": [
4,
8
]
}
},
"required": [
"style"
]
}
}