Tool tree
gradeNot graded
get_current_patchAnswer
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.
View tool JSON
{
"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": {}
}
}analyze_soundAction
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.
View tool JSON
{
"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": {}
}
}set_paramsAction
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.
View tool JSON
{
"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"
]
}
}shape_soundAction
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.
View tool JSON
{
"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"
]
}
}play_noteAction
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.
View tool JSON
{
"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"
]
}
}play_chordAction
Play a chord (strummed). Provide 2-5 notes as MIDI numbers or names, or a chord name like 'Cmaj7', 'Am', 'G7'.
View tool JSON
{
"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"
}
}
}
}describe_current_soundAnswer
Get a producer's description of the current patch WITHOUT needing audio — derived from the parameter values themselves. Useful when audio isn't playing.
View tool JSON
{
"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": {}
}
}save_presetAction
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.
View tool JSON
{
"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"
]
}
}list_presetsAnswer
List all available presets (built-in + user-saved) and which are currently exposed as tools.
View tool JSON
{
"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": {}
}
}randomize_patchAction
Randomize the patch within a musical vibe for inspiration. Great starting point for a sound-hunt.
View tool JSON
{
"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)"
}
}
}
}watch_for_changesAnswer
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?'.
View tool JSON
{
"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."
}
}
}
}compare_to_targetAction
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.
View tool JSON
{
"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"
]
}
}explain_sound_in_plain_wordsAction
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.
View tool JSON
{
"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": {}
}
}compose_patternAction
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.
View tool JSON
{
"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"
]
}
}play_patternAction
Play the currently composed pattern as a loop through the synth. Stop with stop_pattern.
View tool JSON
{
"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": {}
}
}stop_patternAction
Stop the looping pattern.
View tool JSON
{
"name": "stop_pattern",
"kind": "act",
"impl": "imperative",
"description": "Stop the looping pattern.",
"inputSchema": {
"type": "object",
"properties": {}
}
}render_to_wavAction
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.
View tool JSON
{
"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)"
}
}
}
}generate_sound_cardAction
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.
View tool JSON
{
"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"
}
}
}
}export_vital_presetAction
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.
View tool JSON
{
"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"
]
}
}describe_capabilitiesAnswer
Explain what this agent-native synth lets humans and agents do together, and the recommended listen-adjust loop.
View tool JSON
{
"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": {}
}
}