{"ok":true,"site":{"host":"listen-synth.netlify.app","url":"https://listen-synth.netlify.app/","type":"live","desc":"A Web Audio synthesizer your AI agent can actually listen to — analyze its own output in real time, then shape the sound with you, in natural language. Accessible sound design for everyone.","tools":[{"name":"get_current_patch","kind":"answer","impl":"imperative","description":"Get the full current synthesizer patch: every oscillator, filter, envelope, LFO and FX setting. Call this before changing anything so you know the starting point.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"analyze_sound","kind":"act","impl":"imperative","description":"LISTEN to the synth's live output. Runs real-time FFT + time-domain analysis and returns structured audio features (brightness, bass/mid/high balance, harmonicity, envelope, movement) plus a plain-language summary. Best called WHILE a note is playing — use play_note first, then listen, then adjust.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_params","kind":"act","impl":"imperative","description":"Change MANY synth parameters in ONE call (the whole point: coordinated sound design). Provide a flat map of param paths to values. Paths: oscA/oscB.{wave,octave,detune,level}, sub.level, filter.{cutoff,resonance,envAmount}, env.{attack,decay,sustain,release}, lfo.{wave,rate,toCutoff,toPitch}, fx.{delayTime,delayFeedback,delayMix,reverbMix}, master. Waves: sawtooth,square,triangle,sine.","inputSchema":{"type":"object","properties":{"params":{"type":"object","description":"Flat map of param path → value, e.g. {\"filter.cutoff\": 800, \"env.attack\": 0.002}"}},"required":["params"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"shape_sound","kind":"act","impl":"imperative","description":"Translate a natural-language sound goal into coordinated synth moves. Understands words like: darker, brighter, warmer, thicker, thinner, glassy, punchier, smoother, wobblier, womp, spacier, drier, 80s, aggressive, airy, pluckier. Use this when the user describes a vibe rather than exact parameters.","inputSchema":{"type":"object","properties":{"description":{"type":"string","description":"e.g. 'darker and thicker but keep the punch', or 'glassy 80s pad'"}},"required":["description"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_note","kind":"act","impl":"imperative","description":"Play a single note. Accepts a MIDI number (60 = middle C) or a note name like 'C4', 'A2', 'F#3'. Hold it long enough to analyze the sound.","inputSchema":{"type":"object","properties":{"note":{"type":["number","string"],"description":"MIDI number (e.g. 60) or name (e.g. 'C4')."},"durationMs":{"type":"integer","description":"How long to hold, ms (default 900). Longer is better for analysis."}},"required":["note"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_chord","kind":"act","impl":"imperative","description":"Play a chord (strummed). Provide 2-5 notes as MIDI numbers or names, or a chord name like 'Cmaj7', 'Am', 'G7'.","inputSchema":{"type":"object","properties":{"notes":{"type":"array","items":{"type":["number","string"]},"description":"e.g. ['C4','E4','G4'] or [60,64,67]"},"chord":{"type":"string","description":"Alternatively a chord name like 'Cmaj7', 'Am', 'F#m7'."},"durationMs":{"type":"integer"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_current_sound","kind":"answer","impl":"imperative","description":"Get a producer's description of the current patch WITHOUT needing audio — derived from the parameter values themselves. Useful when audio isn't playing.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"save_preset","kind":"act","impl":"imperative","description":"Save the current sound as a named preset. The preset AUTOMATICALLY becomes a new agent tool (load_preset__<name>) that you or the user can call later. This is dynamic tool registration in action.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"A short name, e.g. 'dark_pluck' or 'Glass Pad'"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_presets","kind":"answer","impl":"imperative","description":"List all available presets (built-in + user-saved) and which are currently exposed as tools.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"randomize_patch","kind":"act","impl":"imperative","description":"Randomize the patch within a musical vibe for inspiration. Great starting point for a sound-hunt.","inputSchema":{"type":"object","properties":{"vibe":{"type":"string","description":"bass | pad | pluck | lead (default: any)"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"watch_for_changes","kind":"answer","impl":"imperative","description":"Ask what the HUMAN has changed by hand since a given time (or since your last tool call). Returns which knobs they turned, old→new values, so you can respond to their intent — the heart of two-way collaboration. Call this before big moves, or when the user says 'what did I just do?'.","inputSchema":{"type":"object","properties":{"sinceMs":{"type":"integer","description":"Unix ms timestamp. Omit to use the time of the last analyze_sound call."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_to_target","kind":"act","impl":"imperative","description":"Score how close the CURRENT sound is to a described target (e.g. 'dark, thick, punchy'), and suggest the single next best move. Use this to iterate toward a vibe with the user: analyze → compare → adjust → repeat.","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target description, e.g. 'dark and punchy' or 'bright glassy pad'"}},"required":["target"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"explain_sound_in_plain_words","kind":"act","impl":"imperative","description":"Explain the current sound in everyday, non-technical language — for users who don't know synthesis or who use a screen reader. Returns a friendly paragraph plus per-knob plain descriptions. Use this to make sound design accessible to everyone.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compose_pattern","kind":"act","impl":"imperative","description":"Compose a musical loop (bassline / arp / pad / lead) that fits the CURRENT sound you designed. You provide the vibe; this builds a 16-step-per-bar pattern and loads it. Then play_pattern to hear it, and render_to_wav to export it. Call after you're happy with the sound.","inputSchema":{"type":"object","properties":{"vibe":{"type":"string","description":"e.g. 'dark techno bassline', 'dreamy arp', 'sparse minimal'"},"bars":{"type":"integer","description":"1-4 bars (default 2)"},"root":{"type":"integer","description":"MIDI root note (default 45 = A2)"},"scale":{"type":"string","enum":["minor","major","dorian","pentatonic","chromatic"]},"bpm":{"type":"integer","description":"70-180 (default inferred from vibe)"},"density":{"type":"number","description":"0-1, how busy (default from vibe)"},"rhythmStyle":{"type":"string","enum":["bass","arp","pad","lead"],"description":"Pattern archetype (default from vibe)"}},"required":["vibe"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_pattern","kind":"act","impl":"imperative","description":"Play the currently composed pattern as a loop through the synth. Stop with stop_pattern.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"stop_pattern","kind":"act","impl":"imperative","description":"Stop the looping pattern.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"render_to_wav","kind":"act","impl":"imperative","description":"BOUNCE the current sound + composed pattern to a downloadable WAV file (44.1kHz stereo 16-bit). This produces a real audio artifact the user keeps. Call after composing a pattern and confirming the sound with analyze_sound.","inputSchema":{"type":"object","properties":{"bars":{"type":"integer","description":"1-16 bars to render (default: the pattern's length)"},"name":{"type":"string","description":"File name base, e.g. 'dark-techno-bass' (default from vibe)"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_sound_card","kind":"act","impl":"imperative","description":"Generate a 'Sound DNA' card: a shareable PNG that captures what you (the agent) HEARD — your own descriptive words, the waveform, spectrum, and the full patch recipe. A reproducible artifact of the sound. Call after analyze_sound.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Sound name, e.g. 'midnight_bass'"},"vibe":{"type":"string","description":"Short descriptor; defaults to your analyze_sound summary"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"export_vital_preset","kind":"act","impl":"imperative","description":"Export the CURRENT sound as a production-ready VITAL preset (.vital) — the free, most popular Serum alternative — that producers can load straight into their DAW. The sound you designed together becomes a real studio instrument, not just a browser demo. Use after the sound is finalized.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Preset name, e.g. 'dark_techno_bass'"},"style":{"type":"string","description":"Optional style tag, e.g. 'bass', 'pad', 'lead'"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_capabilities","kind":"answer","impl":"imperative","description":"Explain what this agent-native synth lets humans and agents do together, and the recommended listen-adjust loop.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/listen-synth.netlify.app.svg","apiSurface":"spec","toolCount":20}}