{"ok":true,"site":{"host":"drora.github.io","url":"https://drora.github.io/strudel-synth/","type":"live","desc":"Strudel Studio","tools":[{"name":"get_session","kind":"answer","impl":"imperative","description":"Get the full current Strudel Studio session + Jam state: tracks (name, role, code, muted, soloed, volume, locked, octave), BPM, playback, kitId, songRoot/songScale, songWalk (centers + patternId + walkLength + concertNames chips), intensityLevel (1–4), spawnedPadId/spawnedBassId, A/B active, and cheap phase. Always call this first.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_jam_state","kind":"answer","impl":"imperative","description":"Jam-only snapshot: kitId, vibe, songRoot/songScale, songWalk (centers + walkLength + concertNames), intensityLevel (1–4), spawnedPadId/spawnedBassId, lockKit, A/B slots, activeVariant, lastPeek, undoDepth, soundTrackId/codeTrackId.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_phase","kind":"answer","impl":"imperative","description":"Scheduler cycle + normalized phase [0,1). Uses liveUpdateEngine / getSchedulerCycle when available.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_bpm","kind":"act","impl":"imperative","description":"Set the global tempo in BPM. Updates the session store and, while playing, recomposes the full pattern at the new tempo.","inputSchema":{"type":"object","properties":{"bpm":{"type":"number","minimum":20,"maximum":300,"description":"Beats per minute"}},"required":["bpm"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"list_kits","kind":"answer","impl":"imperative","description":"List Jam kits (id, name, bpm, drumsBank, vibe, description, shuffle{groove,density,root,scale}). Optional search / soft tags (tempo:slow|mid|fast, bank:909, vibe:techno) / vibe / tempo filters.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"search":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"vibe":{"type":"string","enum":["techno","lofi","ambient","house"]},"tempo":{"type":"string","enum":["slow","mid","fast"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_kit","kind":"answer","impl":"imperative","description":"Full kit by id: layout tracks + metadata + shuffle profile (groove/density/root/scale/melodicSounds/fxBias/pinN). Prefer this over inventing mini-notation.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"apply_kit","kind":"act","impl":"imperative","description":"Apply a kit (same as Jam picker): regenerates tracks from the kit shuffle profile, then reshuffles. Peek `kit · Name · shuffled`. While playing, preserves current BPM; when stopped, adopts kit BPM.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"fromPicker":{"type":"boolean","description":"Close kit picker if open"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_lock_kit","kind":"act","impl":"imperative","description":"Legacy kit-bank lock (UI omitted). When true, reshuffle keeps the kit drum bank; when false, free bank shuffle. Prefer per-track set_track_lock for pinning lanes.","inputSchema":{"type":"object","properties":{"lock":{"type":"boolean"}},"required":["lock"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"shuffle_sounds","kind":"act","impl":"imperative","description":"Reshuffle unlocked tracks from the active kit shuffle profile + drumsBank when kitId is set (else free pools). Optional trackId reshuffles a single unlocked lane; omit for all unlocked. Respects pinEffects; locked tracks are skipped (single-track returns error if locked/missing).","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"Optional track id — reshuffle only this lane (keep sheet open / one-track mode)"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_song_harmony","kind":"act","impl":"imperative","description":"Set song root + scale (same as Jam key/scale controls). Scales: minor/major/dorian/pentatonic/mixolydian/phrygian/lydian/harmonic_minor. Remaps existing note() melodic lanes like the UI (skips locked / non-melodic). get_session exposes songRoot/songScale + songWalk.","inputSchema":{"type":"object","properties":{"root":{"type":"string","enum":["c","c#","d","eb","e","f","f#","g","ab","a","bb","b"],"description":"Song root pitch class"},"scale":{"type":"string","enum":["minor","major","dorian","pentatonic","mixolydian","phrygian","lydian","harmonic_minor"],"description":"Song scale kind"},"remap":{"type":"boolean","description":"Remap melodic notes (default true)"}},"required":["root","scale"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_walk_length","kind":"act","impl":"imperative","description":"Set chord-walk length N (1–4): N chord centers stretched across N drum cycles (1 chord/cycle by default; densify-walk → 2/cycle). Reshuffles unlocked melodic; drums/hats/fx unchanged. Sticky N for later Song Shuffle. Not Intensity L4.","inputSchema":{"type":"object","properties":{"walkLength":{"type":"number","enum":[1,2,3,4],"description":"Walk length in cycles (1–4)"}},"required":["walkLength"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_walk_center","kind":"act","impl":"imperative","description":"Replace one chord-walk slot (0-based index) with a legal in-scale center (degree + quality). Same pool as walk generation (NEIGHBORS + tonic); rejects illegal / out-of-range. Keeps walk length; reshuffles unlocked melodic (skips Pads Keep / locked). Dice / New kit / Song Shuffle still roll a fresh walk.","inputSchema":{"type":"object","properties":{"index":{"type":"number","description":"Walk slot index 0..N-1"},"degree":{"type":"number","description":"Semitones from song home (0, 2, 3, 5, 7, 8, 10…)"},"quality":{"type":"string","enum":["min","maj"],"description":"Triad quality"}},"required":["index","degree","quality"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_octave","kind":"act","impl":"imperative","description":"Set melodic track octave offset (−3…+3), shifting note() pitches like the Mix sheet. Errors on drums/hihats/fx.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"octave":{"type":"number","minimum":-3,"maximum":3,"description":"Octave offset −3…+3"}},"required":["trackId","octave"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_track_lock","kind":"act","impl":"imperative","description":"Lock or unlock a track lane (pins Shuffle / Shuffle this / Mutate / song harmony remap). Uses session toggle/set. shuffle_sounds already skips locked.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"locked":{"type":"boolean"}},"required":["trackId","locked"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"update_track","kind":"act","impl":"imperative","description":"Replace a track's Strudel code. Queued on the next cycle boundary when playing. Prefer quantization 1 or 2. Call get_reference / search_strudel_docs before writing code.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"Track ID"},"code":{"type":"string","description":"Complete Strudel code for the track"},"quantization":{"type":"string","enum":["1","2","4","immediate"],"description":"Cycle quantization. Default: 1"}},"required":["trackId","code"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"add_track","kind":"act","impl":"imperative","description":"Add a track (role + optional name/code). Without code, generates a seed-aware pattern from the current song seed / root / scale (same as Jam + Track). Explicit code is used as-is.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Track display name"},"role":{"type":"string","enum":["drums","hihats","bass","lead","pad","arp","fx","vox","custom"],"description":"Track role"},"code":{"type":"string","description":"Optional Strudel code"}},"required":["name","role"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"remove_track","kind":"act","impl":"imperative","description":"Remove a track by ID. Never remove without asking the user. Keeps ≥1 track.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"mute_track","kind":"act","impl":"imperative","description":"Toggle mute on a track.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"solo_track","kind":"act","impl":"imperative","description":"Toggle solo on a track.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_volume","kind":"act","impl":"imperative","description":"Set track volume (0–1.5). Mix change — applied immediately when playing.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"volume":{"type":"number","minimum":0,"maximum":1.5}},"required":["trackId","volume"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_active_track","kind":"act","impl":"imperative","description":"Focus a track (activeTrackId) for editor/quantization defaults.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"list_sound_choices","kind":"answer","impl":"imperative","description":"List SOUND_CHOICES for a track role (or active track). Shows which choice is currently matched.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"apply_sound_choice","kind":"act","impl":"imperative","description":"Apply a SOUND_CHOICES id to a track (bank/sound/n via applySoundChoiceToCode).","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"choiceId":{"type":"string"}},"required":["trackId","choiceId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"set_fx","kind":"act","impl":"imperative","description":"Set or clear a code effect on a track (lpf/hpf/room/roomsize/delay/delaytime/delayfeedback/gain/shape/…). Pass value null or clear:true to remove.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"effect":{"type":"string","description":"Effect key. Known: lpf, hpf, lpq, hpq, bpf, bandpass, vowel, room, size, roomsize, delay, delaytime, delayfeedback, gain, shape, distort, crush, coarse, phaser, tremolo, pan, attack, decay, sustain…"},"value":{"type":"number","description":"Scalar value; omit/null with clear to remove"},"clear":{"type":"boolean","description":"Remove the effect"}},"required":["trackId","effect"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"open_code_sheet","kind":"act","impl":"imperative","description":"Open the Jam Code sheet for a track (setCodeTrackId).","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"close_code_sheet","kind":"act","impl":"imperative","description":"Close the Jam Code sheet.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"stash_ab","kind":"act","impl":"imperative","description":"Stash current arrangement into A or B slot.","inputSchema":{"type":"object","properties":{"slot":{"type":"string","enum":["a","b"]}},"required":["slot"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"punch_ab","kind":"act","impl":"imperative","description":"Punch A or B arrangement (stashes first if empty).","inputSchema":{"type":"object","properties":{"slot":{"type":"string","enum":["a","b"]}},"required":["slot"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"toggle_ab","kind":"act","impl":"imperative","description":"Toggle between A/B (stash missing slots, then punch the other).","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"list_mutations","kind":"answer","impl":"imperative","description":"Catalog of Jam Mutate transforms (id, label, hint, scope song|track). Includes intensity-up/down (footer stepper: 1 as-is · 2 hats fill gaps (incl. hh(3,8) / .euclid) · 3 pad → arp → keys → fx (L3 spawn shared with L4; no L4 reshuffle) · 4 bd ~ ~ ~ → bd ~ bd ~ · *N→*2N · perc snares; bass+keys walk @0.5; no mush FX). Song-scope ops apply to all unlocked lanes; track-scope uses last-touched or apply_mutate trackId.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"apply_mutate","kind":"act","impl":"imperative","description":"Apply a Mutate transform (same as Mutate sheet). intensity-up/down = footer Intensity stepper (1 as-is · 2 hats fill gaps (incl. hh(3,8) / .euclid) · 3 pad → arp → keys → fx (L3 spawn shared with L4; no L4 reshuffle) · 4 bd ~ ~ ~ → bd ~ bd ~ · *N→*2N · perc snares; bass+keys walk @0.5; no mush FX; kit/Shuffle resets to 1). Song-scope = all unlocked (skips locked); track-scope = optional trackId else last-touched/active. Undo snapshots (batch for song).","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Mutation id from list_mutations"},"trackId":{"type":"string","description":"Optional track for track-scope mutations"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"spice","kind":"act","impl":"imperative","description":"Same as Jam footer Spice — one FX/timbre nudge (lpf/room/shape/delay/gain). Same tune, not Shuffle. Optional trackId prefers that lane.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"Prefer this track; default active"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"spice_tracks","kind":"act","impl":"imperative","description":"Alias of spice — Jam footer Spice FX/timbre nudge on prefer trackId / active / any.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string","description":"Prefer this track; default active"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"undo_jam","kind":"act","impl":"imperative","description":"Undo last Jam sound/FX (or historical) change.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"play","kind":"act","impl":"imperative","description":"Start playback. Evaluates all tracks and begins audio.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"stop","kind":"act","impl":"imperative","description":"Stop all playback immediately. Never stop/hush without asking the user in a liveloop.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"mic_status","kind":"answer","impl":"imperative","description":"Mic Rec status. Recording REQUIRES a user gesture in the Jam UI (Rec button) — browsers block getUserMedia from agent tools. This tool never fakes start/stop; it only reports whether a recording is currently active via isMicRecording().","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_reference","kind":"answer","impl":"imperative","description":"Get the complete Strudel API reference (~15KB markdown). Covers mini-notation, functions, effects, pattern modifiers, signals, scales, common recipes, and mistakes. Always call this before writing Strudel code.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"search_strudel_docs","kind":"answer","impl":"imperative","description":"Search a cached index of official Strudel docs (https://strudel.cc/) and return relevant snippets + URLs. Also use get_reference for the full in-app API.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"number","minimum":1,"maximum":10}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_samples","kind":"answer","impl":"imperative","description":"Available sample name abbreviations + drum banks (tidal list + banks used by Jam kits / BANK_SHORT).","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"get_scales_and_chords","kind":"answer","impl":"imperative","description":"Get available scale and chord names for use with .scale() and .chord().","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"},{"name":"evaluate_code","kind":"act","impl":"imperative","description":"Execute arbitrary Strudel code directly. Use with caution — prefer update_track for liveloop.","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"Strudel JavaScript code to evaluate"}},"required":["code"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/strudel-synth/"}],"category":"Media & Personal","favicon":"/favicons/drora.github.io.svg","apiSurface":"spec","toolCount":42}}