{"ok":true,"site":{"host":"duet-pearl.vercel.app","url":"https://duet-pearl.vercel.app/","type":"live","desc":"Duet — record a melody, then ask your browser agent to become the rest of your band. A shared human + agent music studio built on WebMCP.","tools":[{"name":"studio_get_session","kind":"answer","impl":"imperative","description":"Read the complete live Duet session: title, tempo, key/scale, mode, every instrument track with its exact notes, drum pattern, chords, mixer settings, and recent activity. Call this first — the human may have recorded a melody that exists only in this browser session. Call it again after the human edits to see their changes.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_list_instruments","kind":"act","impl":"imperative","description":"List instrument modules currently in the rack and which can still be added. Adding an instrument exposes its dedicated editing tool (e.g. drums_edit).","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_add_instrument","kind":"act","impl":"imperative","description":"Add an instrument module (keys, drums, bass, or pad) to the studio rack. The module appears visually for the human, and its dedicated editing tool (keys_edit / drums_edit / bass_edit / pad_edit) becomes available to you immediately after.","inputSchema":{"type":"object","properties":{"instrument":{"type":"string","enum":["keys","drums","bass","pad"],"description":"Instrument to add."}},"required":["instrument"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_remove_instrument","kind":"act","impl":"imperative","description":"Remove an instrument module (keys, drums, bass, or pad) from the rack. Its content is cleared and its editing tool disappears. The lead synth carries the human melody and cannot be removed.","inputSchema":{"type":"object","properties":{"instrument":{"type":"string","enum":["keys","drums","bass","pad"]}},"required":["instrument"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_set_tempo","kind":"act","impl":"imperative","description":"Set the loop tempo in BPM (60-200). Takes effect immediately, even during playback.","inputSchema":{"type":"object","properties":{"bpm":{"type":"number","minimum":60,"maximum":200}},"required":["bpm"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_set_key","kind":"act","impl":"imperative","description":"Set the musical key and/or scale. By default a key change transposes all existing notes and chords by the shortest path to the new root, so the change is immediately audible. Set transposeExisting to false to relabel the key without moving any notes. Scale changes never move notes.","inputSchema":{"type":"object","properties":{"key":{"type":"string","enum":["C","Db","D","Eb","E","F","F#","G","Ab","A","Bb","B"],"description":"Root pitch class."},"scale":{"type":"string","enum":["major","minor","harmonicMinor","dorian","phrygian","mixolydian","majorPentatonic","minorPentatonic"]},"transposeExisting":{"type":"boolean","description":"Transpose existing notes/chords to the new key (default true)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_set_groove","kind":"act","impl":"imperative","description":"Set global groove settings: swing (0-0.6, delays every off-beat 16th — 0 straight, 0.2 gentle shuffle), space (0-1, global reverb send on lead, keys and pad), and/or humanize (0-1, deterministic micro-timing and velocity variation seeded per step — subtle values around 0.2-0.4 sound human; high values sound sloppy). Groove comes from timing AND velocity together — combine swing/humanize with accented note velocities.","inputSchema":{"type":"object","properties":{"swing":{"type":"number","minimum":0,"maximum":0.6},"space":{"type":"number","minimum":0,"maximum":1},"humanize":{"type":"number","minimum":0,"maximum":1}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_enter_performance","kind":"act","impl":"imperative","description":"Switch the studio into Performance mode. Composition tools are withdrawn and replaced with performance tools (performance_play, performance_set_energy, performance_set_track_mix, performance_launch_breakdown, ...). Use this when the arrangement is ready to perform.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"studio_publish","kind":"act","impl":"imperative","description":"Publish the current composition as a shareable remix link. This pauses and asks the human to approve (and possibly edit) the song title in the Duet UI before anything is created — the result reports whether they approved, and the remix URL if so.","inputSchema":{"type":"object","properties":{"title":{"type":"string","maxLength":80,"description":"Suggested song title for the human to review."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"lead_edit","kind":"act","impl":"imperative","description":"Edit the Lead Synth track. Operations: replace_notes (rewrite the whole track), add_notes, patch_steps (change pitch/velocity/duration/offset of notes starting at given steps), remove_steps, set_preset (neon, hyper, glass, saw, wire, laser, chip, velvet, brass, air), set_mix (volume/mute). Notes carry velocity and a small timing offset — preserve the human’s expressive values; vary your own (identical velocities sound mechanical). The lead holds the human melody and is protected by the Musical Contract: when locked, note edits pause and ask the human for permission.","inputSchema":{"type":"object","properties":{"op":{"type":"string","enum":["replace_notes","add_notes","patch_steps","remove_steps","set_preset","set_mix"]},"notes":{"type":"array","description":"For replace_notes / add_notes.","items":{"type":"object","properties":{"step":{"type":"integer","minimum":0,"maximum":15,"description":"Start step, 0-15."},"pitch":{"type":"string","description":"Scientific pitch between C1 and C7, e.g. \"C4\", \"Eb3\", \"F#5\"."},"duration":{"type":"integer","minimum":1,"maximum":16,"description":"Length in steps (default 1). step + duration must be <= 16."},"velocity":{"type":"number","minimum":0,"maximum":1,"description":"Loudness 0-1 (default 0.8). Vary it — identical velocities sound mechanical."},"offset":{"type":"number","minimum":-0.45,"maximum":0.45,"description":"Expressive micro-timing in steps (default 0). ±0.05 is subtle; keep it small."}},"required":["step","pitch"]}},"steps":{"type":"array","items":{"type":"integer","minimum":0,"maximum":15},"description":"For patch_steps / remove_steps: steps where target notes start."},"pitch":{"type":"string","description":"patch_steps: new pitch for the targeted notes."},"velocity":{"type":"number","minimum":0,"maximum":1,"description":"patch_steps: new velocity."},"duration":{"type":"integer","minimum":1,"maximum":16,"description":"patch_steps: new duration in steps."},"offset":{"type":"number","minimum":-0.45,"maximum":0.45,"description":"patch_steps: new timing offset in steps."},"preset":{"type":"string","enum":["neon","hyper","glass","saw","wire","laser","chip","velvet","brass","air"],"description":"For set_preset."},"volume":{"type":"number","minimum":0,"maximum":1,"description":"Track volume 0-1."},"muted":{"type":"boolean"}},"required":["op"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/duet-pearl.vercel.app.svg","apiSurface":"spec","toolCount":10}}