{"ok":true,"site":{"host":"riffsmith.app","url":"https://riffsmith.app/","type":"live","desc":"Tab out riffs before you forget them.","tools":[{"name":"list_songs","kind":"answer","impl":"imperative","description":"List all songs in RiffSmith with their metadata (tuning, BPM, bar count, sections).","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"get_song","kind":"answer","impl":"imperative","description":"Read a song in full: metadata, section list, per-bar structure (time signature, grid resolution, repeats), and the complete ASCII tab, plus share_url: a link that carries the whole song (open it anywhere to get a copy). Strings are numbered 1 (top, highest pitch) to N (bottom, lowest). Cell tokens: fret numbers 0-24; \"m0\"/\"m3\" palm-muted chug on that fret; \"x\" unpitched dead chug; \"*\" one repick of the preceding note on this slot — repeat \"*\" cells on a 16th grid for 16th-note tremolo picking (works after m-notes and x too); \"=\" hold the previous note out (a picked note rings about 1 s on its own, then fades — write \"=\" in every slot it should keep sounding beyond that); \"~\" vibrato on the preceding note (also holds); \"/7\" slide up into fret 7; \"\\7\" slide down into fret 7; \"h7\" hammer-on to 7, \"p5\" pull-off to 5, \"t12\" tap 12 (legato, no pick attack); \"^7\" pinch harmonic on fret 7 (picked squeal: the overtone over a quiet fundamental); \"b\" bends the preceding note up a step, \"r\" releases it back; \"-\" empty. Chug riff example: \"m0 m0 m0 3 m0 m0 5 =\". Tremolo example: \"0 * * *\".","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"create_song","kind":"act","impl":"imperative","description":"Create a new song and open it. Tuning presets: E Standard, Eb Standard, D Standard, Drop D, Drop C#, Drop C, Drop B, 7-string B Standard, 7-string Drop A, 8-string F# Standard, 8-string Drop E, Bass E Std, Bass Drop B.","inputSchema":{"type":"object","properties":{"title":{"type":"string"},"artist":{"type":"string"},"bpm":{"type":"number"},"tuning_preset":{"type":"string"},"bars":{"type":"number","description":"Initial bar count (default 4)"},"sig":{"type":"string","description":"Time signature for the initial bars, e.g. 3/4 (default 4/4)"}},"required":["title"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"update_song","kind":"act","impl":"imperative","description":"Update song metadata: title, artist, BPM, or tuning preset (E Standard, Eb Standard, D Standard, Drop D, Drop C#, Drop C, Drop B, 7-string B Standard, 7-string Drop A, 8-string F# Standard, 8-string Drop E, Bass E Std, Bass Drop B). Changing tuning keeps all notes.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"title":{"type":"string"},"artist":{"type":"string"},"bpm":{"type":"number"},"tuning_preset":{"type":"string"},"tuning":{"type":"array","items":{"type":"string"},"description":"custom tuning as note names low → high (e.g. [\"B1\",\"E2\",\"A2\",\"D3\",\"G3\",\"B3\",\"E4\"] for a 7-string); 3-9 strings. Notes are kept by string position."},"bass":{"type":"boolean","description":"add (true) or remove (false) the bass track: a bass lane under every bar, played through the bass channel. write_notes with track 'bass' fills it; bass_follow_guitar writes a first pass."},"bass_tuning":{"type":"array","items":{"type":"string"},"description":"bass tuning as note names low → high (default: Bass E Std, or Bass Drop B for drop-tuned guitars)"},"drums":{"type":"boolean","description":"add (true) or remove (false) the drum track: a lane under every bar with rows crash · hat · snare · kick. write_notes with track 'drums' fills it (rows 1-4; tokens x hit, X accent, o open hat); drums_follow_guitar writes a first beat."},"sound":{"type":"string","enum":["synth","guitar","guitar-di"],"description":"Playback instrument: synth, sampled guitar through an amp, or clean DI guitar."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"delete_song","kind":"transact","impl":"imperative","description":"Permanently delete a song. Destructive — confirm_title must exactly match the song's title.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"confirm_title":{"type":"string","description":"Exact title of the song being deleted."}},"required":["confirm_title"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"import_ascii_tab","kind":"act","impl":"imperative","description":"Import an ASCII tab as a new song. Accepts standard tab: string-letter labels with | bar lines, any string count, section headers like \"[1] 0:01 RIFF 3/4 ~160 BPM -- 2 bars, x8\" (become section names, signatures, and repeats), inline 5/7 slides, |: :| repeat marks.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The full ASCII tab."},"title":{"type":"string"}},"required":["text"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"add_bars","kind":"act","impl":"imperative","description":"Append or insert empty bars. New bars inherit the last bar's signature/grid unless overridden.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"count":{"type":"number","description":"How many bars (default 1)"},"after_bar":{"type":"number","description":"1-based bar to insert after; omit to append at the end."},"sig":{"type":"string","description":"Time signature, e.g. 5/4"},"grid":{"type":"number","description":"Slots per beat: 1 quarters, 2 8ths, 3 triplets, 4 16ths, 6 16th-triplets"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"update_bar","kind":"act","impl":"imperative","description":"Update one bar's structure: time signature, grid resolution, section name (a named bar starts a section; empty string clears it), and repeat marks (repeat_start opens a ‖: passage, repeat_end N closes it as :‖×N; 0 clears).","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"bar":{"type":"number","description":"1-based bar number"},"sig":{"type":"string"},"grid":{"type":"number","description":"1 quarters, 2 8ths, 3 triplets, 4 16ths, 6 16th-triplets"},"section_name":{"type":"string"},"repeat_start":{"type":"boolean"},"repeat_end":{"type":"number","description":"Total times the passage plays (2-16), 0 to clear"}},"required":["bar"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"duplicate_bar","kind":"act","impl":"imperative","description":"Duplicate a bar (notes included) immediately after itself.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"bar":{"type":"number"}},"required":["bar"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"delete_bar","kind":"transact","impl":"imperative","description":"Delete a bar and its notes.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"bar":{"type":"number"}},"required":["bar"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"write_notes","kind":"act","impl":"imperative","description":"Write notes into the tab. Either one line (bar + string + cells) or, PREFERRED for anything larger, a `writes` array of many lines applied atomically in one operation — much faster than sequential calls. cells is a space-separated token per slot, left to right. Cell tokens: fret numbers 0-24; \"m0\"/\"m3\" palm-muted chug on that fret; \"x\" unpitched dead chug; \"*\" one repick of the preceding note on this slot — repeat \"*\" cells on a 16th grid for 16th-note tremolo picking (works after m-notes and x too); \"=\" hold the previous note out (a picked note rings about 1 s on its own, then fades — write \"=\" in every slot it should keep sounding beyond that); \"~\" vibrato on the preceding note (also holds); \"/7\" slide up into fret 7; \"\\7\" slide down into fret 7; \"h7\" hammer-on to 7, \"p5\" pull-off to 5, \"t12\" tap 12 (legato, no pick attack); \"^7\" pinch harmonic on fret 7 (picked squeal: the overtone over a quiet fundamental); \"b\" bends the preceding note up a step, \"r\" releases it back; \"-\" empty. Chug riff example: \"m0 m0 m0 3 m0 m0 5 =\". Tremolo example: \"0 * * *\". Use \".\" to leave a slot unchanged; fewer tokens than slots leaves the rest unchanged. Strings are 1-based from the top (1 = highest pitch). Returns the affected bars as ASCII for verification. Example: cells \"0 0 3 /5 = = x -\"","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"track":{"type":"string","enum":["guitar","bass","drums"],"description":"which lane to write: guitar (default), the bass track (strings count from the top of the bass tuning), or drums (string 1 = crash, 2 = hi-hat, 3 = snare, 4 = kick; tokens x hit, X accent, o open hat/choked crash). The song must have that track (update_song bass/drums)."},"bar":{"type":"number","description":"1-based bar number (single-line form)"},"string":{"type":"number","description":"1-based string from the top (single-line form)"},"cells":{"type":"string","description":"Space-separated tokens (single-line form)"},"writes":{"type":"array","description":"Batch form: many lines written in one atomic operation.","items":{"type":"object","properties":{"bar":{"type":"number"},"string":{"type":"number"},"cells":{"type":"string"}},"required":["bar","string","cells"],"additionalProperties":false}}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"transpose","kind":"act","impl":"imperative","description":"Move every fretted note in a bar range up or down by semitones (slides, hammer-ons, palm mutes and pinch targets included; unpitched marks stay). Fails, changing nothing, if any note would leave frets 0-24. Omit the range for the whole song.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"semitones":{"type":"number","description":"positive = up, negative = down"},"from_bar":{"type":"number","description":"1-based first bar (default 1)"},"to_bar":{"type":"number","description":"1-based last bar (default: last)"}},"required":["semitones"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"undo","kind":"act","impl":"imperative","description":"Undo the last change to the open song (one step; call again for more). redo: true re-applies the last undone change. Every edit, yours or the human's, is a step.","inputSchema":{"type":"object","properties":{"redo":{"type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"share_song","kind":"act","impl":"imperative","description":"Get a link that carries the whole song (compressed into the URL, no server, nothing stored). Anyone opening it gets a copy in their own RiffSmith. Also returned by get_song as share_url.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"export_mp3","kind":"act","impl":"imperative","description":"Export the open song as an MP3 through the current rig. This plays the song once in real time (the human hears it) while recording, then saves the file through the browser's download. Takes as long as the song.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"copy_bars","kind":"act","impl":"imperative","description":"Copy a range of bars (notes, meters, repeats) and insert the copies after another bar. Use it to build a song from a riff: copy bars 1-4 after bar 4 to play the riff twice.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"from_bar":{"type":"number","description":"1-based first bar of the range"},"to_bar":{"type":"number","description":"1-based last bar of the range (default: from_bar)"},"after_bar":{"type":"number","description":"1-based bar to insert after (0 = at the start; default: the end of the song)"}},"required":["from_bar"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"bass_follow_guitar","kind":"act","impl":"imperative","description":"Write a bass line that follows the guitar: in every slot the lowest fretted guitar note becomes the bass root (an octave down, on the lowest bass string that reaches it), palm mutes stay muted, holds stay held. Adds the bass track if the song has none. A starting point to edit with write_notes track 'bass'.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"from_bar":{"type":"number","description":"1-based first bar (default 1)"},"to_bar":{"type":"number","description":"1-based last bar (default: last)"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"drums_follow_guitar","kind":"act","impl":"imperative","description":"Write a metal beat that follows the guitar: kick on every low-string attack (chugs), snare on the backbeats, hi-hats on the 8ths (16ths when the riff is dense), a crash on each section's first slot. Adds the drum track if the song has none. Edit it afterwards with write_notes track 'drums'.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"from_bar":{"type":"number","description":"1-based first bar (default 1)"},"to_bar":{"type":"number","description":"1-based last bar (default: last)"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"import_guitar_pro","kind":"act","impl":"imperative","description":"Import a Guitar Pro file (gp3/gp4/gp5/gpx/gp, also MusicXML) given as base64, or alphaTex text, as a new song. The first guitar track becomes the song; a bass track becomes the bass lane and a percussion track the drum lane (override with track/bass/drums indexes; set bass or drums to -1 to skip). Returns the track list, what was used, warnings, and the tab.","inputSchema":{"type":"object","properties":{"base64":{"type":"string","description":"the file's bytes, base64-encoded"},"alphatex":{"type":"string","description":"alphaTex source instead of a file"},"title":{"type":"string"},"track":{"type":"number","description":"0-based track index to use as the guitar"},"bass":{"type":"number","description":"0-based track index for the bass lane (-1 = none)"},"drums":{"type":"number","description":"0-based track index for the drum lane (-1 = none)"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"export_midi","kind":"act","impl":"imperative","description":"Export a song as a Standard MIDI file (format 1: guitar, bass lane and drum lane as tracks; repeats expanded; bends and slides as pitch bend). Returns the file as base64 for you to save, and the browser downloads it for the human.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"get_rig","kind":"answer","impl":"imperative","description":"Read the amp/performance rig: tight (0-1 pre-distortion low-cut/mid emphasis), volume (0-2), mute_grip (0-1 palm-mute pressure), picking (alternate/down/up), double_track, engine (new = continuous voices, old = retrigger A/B), cab (synthetic cabinet after a NAM model), pm_bank (palm-mute sample source), note_bank (sustained-note guitar), player_rules (humanization on/off), feedback (amp feedback swell on long held notes), ring (seconds a picked note rings), nam_input (DI level into the capture), count_in, click (metronome), room (0-1 amount of the small room around the cab), nam_model (active Neural Amp Modeler capture name, or null = built-in amp), nam_models (every capture the human has loaded in this browser — switch between them with set_rig.nam_model; adding a new .nam file still requires the human's file picker), loop.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"set_rig","kind":"act","impl":"imperative","description":"Set amp/performance rig settings (any subset). tight 0-1: the boost pedal in front of the amp (low cut, mid hump, soft clip) — raise for surgically tight modern-metal chugs. volume 0-2. mute_grip 0-1: palm-mute pressure, higher = shorter/choked. picking: 'down' keeps breakdowns uniformly forceful. double_track: independent second take hard-panned L/R (through two extra capture instances when a NAM model is loaded). engine: 'new' = sampled voices, 'hybrid' = sampled attack exciting a physical string model (experimental), 'model' = the string model alone with no sampled pick, 'old' only for A/B comparison. engine_status in get_rig says whether the model is actually running. cab: add the synthetic cabinet after a NAM model — keep false for full-rig captures. pm_bank: gtechs | bassvi | custom. loop: loop playback. nam_model: switch the amp to one of get_rig.nam_models (name, case-insensitive) or 'none' for the built-in amp — adding a brand-new .nam file still requires the human's file picker.","inputSchema":{"type":"object","properties":{"tight":{"type":"number","minimum":0,"maximum":1},"volume":{"type":"number","minimum":0,"maximum":2},"mute_grip":{"type":"number","minimum":0,"maximum":1},"picking":{"type":"string","enum":["alternate","down","up"]},"double_track":{"type":"boolean"},"engine":{"type":"string","enum":["new","old","hybrid","model"]},"player_rules":{"type":"boolean","description":"performance humanization (tension glide, pick comb, velocity tone, micro-timing, chord rakes); false = plain sampler"},"legato_landings":{"type":"boolean","description":"hand legato/bend/slide landings over to a real recording of the target pitch (true) or keep the resampled voice (false)"},"feedback":{"type":"boolean","description":"notes held over ~1.3 s (with = or ~) swell into amp feedback on their overtone; off by default"},"ring":{"type":"number","minimum":0.3,"maximum":3.2,"description":"seconds a plain picked note rings before it fades (default 1.1, sequencer-tight for riffs; 2.5-3.2 for clean arpeggios and let-ring parts). \"=\" always extends a note regardless"},"bass_rig":{"type":"string","enum":["capture","bass","guitar"],"description":"for bass tunings: 'capture' = a bundled bass capture (default; see bass_models), 'bass' = the built-in clean-to-gritty bass amp (tight = drive), 'guitar' = through the guitar rig/capture for distorted bass"},"bass_model":{"type":"string","description":"which bass capture the 'capture' rig uses: a name from get_rig.bass_models (RiffSmith Bass Clean is the default, RiffSmith Bass Distorted the driven one). Setting it also selects bass_rig 'capture'."},"cab":{"type":"boolean"},"pm_bank":{"type":"string","enum":["gtechs","bassvi","custom"],"description":"palm-mute source: gtechs = LP humbucker (pitched down for drop tunings), bassvi = built-in flatwound Bass VI, custom = the user's imported bank"},"note_bank":{"type":"string","enum":["gtechs","fsbs"],"description":"sustained-note guitar: gtechs = LP humbucker, fsbs = Fender single-coil"},"nam_model":{"type":"string","description":"a name from get_rig.nam_models, or 'none' for the built-in amp"},"nam_input":{"type":"number","minimum":0.1,"maximum":2,"description":"DI level into the NAM capture (1 = raw sample level; default 0.45 ≈ -7 dB, where captures are trained)"},"room":{"type":"number","minimum":0,"maximum":1,"description":"the small room around the cab: 0 = bone dry, 0.1 default (a mic'd cab in a live room), 1 = very roomy"},"loop":{"type":"boolean"},"count_in":{"type":"boolean","description":"one bar of clicks before the song starts"},"click":{"type":"boolean","description":"metronome click under playback"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"play","kind":"act","impl":"imperative","description":"Play the song aloud for the human through the page's synth. Optionally a bar range or a named section; loop repeats it until stop. Also switches the view to that song.","inputSchema":{"type":"object","properties":{"song":{"type":"string","description":"Song title or id. Omit for the currently open song."},"from_bar":{"type":"number"},"to_bar":{"type":"number"},"section":{"type":"string","description":"Section name to play (overrides from/to)"},"loop":{"type":"boolean","description":"Loop until stopped (default false)"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"},{"name":"stop","kind":"act","impl":"imperative","description":"Stop playback.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"polyfill","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/riffsmith.app.png","apiSurface":"polyfill","toolCount":24}}