{"ok":true,"site":{"host":"duetstudio.mehmetcan.me","url":"https://duetstudio.mehmetcan.me/","type":"live","desc":"A browser music studio where you and your AI agent produce a track together. Built on WebMCP: the whole song is exposed as tools the agent can hear and play.","tools":[{"name":"get_song","kind":"answer","impl":"imperative","description":"Read the song as text: tempo, swing, bars, key/scale, tracks, transport and human selection. Call this first; use get_recent_changes for later human edits. Long note lists are shortened here — pass track to read that one track in full. Steps are 0-indexed 16ths, 16 per bar. Drums: X accent, x hit, o soft, . rest. Melodic notes: step:Note(length).","title":"Read the song","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Omit for the whole song. Pass a track id (preferred), exact track name, instrument id, or 1-based position to read that track's notes in full."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_recent_changes","kind":"answer","impl":"imperative","description":"Read what the human changed since the agent last observed the song with get_song or this tool. Returns up to 10 session-log entries in chronological order; call get_song afterwards when you need the full current notes or patterns.","title":"Read human changes","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_instruments","kind":"answer","impl":"imperative","description":"List the available instruments: id, drum or melodic, character and recommended pitch range. Drums take patterns, melodic instruments take notes.","title":"List instruments","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_scale_notes","kind":"answer","impl":"imperative","description":"Music theory helper: list the notes of a scale within a pitch range, so melodies and basslines stay in key.","title":"Scale notes","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"root":{"type":"string","maxLength":3,"description":"Root pitch class, e.g. \"A\", \"F#\", \"Bb\". Defaults to the song key."},"scale":{"type":"string","enum":["major","minor","dorian","phrygian","lydian","mixolydian","harmonic_minor","pentatonic_major","pentatonic_minor","blues"],"description":"Defaults to the song scale."},"low_note":{"type":"string","maxLength":4,"description":"Lowest note to include, e.g. \"A1\". Default C2."},"high_note":{"type":"string","maxLength":4,"description":"Highest note to include, e.g. \"A4\". Default C5."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_tempo","kind":"act","impl":"imperative","description":"Change tempo (BPM) and/or swing. Swing is 0 (straight) to 0.6 (heavy shuffle), applied to off-beat 16ths.","title":"Set tempo","inputSchema":{"type":"object","properties":{"bpm":{"type":"number","minimum":40,"maximum":240},"swing":{"type":"number","minimum":0,"maximum":0.6}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_playback","kind":"act","impl":"imperative","description":"Start or stop playback. The loop plays continuously and picks up edits live. Audio can only start after the human has clicked somewhere on the page at least once.","title":"Play or stop","inputSchema":{"type":"object","properties":{"playing":{"type":"boolean"}},"required":["playing"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_song_meta","kind":"act","impl":"imperative","description":"Set the song title, key, scale and/or length in bars (1, 2 or 4). Growing the song tiles existing material; shrinking drops the extra bars.","title":"Song settings","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"title":{"type":"string","maxLength":60},"key":{"type":"string","maxLength":3,"description":"Pitch class such as \"A\" or \"F#\""},"scale":{"type":"string","enum":["major","minor","dorian","phrygian","lydian","mixolydian","harmonic_minor","pentatonic_major","pentatonic_minor","blues"]},"bars":{"type":"integer","enum":[1,2,4]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_track","kind":"act","impl":"imperative","description":"Add a new track. Drum tracks take an optional pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit; 16 chars per bar, short patterns repeat). Melodic tracks take optional notes. Returns the new track id.","title":"Add track","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"instrument":{"type":"string","enum":["kick","snare","hat_closed","hat_open","clap","tom","rim","cowbell","shaker","bass","lead","pad","pluck","keys"]},"name":{"type":"string","maxLength":32,"description":"Display name, defaults to the instrument label"},"pattern":{"type":"string","maxLength":96,"description":"Drums only, e.g. \"x.x.x.x.x.x.x.x.\""},"notes":{"type":"array","items":{"type":"object","properties":{"step":{"type":"integer","minimum":0,"description":"0-indexed 16th-note step (0-15 in bar 1, 16-31 in bar 2, ...)"},"note":{"type":["string","integer"],"description":"Scientific pitch such as \"A2\", \"C#3\", \"Bb1\", or a MIDI number"},"length":{"type":"integer","description":"Length in steps, default 1","minimum":1,"maximum":64},"velocity":{"type":"number","description":"0.05-1, default 0.8","minimum":0.05,"maximum":1}},"required":["step","note"],"additionalProperties":false},"maxItems":256,"description":"Melodic only"}},"required":["instrument"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_track","kind":"act","impl":"imperative","description":"Remove a track from the song.","title":"Remove track","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"}},"required":["track"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_track","kind":"act","impl":"imperative","description":"Rename a track or change its mixer settings: volume (0-1), mute, solo.","title":"Update track","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"},"name":{"type":"string","maxLength":32},"volume":{"type":"number","minimum":0,"maximum":1},"mute":{"type":"boolean"},"solo":{"type":"boolean"}},"required":["track"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_drum_pattern","kind":"act","impl":"imperative","description":"Replace a drum track using either a pattern string (X accent, x hit, o soft, . rest; - _ 0 also read as rest and 1 as hit) or euclid { hits, steps, rotate? }. Short patterns repeat across the song; `bar` targets one 16-step bar.","title":"Write drum pattern","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"},"pattern":{"type":"string","maxLength":96,"description":"e.g. \"X...x...X...x...\" or \"x.x.x.x.x.x.x.x.\""},"euclid":{"type":"object","properties":{"hits":{"type":"integer","minimum":0,"maximum":64},"steps":{"type":"integer","minimum":1,"maximum":64},"rotate":{"type":"integer","minimum":-64,"maximum":64}},"required":["hits","steps"],"additionalProperties":false,"description":"Evenly distribute hits across steps; rotate moves the pattern right"},"bar":{"type":"integer","minimum":1,"maximum":4,"description":"Only write this bar (1-based)"}},"required":["track"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_notes","kind":"act","impl":"imperative","description":"Write exact notes on a melodic track (bass, lead, pad, pluck, keys). mode 'replace' (default) rewrites the whole track; 'merge' adds notes. Stack notes at one step for custom chords; set_chords generates Roman progressions.","title":"Write notes","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"},"notes":{"type":"array","items":{"type":"object","properties":{"step":{"type":"integer","minimum":0,"description":"0-indexed 16th-note step (0-15 in bar 1, 16-31 in bar 2, ...)"},"note":{"type":["string","integer"],"description":"Scientific pitch such as \"A2\", \"C#3\", \"Bb1\", or a MIDI number"},"length":{"type":"integer","description":"Length in steps, default 1","minimum":1,"maximum":64},"velocity":{"type":"number","description":"0.05-1, default 0.8","minimum":0.05,"maximum":1}},"required":["step","note"],"additionalProperties":false},"maxItems":256},"mode":{"type":"string","enum":["replace","merge"]}},"required":["track","notes"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_chords","kind":"act","impl":"imperative","description":"Write a scale-relative Roman-numeral progression such as `i VI III VII` across the whole song. Uses close voice leading on a pad or keys track. Omit track to reuse the first pad/keys track or create a Chords pad.","title":"Write chord progression","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"progression":{"type":"string","minLength":1,"maxLength":128,"description":"Space-separated Roman chords relative to the song scale, e.g. \"i VI III VII\""},"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"},"velocity":{"type":"number","minimum":0.05,"maximum":1,"description":"Chord velocity, default 0.7"}},"required":["progression"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"humanize","kind":"act","impl":"imperative","description":"Add natural velocity variation to one track (or every track). amount 0-1, default 0.3. Great for hats and shakers.","title":"Humanize","inputSchema":{"type":"object","properties":{"track":{"type":"string","maxLength":64,"description":"Track id (preferred), exact track name, instrument id, or 1-based position from get_song"},"amount":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo","kind":"act","impl":"imperative","description":"Undo the last change (by anyone). Call get_song afterwards if you need the details.","title":"Undo","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"redo","kind":"act","impl":"imperative","description":"Redo the last undone change.","title":"Redo","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_song","kind":"act","impl":"imperative","description":"Remove every track and start over. This asks the human for confirmation in the app and only proceeds if they approve.","title":"Clear song","annotations":{"consequentialHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/duetstudio.mehmetcan.me.png","apiSurface":"spec","toolCount":17}}