{"ok":true,"site":{"host":"keyboard-midi.uset182.chatgpt.site","url":"https://keyboard-midi.uset182.chatgpt.site/","type":"live","desc":"KEYLIT","tools":[{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"stop-lesson","kind":"act","impl":"imperative","description":"End the current piano lesson and clear the next-key glow.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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}}}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"save-preset","kind":"act","impl":"imperative","description":"Save the current KEYBED preset to localStorage.","inputSchema":{"type":"object","properties":{"name":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load-preset","kind":"act","impl":"imperative","description":"Load the last saved KEYBED preset from localStorage.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export-midi","kind":"act","impl":"imperative","description":"Download the current phrase as a Standard MIDI File.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","favicon":"/favicons/keyboard-midi.uset182.chatgpt.site.png","apiSurface":"spec","toolCount":33}}