{
 "firmware": "SLOOP",
 "slug": "sloop",
 "author": "isod89 (3dSam), built on Felucca by Leo Kuroshita (Hügelton Instruments)",
 "repo": "https://github.com/isod89/sloop-fm1",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v2.7.1",
 "mapped_commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
 "release_date": "2026-10-16",
 "date_mapped": "2026-10-16",
 "turns_it_into": "A four-track live groovebox: three synth tracks and a drum machine you play, record and arrange by holding a button and touching keys.",
 "docs": [
  {
   "title": "GUIDE.md (SLOOP 2.7 — The Complete Guide)",
   "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md",
   "words": 23153,
   "read_at": "v2.7.1 4ec1ac8; release diff and full install, storage, backup, downgrade and changed-control sections read; unchanged unrelated chapters not re-read end-to-end"
  },
  {
   "title": "README.md",
   "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/README.md",
   "words": 9973,
   "read_at": "v2.7.1 4ec1ac8; release diff and full install, storage, backup, downgrade and changed-control sections read; unchanged unrelated chapters not re-read end-to-end"
  },
  {
   "title": "SLOOP.md (SLOOP 2.7, manual and release notes)",
   "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/SLOOP.md",
   "words": 17157,
   "read_at": "v2.7.1 4ec1ac8; release diff and full install, storage, backup, downgrade and changed-control sections read; unchanged unrelated chapters not re-read end-to-end"
  },
  {
   "title": "DEMARRAGE-RAPIDE-FR.md (SLOOP 2.7 — démarrage rapide)",
   "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/DEMARRAGE-RAPIDE-FR.md",
   "words": 7919,
   "read_at": "v2.7.1 4ec1ac8; release diff and full install, storage, backup, downgrade and changed-control sections read; unchanged unrelated chapters not re-read end-to-end"
  },
  {
   "title": "SLOOP editor protocol (SysEx over USB-MIDI)",
   "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/EDITOR_PROTOCOL.md",
   "words": 7745,
   "read_at": "v2.7.1 4ec1ac8; release diff and full install, storage, backup, downgrade and changed-control sections read; unchanged unrelated chapters not re-read end-to-end"
  }
 ],
 "install": {
  "hub": "https://thefirmwarehub.com/",
  "official": "https://github.com/isod89/sloop-fm1/releases/tag/v2.7.1"
 },
 "part_id_notes": "The button printed SEL is B_SCL in the code (panel.c). SLOOP drives one LED per button id, so for PLAY it lights only the LED at the PLAY button's matrix position; it never addresses a second (green) transport LED, so led_play_stop_green is not mapped. The button and knob table can be re-learned by HARDWARE CALIBRATION, so on a recalibrated unit the ids follow the printed labels. The jacks are not in controls because the gesture list has no verb for them; their SLOOP behaviour is in jack_notes. Reconciled to the drawing's part ids (output/tutorials/_panels/m-vave-fm1, branch fm1/panel 4027d71) on 2026-10-13 by the lead session: the drawing has no separate button lamps, so what a button's light shows moved from led_<button> to lights.button_<button> (led_play_stop_green to lights.button_play_stop with light='green'); led_key_<note> became lights.led_<note>; led_keys_all became lights.key_lights, with groups.key_lights listing the 27 key-light parts; jack_usb_c became jack_usb. Originals: _before-reconcile/.",
 "jack_notes": [
  {
   "part": "jack_usb",
   "note": "USB-C carries USB MIDI, the editor and installer, and a stereo USB audio input called Felucca. USB AUDIO sets its level to MASTER or FULL; USB RATE chooses AUTO, 44.1 or 48 kHz at the next power-on. With internal sync, MIDI 3 CLOCK OUT also sends clock and transport over USB.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/audio.c",
     "lines": "33",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/audio.c#L33"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/fx.c",
     "lines": "158-160",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/fx.c#L158-L160"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "247-249",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L247-L249"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/usb.c",
     "lines": "277-325",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/usb.c#L277-L325"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/main.c",
     "lines": "233-236",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L233-L236"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2791-2826",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2791-L2826"
    }
   ]
  },
  {
   "part": "jack_midi_in",
   "note": "The 3.5 mm TRS MIDI input plays tracks by channel (GLO > MIDI) and can be the clock source (GLO > SYSTEM > SYNC = TRS). MIDI 3 adds a punch-in FX channel and a remote-button channel: notes F3-G5 hold effects unless MIDI IN is CLOCK, and CC 102-115 press or release the fourteen panel buttons. CC74 uses the engine cutoff where available, otherwise the track FILTER; an explicitly learned CC takes priority. REMOTE CC order: 102 FX, 103 SEL, 104 ENV, 105 LFO, 106 EDIT, 107 GLO, 108 HOME, 109 SAVE, 110 ARP, 111 SEQ, 112 PLAY, 113 REC, 114 OCT-, 115 OCT+. Values 64-127 hold and 0-63 release. Unplugging TRS does not release a held button; send its release, set REMOTE OFF or change its channel. USB disconnection clears remote buttons. A stuck REC can clear a track.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/main.c",
     "lines": "237-239",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L237-L239"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2727-2740",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2727-L2740"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2985-3016",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2985-L3016"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1428-1444",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1428-L1444"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1765-1779",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1765-L1779"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2645-2704",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2645-L2704"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2994-3002",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2994-L3002"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1424-1438",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1424-L1438"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "964-991",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L964-L991"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "928-949",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L928-L949"
    }
   ]
  }
 ],
 "modes": [
  {
   "id": "synth_play",
   "name": "Playing a synth track",
   "how_to_get_there": "Turn ALGORITHM to track 1, 2 or 3 and hold no function button.",
   "what_it_is": "The keys play the selected synth track. Its KEYS setting can round notes into the scale (SNAP) or lay the scale over the white keys starting at C4, leaving the black keys silent (WHITE).",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "195-249",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L195-L249"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1868-1910",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1910"
    }
   ]
  },
  {
   "id": "chord_mode",
   "name": "Chord mode on a synth track",
   "how_to_get_there": "Hold SEL and turn KNOB 1 to a chord type (or set CHORD on the SEL page).",
   "what_it_is": "Each white key plays a chord built from the track's scale, with C4 as the first degree; held black keys alter the chords. On the chromatic scale (CHR) the chords are taken from natural minor.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "210-235",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "251-300",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L300"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1868-1892",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1892"
    }
   ]
  },
  {
   "id": "drum_play",
   "name": "Playing the drum track",
   "how_to_get_there": "Turn ALGORITHM to track 4.",
   "what_it_is": "The 16 white keys play the 16 drum sounds; each black key doubles the white key just left of it. OCT- and OCT+ held make hits ghost or hard.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/drums.c",
     "lines": "72-89",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L89"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1853-1867",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
    }
   ]
  },
  {
   "id": "tracks",
   "name": "TRACKS screen",
   "how_to_get_there": "Tap HOME.",
   "what_it_is": "The performance view: tempo, transport, the four tracks with their steps and levels, and four dials (swing, level, steps, pan).",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "341-355",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L341-L355"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "199-218",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L199-L218"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "264-280",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L264-L280"
    }
   ]
  },
  {
   "id": "visualiser",
   "name": "Visualiser",
   "how_to_get_there": "Tap HOME while the TRACKS screen is showing.",
   "what_it_is": "A full-screen picture of the sound in one of twelve styles. Keys, PLAY, REC and the layers keep working.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "1077-1084",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1077-L1084"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_vis.c",
     "lines": "1-13",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_vis.c#L1-L13"
    }
   ]
  },
  {
   "id": "pages",
   "name": "A button's pages",
   "how_to_get_there": "Tap FX, SEL, ENV, LFO, EDIT, GLO, ARP or SEQ (or SAVE away from TRACKS and DRUMS). Tap again for the next page.",
   "what_it_is": "Four values per page, one per KNOB. ENV: ENV, ENV DEST. LFO: LFO, LFO 2, LFO DEST. FX: FX, FILTER, SLICER, INSERT, INSERT 2, DLY, REV/CHO. SEL: SEL, SEL 2. EDIT: EDIT 1, EDIT 2, FILTER (ANALOG engine only), VOICE, VOICE 2. ARP: ARP, ARP 2. SEQ: STEP, PATTERN, plus the separate SONG screen. GLO: GLOBAL, MASTER, SYSTEM, DRUMS, MIDI, MIDI 2, MIDI 3, TEXTURE, TEXTURE 2.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "395-438",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L395-L438"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "280-324",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L324"
    }
   ]
  },
  {
   "id": "step_page",
   "name": "SEQ STEP page (synth tracks)",
   "how_to_get_there": "Tap SEQ on a synth track (its first page).",
   "what_it_is": "Step entry one step at a time: the keys write the step under the cursor, the knobs move the cursor and shape the step.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "434",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L434"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "603-651",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L603-L651"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "321-369",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L321-L369"
    }
   ]
  },
  {
   "id": "save_pages",
   "name": "SAVE pages",
   "how_to_get_there": "Tap SAVE on any page other than TRACKS, DRUMS or SONG. Tap again for the next page.",
   "what_it_is": "PRESETS (sounds, engines and favourites), USER (32 user sound slots), SECTION (song sections A-D) and TOOLS (clear pattern, reset sound, new working loop). Loading, saving, erasing and tools need two clicks.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "428-431",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L428-L431"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "422-465",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L422-L465"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "478-521",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L521"
    }
   ]
  },
  {
   "id": "save_presets",
   "name": "SAVE > PRESETS page",
   "how_to_get_there": "Tap SAVE on a page (not TRACKS, DRUMS or SONG); it is the first SAVE page.",
   "what_it_is": "Browse sounds with KNOB 1 or engines with KNOB 2; KNOB 4 adds or removes a favourite, up to 16 at the head of the sound list; on the drum track the page shows DRUM TRACK.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "428",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L428"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "422-432",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L422-L432"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "558-637",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L558-L637"
    }
   ]
  },
  {
   "id": "save_user",
   "name": "SAVE > USER page",
   "how_to_get_there": "Tap SAVE again from PRESETS.",
   "what_it_is": "The 32 user sound slots: pick one, then load, erase or save with two clicks each.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "429",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L429"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "434-452",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L434-L452"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/upreset.c",
     "lines": "337-367",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L337-L367"
    }
   ]
  },
  {
   "id": "save_project",
   "name": "SAVE > SECTION page",
   "how_to_get_there": "Tap SAVE again from USER.",
   "what_it_is": "The four song sections A-D: erase, load or save with two clicks, only while stopped.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "430",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L430"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "453-465",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L453-L465"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "478-497",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L497"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "581-598",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L581-L598"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "604-618",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L604-L618"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "653-666",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L653-L666"
    }
   ]
  },
  {
   "id": "save_tools",
   "name": "SAVE > TOOLS page",
   "how_to_get_there": "Tap SAVE again from SECTION.",
   "what_it_is": "Clear the pattern, reset the sound, or start a new working loop; sections A-D stay stored; each action needs two clicks.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "431",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L431"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "498-521",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L498-L521"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "371-402",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L371-L402"
    }
   ]
  },
  {
   "id": "drums_grid",
   "name": "DRUMS screen, grid page",
   "how_to_get_there": "Select the drum track and tap EDIT or SEQ on TRACKS; DRUMS returns to its last page, so turn SELECT fully left to reach GRID before using keys as steps.",
   "what_it_is": "All 16 drum sounds against 16 steps; the white keys become the steps of the sound KNOB 1 picks.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "9-11",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L9-L11"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "103-112",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L103-L112"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "680-689",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L689"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "530-535",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "460-461",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L460-L461"
    }
   ]
  },
  {
   "id": "drums_kit",
   "name": "DRUMS screen, kit page",
   "how_to_get_there": "On the DRUMS grid tap EDIT or SEQ once, or turn SELECT toward KIT.",
   "what_it_is": "16 pads that flash on each hit; the knobs set kit, drum level, drum reverb and drum pan.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "680-685",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "393-414",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L393-L414"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "530-535",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "598-603",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L598-L603"
    }
   ]
  },
  {
   "id": "song_screen",
   "name": "SONG screen",
   "how_to_get_there": "Tap SAVE on the TRACKS or DRUMS screen, or hold SAVE and press white key 16.",
   "what_it_is": "Edits the song order by hand: up to 16 entries, each a section A-D and a length in bars.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "709-718",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L709-L718"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_song.c",
     "lines": "87-154",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L87-L154"
    }
   ]
  },
  {
   "id": "stopped",
   "name": "Transport stopped",
   "how_to_get_there": "Press PLAY while playing.",
   "what_it_is": "The transport is stopped. Actions on SAVE > SECTION and user-sound save or erase require this state; the SECTION page refuses them during playback rather than queuing them. SAVE-layer section calls and stores still work while playing, and user sounds can load then too. Editing song-order entries needs a stop too; moving their cursor does not.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "581-598",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L581-L598"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "604-609",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L604-L609"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "653-658",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L653-L658"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/upreset.c",
     "lines": "350-365",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L350-L365"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "364-395",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L364-L395"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_song.c",
     "lines": "135-150",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L135-L150"
    }
   ]
  },
  {
   "id": "playing",
   "name": "Transport playing",
   "how_to_get_there": "Press PLAY.",
   "what_it_is": "All four tracks loop.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "1091-1100",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1091-L1100"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2831-2850",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2831-L2850"
    }
   ]
  },
  {
   "id": "song_mode",
   "name": "Song mode",
   "how_to_get_there": "Hold SAVE and press white key 13, or press OCT- on the SONG screen.",
   "what_it_is": "PLAY plays the song order instead of the loop; recording waits until the song is stopped.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "396-402",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L396-L402"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2177-2188",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2177-L2188"
    }
   ]
  },
  {
   "id": "rec_ready",
   "name": "REC armed (rec ready)",
   "how_to_get_there": "Press REC while stopped.",
   "what_it_is": "Waiting to record the selected track. An empty project can start a free take; otherwise a note or PLAY starts the loop and recording. KNOB 1-4 set MODE, LENGTH, START and QUANT.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "117-136",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L117-L136"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "871-906",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L871-L906"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "741-770",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L741-L770"
    }
   ]
  },
  {
   "id": "count_in",
   "name": "Count-in",
   "how_to_get_there": "Armed with START set to count, press PLAY.",
   "what_it_is": "One bar of four clicks, then the loop and recording start; notes played meanwhile only sound.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2838-2878",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2838-L2878"
    }
   ]
  },
  {
   "id": "free_take",
   "name": "Free take",
   "how_to_get_there": "In an empty project with MODE free, press REC and play a note.",
   "what_it_is": "Play without a click, then press REC on the downbeat after the last bar to make a 1, 2 or 4 bar loop and set its tempo; QUANT OFF retains timing offsets as step nudges; the take ends by itself after 24 s.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1008-1061",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1008-L1061"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1070-1085",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1070-L1085"
    }
   ]
  },
  {
   "id": "hold_clear",
   "name": "Clear-track ring",
   "how_to_get_there": "Hold REC past 0.7 s.",
   "what_it_is": "A ring fills; keep holding to clear the selected track, let go to cancel.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "908-960",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L908-L960"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "1028-1070",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L1028-L1070"
    }
   ]
  },
  {
   "id": "layer_fx",
   "name": "FX layer (punch)",
   "how_to_get_there": "Hold FX.",
   "what_it_is": "All 27 keys trigger punch-in effects on the whole mix while held; the knobs are master filter, DUST, DUCK and the selected track's filter.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "2-22",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L2-L22"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1786-1910",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1786-L1910"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/punch.c",
     "lines": "12-21",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
    }
   ]
  },
  {
   "id": "layer_erase",
   "name": "EDIT layer (erase)",
   "how_to_get_there": "Hold EDIT.",
   "what_it_is": "In erase mode, keys remove their note or drum sound; on drums the erase/mute choice survives EDIT release. Knobs shift, resize and transpose the pattern; OCT- and OCT+ undo and redo notes, length and nudges.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1088-1153",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1088-L1153"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1998-2005",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1998-L2005"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "467-512",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L467-L512"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "229-256",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L229-L256"
    }
   ]
  },
  {
   "id": "layer_erase_mute",
   "name": "EDIT layer, drum mute mode",
   "how_to_get_there": "On the drum track, hold EDIT and press any black key.",
   "what_it_is": "White keys toggle live drum mutes without removing hits; any black key toggles between mute and erase. Releasing EDIT keeps that choice for the next hold. The mutes are not saved.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1090-1100",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1090-L1100"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1998-2005",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1998-L2005"
    }
   ]
  },
  {
   "id": "layer_roll",
   "name": "ARP layer (note repeat)",
   "how_to_get_there": "Hold ARP.",
   "what_it_is": "A held key repeats in time at the roll RATE (KNOB 1); while recording, rolls are written as ratchets.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1603-1667",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1667"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "511-514",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L511-L514"
    }
   ]
  },
  {
   "id": "layer_steps",
   "name": "SEQ layer (steps)",
   "how_to_get_there": "Hold SEQ.",
   "what_it_is": "Each white key stands for one of the 16 steps shown; F#3, G#3, A#3 and C#4 switch between the four pages of steps of the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "108-171",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L108-L171"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "342-351",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L342-L351"
    }
   ]
  },
  {
   "id": "layer_steps_held",
   "name": "SEQ layer with step keys held",
   "how_to_get_there": "Hold SEQ, then hold one or more step keys.",
   "what_it_is": "The knobs edit the held steps (sound or note, level or velocity, ratchet, nudge); PRESETS and ALGORITHM set a parameter lock; OCT- and OCT+ clear or set fill conditions.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "180-303",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L180-L303"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "475-485",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L475-L485"
    }
   ]
  },
  {
   "id": "layer_key",
   "name": "SEL layer (key and chords)",
   "how_to_get_there": "Hold SEL.",
   "what_it_is": "Any key sets the song's key; the knobs set chord type, scale, KEYS mode and transpose.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "352-358",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "538-553",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L538-L553"
    }
   ]
  },
  {
   "id": "layer_mix",
   "name": "GLO layer (mix)",
   "how_to_get_there": "Hold GLO.",
   "what_it_is": "White keys mute, solo, call fills and tap the tempo; F#3 toggles MIDI LEARN; the knobs are the four track levels.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "420-435",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "554-558",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L554-L558"
    }
   ]
  },
  {
   "id": "layer_song",
   "name": "SAVE layer (song)",
   "how_to_get_there": "Hold SAVE.",
   "what_it_is": "Keys 1 to 4 call up sections A to D (tap several during one hold to chain them); keys 5 to 8 save the current loop as section A to D; key 13 toggles loop or song mode; key 14 records a song from the sections you play; key 16 goes to the SONG screen.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "359-419",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "441-456",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L441-L456"
    }
   ]
  },
  {
   "id": "layer_locked",
   "name": "A layer locked open",
   "how_to_get_there": "Hold a layer button (FX, EDIT, ARP, SEQ, SEL, GLO or SAVE) and tap HOME.",
   "what_it_is": "Releasing the layer button leaves its controls active. PLAY and REC still operate, as do the two octave buttons; pressing another button exits the layer without carrying out that button’s usual action.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "724-734",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L724-L734"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "753-762",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L753-L762"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "779-788",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
    }
   ]
  },
  {
   "id": "menu",
   "name": "HOME menu",
   "how_to_get_there": "Hold HOME for 0.7 s.",
   "what_it_is": "Four sections: SCREEN (colour or custom theme, zoom, knob acceleration), LIGHTS (button glow, key glow, played notes), AUDIO (speaker low cut, USB audio level and USB rate), SYSTEM (second core, hardware calibration, MIDI LEARN clear, version info); USB SERIAL appears only in console-enabled builds.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "9-22",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L9-L22"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "47-94",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L47-L94"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "221-305",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L221-L305"
    }
   ]
  },
  {
   "id": "about",
   "name": "ABOUT screen",
   "how_to_get_there": "In the menu's SYSTEM section, put the cursor on ABOUT and press OCT+.",
   "what_it_is": "Version, build date, credits, source address and supply voltages, with core status 2 CORES, 1 CORE or C1 OFF; a late second core forces one-core operation until the next power-on.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "125-146",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L125-L146"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/cpu1.c",
     "lines": "18-28",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/cpu1.c#L18-L28"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/cpu1.c",
     "lines": "43-71",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/cpu1.c#L43-L71"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Hardware calibration",
   "how_to_get_there": "Switch on holding OCT- and OCT+, or menu SYSTEM, HARDWARE CALIBRATION, OCT+.",
   "what_it_is": "Teaches the firmware which physical button and knob is which: press each button and turn each knob right as named. 30 s with no input cancels and keeps the old table.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/main.c",
     "lines": "244-247",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L244-L247"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "1173-1241",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1173-L1241"
    }
   ]
  },
  {
   "id": "usb_rescue",
   "name": "USB rescue",
   "how_to_get_there": "Switch on holding OCT- alone (also entered by itself after two failed starts).",
   "what_it_is": "A minimal mode with audio off that only waits for a reinstall from the browser installer.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/recovery.c",
     "lines": "41-70",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/recovery.c#L41-L70"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/bootguard.h",
     "lines": "17-30",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/bootguard.h#L17-L30"
    }
   ]
  },
  {
   "id": "update_countdown",
   "name": "Update-mode countdown",
   "how_to_get_there": "While stopped, hold OCT- and OCT+ together.",
   "what_it_is": "After 2 s a countdown shows; at 5 s the work is saved and the FM-1 enters its update mode (UBOOT). Letting go cancels.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/main.c",
     "lines": "281-309",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L281-L309"
    }
   ]
  },
  {
   "id": "drums_sound",
   "name": "DRUMS screen, SOUND page",
   "how_to_get_there": "From the DRUMS kit page tap EDIT or SEQ, or turn SELECT toward SOUND.",
   "what_it_is": "Choose a drum sound with a key or KNOB 1, then adjust its tuning and decay with KNOB 2 and 3; KNOB 4 sets the drum track level.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "680-685",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "530-543",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L543"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_studio.c",
     "lines": "581-597",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L581-L597"
    }
   ]
  },
  {
   "id": "keyboard_hold",
   "name": "Keyboard hold",
   "how_to_get_there": "Set ARP MODE to OFF and ARP 2 HOLD to ON on a synth track.",
   "what_it_is": "Notes or chords keep sounding after their keys are released; with no keys physically held, the next press replaces them; switching HOLD off releases them.",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/params.c",
     "lines": "432-433",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1452-1460",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1460"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1503-1514",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "1536-1539",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1536-L1539"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2975-2976",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2975-L2976"
    }
   ]
  }
 ],
 "controls": {
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Starts or stops all four tracks; it keeps working inside every layer.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1091-1100",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1091-L1100"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1051-1053",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1051-L1053"
     }
    ]
   },
   {
    "mode": "song_mode",
    "gesture": "press",
    "action": "Plays the song order from the top; if a section in it is empty it refuses with EMPTY SECTION: REC.",
    "short_label": "PLAY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1092-1097",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1092-L1097"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2177-2188",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2177-L2188"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "action": "Starts the loop and recording from the top, or, with START set to count, plays one bar of clicks first.",
    "short_label": "REC START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2840-2850",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2840-L2850"
     }
    ]
   },
   {
    "mode": "count_in",
    "gesture": "press",
    "action": "Stops the count-in and goes back to waiting armed.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2838-2839",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2838-L2839"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "press",
    "action": "Throws the free take away; nothing changes.",
    "short_label": "DROP TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1070-1086",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1070-L1086"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Starts or stops playback from the SONG screen.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "98-101",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L98-L101"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while the menu is open.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1023-1029",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1023-L1029"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "309-344",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L309-L344"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "playing",
    "gesture": "press",
    "action": "Starts recording the selected track at once; press again to stop recording while the loop plays on.",
    "short_label": "REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "117-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L117-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "745-750",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L745-L750"
     }
    ]
   },
   {
    "mode": "stopped",
    "gesture": "press",
    "action": "Arms recording (rec ready); press again to disarm (REC OFF).",
    "short_label": "ARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "125-135",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L125-L135"
     }
    ]
   },
   {
    "mode": "song_mode",
    "gesture": "press",
    "action": "While the song plays it refuses (STOP THE SONG FIRST); when stopped, arming switches back to loop mode.",
    "short_label": "REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "121-131",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L121-L131"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "press",
    "action": "Closes the free take into a 1, 2 or 4 bar loop at the fitted tempo and starts playback; with QUANT off, its timing offsets remain as step nudges.",
    "short_label": "CLOSE LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1008-1061",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1008-L1061"
     }
    ]
   },
   {
    "mode": "count_in",
    "gesture": "press",
    "action": "Cancels the count-in and disarms.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "125-130",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L125-L130"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2861-2863",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2861-L2863"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 2 s (a ring shows after 0.7 s): clears the selected track's notes, locks, nudges and fill conditions; releasing before the ring closes cancels; undo restores notes, length and nudges, but not locks or fill conditions.",
    "short_label": "CLEAR TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "920-957",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L920-L957"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "1028-1035",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L1028-L1035"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "455-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L455-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "229-256",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L229-L256"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Stores the current loop into the section of the song entry under the cursor; if that section already holds music, a second REC within 3 s is needed.",
    "short_label": "STORE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "104-132",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L104-L132"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "917-918",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L917-L918"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1039",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1039"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Goes to the TRACKS screen (from pages, the DRUMS screen and the SONG screen).",
    "short_label": "TRACKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1077-1084",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1077-L1084"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "341-353",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L341-L353"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "511-514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L511-L514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "92",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L92"
     }
    ]
   },
   {
    "mode": "tracks",
    "gesture": "press",
    "action": "Opens the visualiser.",
    "short_label": "VISUALISER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1077-1079",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1077-L1079"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_vis.c",
      "lines": "41-47",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_vis.c#L41-L47"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "press",
    "action": "Closes the visualiser, back to TRACKS.",
    "short_label": "CLOSE VIS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1080-1083",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1080-L1083"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held 0.7 s: opens the menu.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "653-671",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L653-L671"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1010-1021",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1010-L1021"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "long_press",
    "action": "Held 0.7 s again: closes the menu and returns to TRACKS.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1010-1013",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1010-L1013"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "210-219",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L210-L219"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_fx",
    "action": "Locks the FX layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "action": "Locks the EDIT layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_arp",
    "action": "Locks the ARP layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "action": "Locks the SEQ layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_sel",
    "action": "Locks the SEL layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "action": "Locks the GLO layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Locks the SAVE layer open so both hands are free; LOCK shows on the screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "779-788",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L779-L788"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "action": "Unlocks the locked layer and does nothing else.",
    "short_label": "UNLOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "753-762",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L753-L762"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1031-1035",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1031-L1035"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the ENV pages (ENV, ENV DEST); again for the next page. ENV has no layer.",
    "short_label": "ENV PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1112-1114",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1112-L1114"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "396-397",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L396-L397"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the LFO pages (LFO, LFO 2, LFO DEST); again for the next page. LFO has no layer.",
    "short_label": "LFO PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1115-1117",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1115-L1117"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "399-401",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L399-L401"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped (under 0.45 s, nothing else touched): opens the FX pages; again for the next page.",
    "short_label": "FX PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "677-679",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L677-L679"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "31-32",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L31-L32"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "402-408",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L402-L408"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the punch-in effects layer (its screen shows after 0.14 s).",
    "short_label": "PUNCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "31-32",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L31-L32"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped: opens the SEL pages (SEL, SEL 2); again for the next page.",
    "short_label": "SEL PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "703-705",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L703-L705"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "409-410",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L409-L410"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the key and chord layer.",
    "short_label": "KEY/CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped: opens the EDIT pages (EDIT 1, EDIT 2, FILTER on the ANALOG engine, VOICE, VOICE 2); again for the next page.",
    "short_label": "EDIT PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-698",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L698"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "411-416",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L411-L416"
     }
    ]
   },
   {
    "mode": "tracks",
    "gesture": "press",
    "action": "With the drum track selected, opens DRUMS on the last page used; turn SELECT fully left for GRID.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "9-11",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L9-L11"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "103-112",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L103-L112"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-689",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L689"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "530-535",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "460-461",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L460-L461"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Switches to the kit page.",
    "short_label": "KIT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "682-686",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L682-L686"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Switches from KIT to SOUND.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-685",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Clears the step under the cursor and moves to the next.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "691-696",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L691-L696"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the erase layer.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Switches from SOUND to the drum grid.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-685",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped: opens the arpeggiator pages (ARP, ARP 2); again for the next page.",
    "short_label": "ARP PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "700-702",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L700-L702"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the note-repeat layer (not the arpeggiator).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2002-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2002-L2005"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped: opens the SEQ pages (STEP, PATTERN, SONG); again for the next page.",
    "short_label": "SEQ PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-699",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L699"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "434-438",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L434-L438"
     }
    ]
   },
   {
    "mode": "tracks",
    "gesture": "press",
    "action": "With the drum track selected, opens DRUMS on the last page used; turn SELECT fully left for GRID.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "9-11",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L9-L11"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "103-112",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L103-L112"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-689",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L689"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "530-535",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "460-461",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L460-L461"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Switches to the kit page.",
    "short_label": "KIT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "682-686",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L682-L686"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Switches from KIT to SOUND.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-685",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Leaves the SONG screen for the SEQ pages.",
    "short_label": "SEQ PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "698",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L698"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-296",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L296"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the step-entry layer.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Switches from SOUND to the drum grid.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "680-685",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tapped: cycles GLOBAL, MASTER, SYSTEM, DRUMS, MIDI, MIDI 2, MIDI 3, TEXTURE and TEXTURE 2.",
    "short_label": "GLO PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "706-708",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L706-L708"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "280-324",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L280-L324"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "417-427",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L417-L427"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the mix layer.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "tracks",
    "gesture": "press",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "712-713",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L712-L713"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "714-715",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L714-L715"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "714-715",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L714-L715"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Saves the song order to flash (refused while playing: STOP BEFORE SAVE).",
    "short_label": "SAVE SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "710-711",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L710-L711"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "1077-1088",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L1077-L1088"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "press",
    "action": "Opens the SAVE pages (PRESETS, USER, SECTION, TOOLS); tap again for the next page.",
    "short_label": "SAVE PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "709-718",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L709-L718"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "428-431",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L428-L431"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the song layer.",
    "short_label": "SONG LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "748-827",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L748-L827"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "709-718",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L709-L718"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Moves the keyboard an octave down (range -3 to +3).",
    "short_label": "OCT -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1101-1111",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1101-L1111"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "press_with:button_oct_up",
    "action": "Both together: back to octave 0.",
    "short_label": "OCT 0",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1107",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1106-L1107"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "hold",
    "action": "While held, keys hit at ghost level.",
    "short_label": "GHOST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1700-1706",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1700-L1706"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1104-1105",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1104-L1105"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Every track's reverb send goes full while held (REV THROW); nothing is saved.",
    "short_label": "REV THROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "828-838",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L828-L838"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Undo, one level, for one track's notes, pattern length and nudges; parameter locks and fill conditions are not restored.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "839-850",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L839-L850"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "455-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L455-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "229-256",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L229-L256"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Steps to the previous page of 16 steps, wrapping round.",
    "short_label": "PAGE -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "852-867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L852-L867"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "hold",
    "action": "On the drum track, held before a roll key goes down: the roll plays ghost hits.",
    "short_label": "GHOST ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1700-1706",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1700-L1706"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "press_while_holding:button_seq",
    "action": "Clears the held steps' nudge, parameter locks and fill condition.",
    "short_label": "CLEAR EXTRA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "860-861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L860-L861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "261-281",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L261-L281"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Switches loop and song mode (only while stopped).",
    "short_label": "LOOP/SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "104-112",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L104-L112"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Closes the menu; from ABOUT, back to the section.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "314-320",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L314-L320"
     }
    ]
   },
   {
    "mode": "stopped",
    "gesture": "press_with:button_oct_up",
    "action": "Held together for 5 s while stopped: the screen counts down after 2 s, then your work is saved and the FM-1 enters update mode (UBOOT); releasing either button stops it.",
    "short_label": "UPDATE 5s",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "281-309",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L281-L309"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Moves the keyboard an octave up (range -3 to +3).",
    "short_label": "OCT +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1101-1111",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1101-L1111"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "press_with:button_oct_down",
    "action": "Both together: back to octave 0.",
    "short_label": "OCT 0",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1107",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1106-L1107"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "hold",
    "action": "While held, keys hit at hard level.",
    "short_label": "HARD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1700-1706",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1700-L1706"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1104-1105",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1104-L1105"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Every track's delay send goes full while held (ECHO THROW); nothing is saved.",
    "short_label": "ECHO THROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "828-838",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L828-L838"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Redo what undo took back.",
    "short_label": "REDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "839-850",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L839-L850"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "229-256",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L229-L256"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Steps to the next page of 16 steps, wrapping round.",
    "short_label": "PAGE +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "852-867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L852-L867"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "hold",
    "action": "On the drum track, held before a roll key goes down: the roll plays hard hits.",
    "short_label": "HARD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1700-1706",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1700-L1706"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "press_while_holding:button_seq",
    "action": "Cycles the held steps' fill condition: normal, fill only, no fill.",
    "short_label": "FILL COND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "862-863",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L862-L863"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "282-303",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L282-L303"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Pressed twice within 3 s (while stopped): loads the section of the entry under the cursor, replacing unsaved work.",
    "short_label": "LOAD x2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "113-122",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L113-L122"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Cycles the selected setting or opens calibration or ABOUT; on MIDI LEARN CLEAR it immediately deletes all learned CCs, without confirmation or undo, then saves when quiet; 2ND CORE OFF applies now, ON needs a power-on if the core is unavailable, and USB RATE needs a restart.",
    "short_label": "OK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "255-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L255-L301"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "826-834",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L826-L834"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down",
    "action": "Starts in USB rescue (audio off) so the firmware can be reinstalled from the browser.",
    "short_label": "USB RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/recovery.c",
      "lines": "41-70",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/recovery.c#L41-L70"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/bootguard.h",
      "lines": "27-30",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/bootguard.h#L27-L30"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "402-403",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L402-L403"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Starts hardware calibration: press each named button and turn each named knob right.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "244-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L244-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1173-1241",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1173-L1241"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1144-1148",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1144-L1148"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "301-325",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L301-L325"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Previous or next page of the same button, stopping at the ends.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "301-325",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L301-L325"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1144",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1144"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "turn",
    "action": "Inside a layer: sets the tempo. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1040-1044",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1040-L1044"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Sets the tempo the take records at. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1144-1148",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1144-L1148"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "turn",
    "action": "Next or previous visualiser style (12, round); the choice is kept.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1137-1143",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1137-L1143"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_vis.c",
      "lines": "647-654",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_vis.c#L647-L654"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Moves through GRID, KIT and SOUND, stopping at the ends.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "530-535",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Moves through GRID, KIT and SOUND, stopping at the ends.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "530-535",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Previous or next menu section, stopping at the ends.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "325-333",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L325-L333"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Does nothing on the SONG screen.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "152-153",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L152-L153"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Moves through GRID, KIT and SOUND, stopping at the ends.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "530-535",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L530-L535"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one. On the drum track, picks the kit.",
    "short_label": "SOUND/KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1125-1134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1125-L1134"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "563-588",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L563-L588"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "669-687",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L669-L687"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "739-753",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L739-L753"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "377-418",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L377-L418"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "276-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L276-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2943-2964",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2943-L2964"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "400-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L400-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "283-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L283-L301"
     }
    ]
   },
   {
    "mode": "save_pages",
    "gesture": "turn",
    "action": "On the PRESETS page: Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1125-1134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1125-L1134"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "563-588",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L563-L588"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "669-687",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L669-L687"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "739-753",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L739-L753"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "377-418",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L377-L418"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "276-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L276-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2943-2964",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2943-L2964"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "400-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L400-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "283-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L283-L301"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Ignored on the other pages so a stray turn cannot replace the sound being edited.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1125-1128",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1125-L1128"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "551",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L551"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "551",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L551"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Makes or moves a parameter lock on the held steps: the first click sets it one click from the track's value. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LOCK VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "475-480",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L475-L480"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "202-209",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L202-L209"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves the cursor round the section's rows.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "334-335",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L334-L335"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "551",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L551"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Selects track 1-4 on every screen; recording or an armed take follows it. It does nothing in the menu, on the SONG screen or while a free take runs; turns inside a layer are dropped.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1135-1136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1135-L1136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "776-787",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L776-L787"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1045-1046",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1045-L1046"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Selects the track; moving off the drum track goes back to TRACKS.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "544-550",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L544-L550"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Selects the track; moving off the drum track goes back to TRACKS.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "544-550",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L544-L550"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Picks which sound parameter the step lock acts on (the last one touched comes first).",
    "short_label": "LOCK PARAM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "481-484",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L481-L484"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "251-260",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L251-L260"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Selects the track; moving off the drum track goes back to TRACKS.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "544-550",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L544-L550"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Global swing for all tracks. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "289-319",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L289-L319"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets the value in this column of the page (empty column or DRUM TRACK: nothing). Wider numeric ranges move farther on fast turns with KNOB ACCEL on; named choices move one at a time. On ARP, MODE is OFF, UP, DN, UPDN, RND, ORD, REPEAT, DNUP, UP+8, CONV, DIVG, PINKY, THUMB, WALK or CHORD. On MIDI 3, sets FX CH (OFF or channel 1-16).",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "405-420",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L405-L420"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "466-475",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L466-L475"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "425",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L425"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "460-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L460-L477"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "38-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L38-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1211-1245",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1211-L1245"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1249-1340",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1249-L1340"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "321-369",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L321-L369"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Picks the drum sound (you hear it).",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "552-580",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L552-L580"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "598-603",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L598-L603"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Moves the cursor through the song entries.",
    "short_label": "ENTRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "135-151",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L135-L151"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Empty project only: free (no click, and your playing sets the tempo) or tempo (play against the tempo already set).",
    "short_label": "MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "875-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L875-L905"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take or count-in.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "turn",
    "action": "Does nothing while the visualiser shows.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1137-1143",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1137-L1143"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Master filter on one knob: turn left for low-pass, right for high-pass; the middle leaves the sound open. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "MASTER FILT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "493-502",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L493-L502"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Shifts the note or drum steps right or left by one position, while nudges, parameter locks and fill conditions stay at their old step positions.",
    "short_label": "SHIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "57-75",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L57-L75"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Roll rate: 1/8, 1/16, 1/32, 1/32 triplet, 1/64.",
    "short_label": "ROLL RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "511-514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L511-L514"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "Drums: the sound new steps get (you hear it); synths: the note new steps get.",
    "short_label": "SOUND/NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "515-537",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L515-L537"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Drums: which sound of the held step the next knobs edit; synths: moves the held steps' notes.",
    "short_label": "SOUND/NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "516-520",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L516-L520"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "183-248",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L183-L248"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn_while_holding:button_sel",
    "action": "For the selected synth track, the chord type: off, triad, 7th, 9th, sus4, power.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "538-553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L538-L553"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 1. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "554-558",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L554-L558"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "492-561",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L492-L561"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Sets the first row: COLOR (including your installed theme), LIGHTS, SPEAKER LOWCUT, or SYSTEM's 2ND CORE. For 2ND CORE, right ON and left OFF; enabling a core that did not start takes effect at the next power-on. If a second-core job runs late, another power-on is needed to use that core again.",
    "short_label": "SETTING 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "9-22",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L9-L22"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "222-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L222-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "334-343",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L334-L343"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/felucca.c",
      "lines": "40-42",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/felucca.c#L40-L42"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/cpu1.c",
      "lines": "18-28",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/cpu1.c#L18-L28"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one. The track's old sound and unsaved edits are replaced at once (no question, no undo).",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "422-426",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L422-L426"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "563-588",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L563-L588"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "669-687",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L669-L687"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "739-753",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L739-L753"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "377-418",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L377-L418"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "276-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L276-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2943-2964",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2943-L2964"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "400-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L400-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "283-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L283-L301"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Picks user slot 1-32.",
    "short_label": "USER SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "436-440",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L436-L440"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Picks section A-D.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "173",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L173"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "430",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L430"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "466-471",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L466-L471"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Clears the selected track's pattern (two clicks: the first shows AGAIN, the second within about 1.5 s acts); undo returns the notes, length and nudges, not locks or fills.",
    "short_label": "CLEAR PATT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "478-505",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L505"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "455-467",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L455-L467"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "230-257",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L230-L257"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Picks the drum sound and plays it.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "581-585",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L581-L585"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "90-97",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L90-L97"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "On the ARP page, selecting MODE ORD makes the arp follow the sequence of note presses even when ARP 2 ORD is NOTE.",
    "short_label": "ARP MODE ORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1211-1244",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1211-L1244"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "57",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L57"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "On ARP 2, SWG changes the arp timing while the transport is stopped as well as playing; rates without swing stay straight.",
    "short_label": "ARP SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1362-1396",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1362-L1396"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Level of the selected track; if it was muted, the first turn unmutes it. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "289-319",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L289-L319"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets the value in this column of the page (empty column or DRUM TRACK: nothing). Wider numeric ranges move farther on fast turns with KNOB ACCEL on; named choices move one at a time. On MIDI 3, DR MAP chooses GM mapping or the 1-16 pattern: note 36 starts at KICK, then the sixteen sounds repeat across the MIDI note range.",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "405-420",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L405-L420"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "466-475",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L466-L475"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "425",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L425"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "460-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L460-L477"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1420-1443",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1420-L1443"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Transposes the step's notes (an empty step gets your last note). Changed pitches start on this step instead of continuing from the one before.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "331-343",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L331-L343"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Steps the cursor through the pattern and plays the hits on that step.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "552-580",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L552-L580"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum track level.",
    "short_label": "DRUM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "598-603",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L598-L603"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Sets the entry's section A-D (stopped only).",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "135-151",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L135-L151"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "When recording at a tempo: the selected track's loop length, 1, 2 or 4 bars.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "875-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L875-L905"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take or count-in.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "turn",
    "action": "Does nothing while the visualiser shows.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1137-1143",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1137-L1143"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Master DUST (old sampler and vinyl colour). Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "DUST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "493-502",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L493-L502"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Right copies the note or drum steps into a second pass, up to 64 steps; left halves the length; nudges, parameter locks and fill conditions are not copied or moved.",
    "short_label": "LEN x2 / 1/2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "76-94",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L76-L94"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "511-514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L511-L514"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "The track's step division: 1/4, 1/8, 1/16, 1/32, 8T, 16T, 1/2, 1 bar or 2 bars.",
    "short_label": "DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "528-529",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L528-L529"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "44",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L44"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Drums: hit level ghost to hard; synths: step velocity 1-127. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL/VEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "516-520",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L516-L520"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "183-248",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L183-L248"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn_while_holding:button_sel",
    "action": "One scale for all three synth tracks, chosen from 16.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "538-553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L538-L553"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 2. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "554-558",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L554-L558"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "492-561",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L492-L561"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Sets the second row: ZOOM, KEYS or USB AUDIO. In SYSTEM it selects HARDWARE CALIBRATION; OCT+ opens it.",
    "short_label": "SETTING 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "9-22",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L9-L22"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "222-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L222-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "334-343",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L334-L343"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/felucca.c",
      "lines": "40-42",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/felucca.c#L40-L42"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Right: next engine, left: previous; loads that engine's first sound at once (no question, no undo). A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "427-428",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L427-L428"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "427-462",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L427-L462"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "377-418",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L377-L418"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2943-2964",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2943-L2964"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "400-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L400-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "283-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L283-L301"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Loads the slot's sound onto the track (two clicks: the first shows AGAIN, the second within about 1.5 s acts); the track's sound and unsaved edits are replaced, no undo. A running arp keeps its settings and notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "434-451",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L434-L451"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "276-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L276-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "336-365",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L336-L365"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2943-2964",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2943-L2964"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "400-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L400-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "283-301",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L283-L301"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Erases the chosen section after two rightward clicks within about 1.5 s, while stopped; its song-order entries are deleted too, or the default order is made if none remain; saving the section again does not restore the removed entries; no undo.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "453-465",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L453-L465"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "604-630",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L604-L630"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/arranger.h",
      "lines": "70-85",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/arranger.h#L70-L85"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Resets the track's sound to its engine's first preset (two clicks: the first shows AGAIN, the second within about 1.5 s acts); no undo.",
    "short_label": "INIT SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "506-511",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L506-L511"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Tunes this drum sound from -8 to +7 semitones; while stopped, each change plays it.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "587-595",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L587-L595"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "90-97",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L90-L97"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "The selected track's pattern length in steps. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "289-319",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L289-L319"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets the value in this column of the page (empty column or DRUM TRACK: nothing). Wider numeric ranges move farther on fast turns with KNOB ACCEL on; named choices move one at a time. On ARP 2, HOLD with MODE OFF holds synth notes after release; with the arp on it holds its note pool. On MIDI 3, REMOTE is OFF or channel 1-16 for MIDI button control. REMOTE uses CC 102 FX, 103 SEL, 104 ENV, 105 LFO, 106 EDIT, 107 GLO, 108 HOME, 109 SAVE, 110 ARP, 111 SEQ, 112 PLAY, 113 REC, 114 OCT-, 115 OCT+. Values 64-127 hold and 0-63 release. Unplugging TRS does not release a held button; send its release, set REMOTE OFF or change its channel. USB disconnection clears remote buttons. A stuck REC can clear a track.",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "405-420",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L405-L420"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "466-475",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L466-L475"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "425",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L425"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "460-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L460-L477"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1460",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1460"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1504-1539",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1504-L1539"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2969-2978",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2969-L2978"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1424-1438",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1424-L1438"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "964-991",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L964-L991"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "928-949",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L928-L949"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Empty step: NOTE, TIE or REST; on a note: how many steps it lasts (LEN).",
    "short_label": "TIME/LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "321-369",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L321-L369"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Right adds a hit of the sound on the step; left removes it.",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "552-580",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L552-L580"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum reverb send.",
    "short_label": "DRUM REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "598-603",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L598-L603"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Sets the entry's length, 1-64 bars (stopped only).",
    "short_label": "BARS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "135-151",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L135-L151"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "When recording at a tempo: note (your first note starts it) or count (PLAY clicks one bar first).",
    "short_label": "START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "875-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L875-L905"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take or count-in.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "turn",
    "action": "Does nothing while the visualiser shows.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1137-1143",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1137-L1143"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Master DUCK (the kick pumps the synth tracks). Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "DUCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "493-502",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L493-L502"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Moves every note a semitone up or down (synth tracks).",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "503-510",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L503-L510"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "57-106",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L57-L106"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "511-514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L511-L514"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "The track's own swing, added to the global one. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "515-537",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L515-L537"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Repeats inside the step, x1 to x4.",
    "short_label": "RATCHET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "516-520",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L516-L520"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "183-248",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L183-L248"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn_while_holding:button_sel",
    "action": "KEYS of the selected track: off, snap, white.",
    "short_label": "KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "538-553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L538-L553"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 3. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "554-558",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L554-L558"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "492-561",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L492-L561"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Sets the third row: KNOB ACCEL (right ON, left OFF), NOTES or USB RATE (AUTO, 44.1 or 48 kHz; takes effect next start). In SYSTEM it selects MIDI LEARN CLEAR; OCT+ clears it.",
    "short_label": "SETTING 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "9-22",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L9-L22"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "222-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L222-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "334-343",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L334-L343"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/felucca.c",
      "lines": "40-42",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/felucca.c#L40-L42"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "422-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L422-L433"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Erases the slot (two clicks: the first shows AGAIN, the second within about 1.5 s acts); stopped only, no undo.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "441-451",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L441-L451"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "350-365",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L350-L365"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Loads the section over the working project (two clicks: the first shows AGAIN, the second within about 1.5 s acts); stopped only, no undo.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "478-493",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L493"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "653-669",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L653-L669"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "431",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L431"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Sets decay from -4 to +3 on synthesised kits and SYN1-4; sampled kits only shorten at -4 to -1, with +1 to +3 leaving the original decay; 0 leaves either kind unchanged; changes audition the sound while stopped.",
    "short_label": "DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "587-595",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L587-L595"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "344-345",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L344-L345"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drum_synth.c",
      "lines": "123-160",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drum_synth.c#L123-L160"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "The selected track's pan. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "289-319",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L289-L319"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets the value in this column of the page (empty column or DRUM TRACK: nothing). Wider numeric ranges move farther on fast turns with KNOB ACCEL on; named choices move one at a time. On MIDI 3, CLOCK chooses OFF or OUT for USB MIDI clock and start/stop only while SYNC is INT.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "405-420",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L405-L420"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "466-475",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L466-L475"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "425",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L425"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/params.c",
      "lines": "460-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L460-L477"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "2798-2819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2798-L2819"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Step flag: none, accent, slide, or both.",
    "short_label": "FLAG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "321-369",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L321-L369"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Steps the hit's level: ghost, soft, normal, hard.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "552-580",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L552-L580"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum track pan.",
    "short_label": "DRUM PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "598-603",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L598-L603"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Sets how many entries the song has, 1-16 (stopped only).",
    "short_label": "SONG LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "135-151",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L135-L151"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "QUANT: right ON, left OFF. OFF keeps played timing as a step nudge; later notes sharing that step use its first nudge. Arps and rolls stay on their grid. The choice is kept.",
    "short_label": "QUANT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "901-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L901-L905"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "495-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L495-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "108-111",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L108-L111"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take or count-in.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "turn",
    "action": "Does nothing while the visualiser shows.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1137-1143",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1137-L1143"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "A filter for the selected track alone, set the same way as the master one. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "TRACK FILT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "493-502",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L493-L502"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Does nothing.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "503-510",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L503-L510"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "57-106",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L57-L106"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "511-514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L511-L514"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "The track's length, 1-64 steps. Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "515-537",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L515-L537"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Shifts the held steps off the grid: up to 32/64 of a step early or 31/64 late.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "516-520",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L516-L520"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "183-248",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L183-L248"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn_while_holding:button_sel",
    "action": "Transposes the selected track, plus or minus 24 semitones.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "538-553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L538-L553"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 4 (the drum level). Fast turns move farther on wider value ranges with KNOB ACCEL on.",
    "short_label": "LEVEL T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "554-558",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L554-L558"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "258-284",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L258-L284"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "492-561",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L492-L561"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "In SYSTEM, selects ABOUT; OCT+ opens it. No fourth row in the other sections of the supplied FM-1 build.",
    "short_label": "ABOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "9-22",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L9-L22"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "222-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L222-L305"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "334-343",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L334-L343"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/felucca.c",
      "lines": "40-42",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/felucca.c#L40-L42"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Right adds this sound to the favourite list and left removes it, up to 16; each entry points to a factory preset or user slot and does not save sound edits; a favourite edit alone is lost at power-off unless another settings write occurs, so close the HOME menu while stopped to keep it.",
    "short_label": "FAV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "590-641",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L590-L641"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "975-989",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L975-L989"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "1173-1181",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L1173-L1181"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "210-219",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L210-L219"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Saves the track's sound into the slot (two clicks: the first shows AGAIN, the second within about 1.5 s acts); over a used slot there is no further question; stopped only. If flash is unavailable, NO FLASH means the sound was not retained in a user slot, even for this session.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "441-451",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L441-L451"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "350-365",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L350-L365"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/upreset.c",
      "lines": "355-365",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/upreset.c#L355-L365"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Saves the working project into the section (two clicks: the first shows AGAIN, the second within about 1.5 s acts); over a used slot there is no further question; stopped only.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "478-497",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L497"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/project.c",
      "lines": "581-598",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L581-L598"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Starts a new working loop (two clicks: the first shows AGAIN, the second within about 1.5 s acts): default sounds, empty patterns, default tempo and drum tuning/decay reset. Stored sections A-D stay. Undo brings back one track's notes, length and nudges; locks, fills and sound changes stay lost. Stop song playback first.",
    "short_label": "NEW LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "372-403",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L372-L403"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "478-484",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L484"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "512-522",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L512-L522"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "455-467",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L455-L467"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "230-257",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L230-L257"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "turn",
    "action": "Sets drum track volume, shown from 0 to 100 on the dial.",
    "short_label": "DRUM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "430-441",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L430-L441"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "597",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L597"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Output volume for headphones and line out; the USB audio input follows it unless the menu sets USB AUDIO to FULL. The visualiser ignores it. If the editor's LIVE page set the volume, moving MASTER far enough takes control back.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "264-279",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L264-L279"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/fx.c",
      "lines": "1218-1250",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/fx.c#L1218-L1250"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/audio.c",
      "lines": "33",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/audio.c#L33"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_vis.c",
      "lines": "7-8",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_vis.c#L7-L8"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's IV chord an octave down (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD IV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Loops the last quarter note, in time. The effect lasts while the key is held.",
    "short_label": "LOOP 1/4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or KICK (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes KICK in the sequencer without erasing it.",
    "short_label": "MUTE KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 1 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F for all three synth tracks.",
    "short_label": "KEY F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 1.",
    "short_label": "MUTE T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Playing: section A from the next bar; stopped: loads A as the loop; several section keys in one SAVE hold make a looping chain.",
    "short_label": "PLAY A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 1 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays KICK and selects it for TUNE and DECAY.",
    "short_label": "PICK KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F#3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK, the same sound as the white key to its left.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, flips the chords you play between major and minor (pressed during a chord, it changes under your finger).",
    "short_label": "MAJ/MIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Removes the lows. The effect lasts while the key is held.",
    "short_label": "KILL LOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Shows steps 1-16 (if the track is that long).",
    "short_label": "PAGE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "343-347",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L343-L347"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F# for all three synth tracks.",
    "short_label": "KEY F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Turns MIDI LEARN on or off: turn a SLOOP knob, then move a controller knob to link them.",
    "short_label": "MIDI LEARN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "421-422",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "835-862",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L835-L862"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Shows steps 1-16 of the grid.",
    "short_label": "PAGE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "471-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L471-L477"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays KICK and selects it for TUNE and DECAY.",
    "short_label": "PICK KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays G3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK 2.",
    "short_label": "KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's V chord an octave down (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD V",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Loops the last eighth note, in time. The effect lasts while the key is held.",
    "short_label": "LOOP 1/8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or KICK 2 (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes KICK 2 in the sequencer without erasing it.",
    "short_label": "MUTE KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 2 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to G for all three synth tracks.",
    "short_label": "KEY G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 2.",
    "short_label": "MUTE T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Playing: section B from the next bar; stopped: loads B as the loop; several in one hold make a chain.",
    "short_label": "PLAY B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 2 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays KICK 2 and selects it for TUNE and DECAY.",
    "short_label": "PICK KICK2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays G#3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK 2, the same sound as the white key to its left.",
    "short_label": "KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, adds the 7th from the scale (pressed during a chord, it changes under your finger).",
    "short_label": "ADD 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Removes the mids. The effect lasts while the key is held.",
    "short_label": "KILL MID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Shows steps 17-32 (if the track is that long).",
    "short_label": "PAGE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "343-347",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L343-L347"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to G# for all three synth tracks.",
    "short_label": "KEY G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Shows steps 17-32 of the grid.",
    "short_label": "PAGE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "471-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L471-L477"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays KICK 2 and selects it for TUNE and DECAY.",
    "short_label": "PICK KICK2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays A3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's VI chord an octave down (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD VI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Loops the last sixteenth, in time. The effect lasts while the key is held.",
    "short_label": "LOOP 1/16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or SNARE (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes SNARE in the sequencer without erasing it.",
    "short_label": "MUTE SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 3 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to A for all three synth tracks.",
    "short_label": "KEY A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 3.",
    "short_label": "MUTE T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Playing: section C from the next bar; stopped: loads C as the loop; several in one hold make a chain.",
    "short_label": "PLAY C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 3 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays SNARE and selects it for TUNE and DECAY.",
    "short_label": "PICK SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays A#3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE, the same sound as the white key to its left.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, turns the chords into sus4 (pressed during a chord, it changes under your finger).",
    "short_label": "SUS4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Removes the highs. The effect lasts while the key is held.",
    "short_label": "KILL HIGH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Shows steps 33-48 (if the track is that long).",
    "short_label": "PAGE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "343-347",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L343-L347"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to A# for all three synth tracks.",
    "short_label": "KEY A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Shows steps 33-48 of the grid.",
    "short_label": "PAGE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "471-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L471-L477"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays SNARE and selects it for TUNE and DECAY.",
    "short_label": "PICK SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays B3 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CLAP.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's VII chord an octave down (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD VII",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Loops the last 1/32, in time. The effect lasts while the key is held.",
    "short_label": "LOOP 1/32",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or CLAP (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes CLAP in the sequencer without erasing it.",
    "short_label": "MUTE CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 4 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to B for all three synth tracks.",
    "short_label": "KEY B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes the drum track.",
    "short_label": "MUTE T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Playing: section D from the next bar; stopped: loads D as the loop; several in one hold make a chain.",
    "short_label": "PLAY D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 4 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays CLAP and selects it for TUNE and DECAY.",
    "short_label": "PICK CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays C4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays HAT.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's I chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD I",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Stutters in 1/16 triplets. The effect lasts while the key is held.",
    "short_label": "STUTTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or HAT (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes HAT in the sequencer without erasing it.",
    "short_label": "MUTE HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 5 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to C for all three synth tracks.",
    "short_label": "KEY C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 1 (solos add up).",
    "short_label": "SOLO T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop into section A (if it already holds music, press the key a second time within 3 s).",
    "short_label": "STORE A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 5 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays HAT and selects it for TUNE and DECAY.",
    "short_label": "PICK HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays C#4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays HAT, the same sound as the white key to its left.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, adds the 9th from the scale (pressed during a chord, it changes under your finger).",
    "short_label": "ADD 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Spins the last moment backwards, then silence until released. The effect lasts while the key is held.",
    "short_label": "REWIND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Shows steps 49-64 (if the track is that long).",
    "short_label": "PAGE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "343-347",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L343-L347"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to C# for all three synth tracks.",
    "short_label": "KEY C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Shows steps 49-64 of the grid.",
    "short_label": "PAGE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "471-477",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L471-L477"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays HAT and selects it for TUNE and DECAY.",
    "short_label": "PICK HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays D4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays OPEN HAT.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's II chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD II",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Plays the mix backwards. The effect lasts while the key is held.",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or OPEN HAT (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes OPEN HAT in the sequencer without erasing it.",
    "short_label": "MUTE OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 6 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to D for all three synth tracks.",
    "short_label": "KEY D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 2 (solos add up).",
    "short_label": "SOLO T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop into section B (if it already holds music, press the key a second time within 3 s).",
    "short_label": "STORE B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 6 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays OPEN HAT and selects it for TUNE and DECAY.",
    "short_label": "PICK OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays D#4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays OPEN HAT, the same sound as the white key to its left.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, inverts the chords (pressed during a chord, it changes under your finger).",
    "short_label": "INVERT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Pitches the mix up an octave. The effect lasts while the key is held.",
    "short_label": "OCT UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to D# for all three synth tracks.",
    "short_label": "KEY D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays OPEN HAT and selects it for TUNE and DECAY.",
    "short_label": "PICK OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays E4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays PEDAL (the pedal hi-hat).",
    "short_label": "PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's III chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD III",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Slows the mix to a stop like a tape. The effect lasts while the key is held.",
    "short_label": "TAPE STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or PEDAL (the pedal hi-hat) (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes PEDAL (the pedal hi-hat) in the sequencer without erasing it.",
    "short_label": "MUTE PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 7 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to E for all three synth tracks.",
    "short_label": "KEY E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 3 (solos add up).",
    "short_label": "SOLO T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop into section C (if it already holds music, press the key a second time within 3 s).",
    "short_label": "STORE C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 7 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays PEDAL (the pedal hi-hat) and selects it for TUNE and DECAY.",
    "short_label": "PICK PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIM.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's IV chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD IV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Plays the mix at half speed. The effect lasts while the key is held.",
    "short_label": "HALF SPEED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or RIM (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes RIM in the sequencer without erasing it.",
    "short_label": "MUTE RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 8 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F for all three synth tracks.",
    "short_label": "KEY F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos the drum track (solos add up).",
    "short_label": "SOLO T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop into section D (if it already holds music, press the key a second time within 3 s).",
    "short_label": "STORE D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 8 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays RIM and selects it for TUNE and DECAY.",
    "short_label": "PICK RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F#4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIM, the same sound as the white key to its left.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, flips the chords you play between major and minor (pressed during a chord, it changes under your finger).",
    "short_label": "MAJ/MIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Sweeps a flanger over the mix. The effect lasts while the key is held.",
    "short_label": "FLANGER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F# for all three synth tracks.",
    "short_label": "KEY F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays RIM and selects it for TUNE and DECAY.",
    "short_label": "PICK RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays G4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE 2.",
    "short_label": "SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's V chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD V",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Sweeps a low-pass filter over the mix. The effect lasts while the key is held.",
    "short_label": "LP SWEEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or SNARE 2 (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes SNARE 2 in the sequencer without erasing it.",
    "short_label": "MUTE SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 9 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to G for all three synth tracks.",
    "short_label": "KEY G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "A fill plays while this key stays down.",
    "short_label": "FILL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 9 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays SNARE 2 and selects it for TUNE and DECAY.",
    "short_label": "PICK SNARE2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays G#4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE 2, the same sound as the white key to its left.",
    "short_label": "SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, adds the 7th from the scale (pressed during a chord, it changes under your finger).",
    "short_label": "ADD 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Pans the mix left and right once a beat. The effect lasts while the key is held.",
    "short_label": "AUTO-PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to G# for all three synth tracks.",
    "short_label": "KEY G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays SNARE 2 and selects it for TUNE and DECAY.",
    "short_label": "PICK SNARE2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays A4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays LOW TOM.",
    "short_label": "LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's VI chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD VI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Sweeps a high-pass filter over the mix. The effect lasts while the key is held.",
    "short_label": "HP SWEEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or LOW TOM (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes LOW TOM in the sequencer without erasing it.",
    "short_label": "MUTE LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 10 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to A for all three synth tracks.",
    "short_label": "KEY A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Makes the whole next bar a fill; again before then cancels.",
    "short_label": "FILL BAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 10 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays LOW TOM and selects it for TUNE and DECAY.",
    "short_label": "PICK TOM L",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays A#4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays LOW TOM, the same sound as the white key to its left.",
    "short_label": "LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, turns the chords into sus4 (pressed during a chord, it changes under your finger).",
    "short_label": "SUS4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Holds the mix in the reverb while held. The effect lasts while the key is held.",
    "short_label": "FREEZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to A# for all three synth tracks.",
    "short_label": "KEY A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays LOW TOM and selects it for TUNE and DECAY.",
    "short_label": "PICK TOM L",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays B4 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays HI TOM.",
    "short_label": "HI TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's VII chord (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD VII",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Squeezes the mix into a phone-speaker band. The effect lasts while the key is held.",
    "short_label": "PHONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or HI TOM (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes HI TOM in the sequencer without erasing it.",
    "short_label": "MUTE HI TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 11 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to B for all three synth tracks.",
    "short_label": "KEY B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 11 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays HI TOM and selects it for TUNE and DECAY.",
    "short_label": "PICK TOM H",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays C5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CRASH.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's I chord an octave up (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD I",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Crushes the mix to fewer bits. The effect lasts while the key is held.",
    "short_label": "BIT CRUSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or CRASH (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes CRASH in the sequencer without erasing it.",
    "short_label": "MUTE CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 12 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to C for all three synth tracks.",
    "short_label": "KEY C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 12 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays CRASH and selects it for TUNE and DECAY.",
    "short_label": "PICK CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays C#5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CRASH, the same sound as the white key to its left.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, adds the 9th from the scale (pressed during a chord, it changes under your finger).",
    "short_label": "ADD 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Loops an eighth-note triplet. The effect lasts while the key is held.",
    "short_label": "LOOP 1/8T",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to C# for all three synth tracks.",
    "short_label": "KEY C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays CRASH and selects it for TUNE and DECAY.",
    "short_label": "PICK CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays D5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIDE.",
    "short_label": "RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's II chord an octave up (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD II",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Drops the sample rate for aliasing. The effect lasts while the key is held.",
    "short_label": "ALIAS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or RIDE (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes RIDE in the sequencer without erasing it.",
    "short_label": "MUTE RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 13 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to D for all three synth tracks.",
    "short_label": "KEY D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Switches loop mode and song mode.",
    "short_label": "LOOP/SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 13 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays RIDE and selects it for TUNE and DECAY.",
    "short_label": "PICK RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays D#5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIDE, the same sound as the white key to its left.",
    "short_label": "RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, inverts the chords (pressed during a chord, it changes under your finger).",
    "short_label": "INVERT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Folds the mix to mono. The effect lasts while the key is held.",
    "short_label": "MONO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to D# for all three synth tracks.",
    "short_label": "KEY D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays RIDE and selects it for TUNE and DECAY.",
    "short_label": "PICK RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays E5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SHAKER.",
    "short_label": "SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's III chord an octave up (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD III",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Chops the mix in 1/16 gates. The effect lasts while the key is held.",
    "short_label": "GATE 1/16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or SHAKER (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes SHAKER in the sequencer without erasing it.",
    "short_label": "MUTE SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 14 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to E for all three synth tracks.",
    "short_label": "KEY E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Records the sections you play, from the next bar, into the song; again to stop.",
    "short_label": "SONG REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 14 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays SHAKER and selects it for TUNE and DECAY.",
    "short_label": "PICK SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CONGA.",
    "short_label": "CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's IV chord an octave up (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD IV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Adds a dotted-1/8 echo. The effect lasts while the key is held.",
    "short_label": "ECHO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or CONGA (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes CONGA in the sequencer without erasing it.",
    "short_label": "MUTE CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 15 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F for all three synth tracks.",
    "short_label": "KEY F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 15 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays CONGA and selects it for TUNE and DECAY.",
    "short_label": "PICK CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays F#5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CONGA, the same sound as the white key to its left.",
    "short_label": "CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "hold",
    "action": "While held, flips the chords you play between major and minor (pressed during a chord, it changes under your finger).",
    "short_label": "MAJ/MIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "285-300",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L285-L300"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Fades the mix out over two beats. The effect lasts while the key is held.",
    "short_label": "FADE OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Drum track: toggles erase or mute for the white keys, keeping that choice after EDIT is released; synth track: erases this key's note unless chord mode or WHITE keys makes it silent.",
    "short_label": "ERASE/MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1811-1818",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1811-L1818"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1832-1842",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1832-L1842"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1996-2005",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1996-L2005"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released; on a synth track with chord mode on or KEYS set to WHITE the black keys are silent, so nothing repeats.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-214",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to F# for all three synth tracks.",
    "short_label": "KEY F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-650",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L650"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "199-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L199-L235"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1719-1757",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1719-L1757"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1875",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1875"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1514",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1514"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1927-1929",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1927-L1929"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays CONGA and selects it for TUNE and DECAY.",
    "short_label": "PICK CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "synth_play",
    "gesture": "press",
    "action": "Plays G5 on the selected synth track, moved by the octave buttons and transpose.",
    "short_label": "G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "236-249",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L236-L249"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays COWBELL.",
    "short_label": "COWBELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "72-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale's V chord an octave up (counting from C4 as I, in a seven-note scale).",
    "short_label": "CHORD V",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "210-235",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L210-L235"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "251-283",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L251-L283"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1884-1892",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1884-L1892"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Wobbles the pitch like worn tape. The effect lasts while the key is held.",
    "short_label": "WOBBLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "12-21",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L12-L21"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "440-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L440-L466"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/punch.c",
      "lines": "65-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/punch.c#L65-L71"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1794-1802",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1794-L1802"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this key's note (synth, with its chord in chord mode) or COWBELL (drums): playing, from each step that passes while held; stopped, from the whole pattern.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1820-1843",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1820-L1843"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1139-1149",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1139-L1149"
     }
    ]
   },
   {
    "mode": "layer_erase_mute",
    "gesture": "press_while_holding:button_edit",
    "action": "Mutes or unmutes COWBELL in the sequencer without erasing it.",
    "short_label": "MUTE COWBELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1816-1819",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1816-L1819"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "press_while_holding:button_arp",
    "action": "Repeats this key's note or drum sound in time at the roll rate until released (a single note, even in chord mode).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1857-1861",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1857-L1861"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1877-1883",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1877-L1883"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1603-1656",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1603-L1656"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1658-1666",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1658-L1666"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1937-1940",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1937-L1940"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 16 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "117-170",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L117-L170"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the song key to G for all three synth tracks.",
    "short_label": "KEY G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "352-358",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L352-L358"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Tap tempo (two taps or more).",
    "short_label": "TAP TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "420-435",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L420-L435"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-323",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L306-L323"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Opens the SONG screen.",
    "short_label": "SONG SCREEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-419",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L359-L419"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "443-455",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L443-L455"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Sets or clears step 16 of this page for the sound KNOB 1 picked (you hear it when set).",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "465-504",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L465-L504"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1847-1852",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1847-L1852"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key's note (or chord) into the step under the cursor; let go of all keys to move on.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "606-651",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L606-L651"
     }
    ]
   },
   {
    "mode": "keyboard_hold",
    "gesture": "press",
    "action": "Keeps this key's note or chord sounding after release; add notes while keys are down, or release them all and play again to replace the held notes.",
    "short_label": "KBD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1452-1486",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1452-L1486"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1545",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1545"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1868-1903",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1903"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "press",
    "action": "Plays COWBELL and selects it for TUNE and DECAY.",
    "short_label": "PICK BELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "76-82",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L76-L82"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/drums.c",
      "lines": "113-120",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/drums.c#L113-L120"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1853-1867",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1853-L1867"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "536-543",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L536-L543"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
    "short_label": "LOOP RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "1993-2001",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L1993-L2001"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "web/editor.html",
      "lines": "2020-2027",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2020-L2027"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "82-104",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L82-L104"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "116-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L116-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "173-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L173-L190"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1942-1953",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1942-L1953"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1529-1553",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1529-L1553"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "464-499",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L464-L499"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/voice.c",
      "lines": "684-690",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/voice.c#L684-L690"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "130-136",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L130-L136"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/eng_sample.c",
      "lines": "177-190",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L177-L190"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "press",
    "action": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
    "short_label": "OVERDUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "1503-1526",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1503-L1526"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "541-572",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L541-L572"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/seq.c",
      "lines": "588-626",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L588-L626"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "tracks",
    "gesture": "shows",
    "action": "Tempo and transport on top; each track as a row with its sound, 16 steps, playhead, rec, solo or mute badge and level; dials for swing, level, steps, pan.",
    "short_label": "TRACKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "199-218",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L199-L218"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "227-262",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L227-L262"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "264-280",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L264-L280"
     }
    ]
   },
   {
    "mode": "visualiser",
    "gesture": "shows",
    "action": "One of 12 full-screen styles (oscilloscope, spectrum, spectrogram, Lissajous, VU meters, circle, tape, LCD, bounce, orbit, wires, the SLOOP logo); the style's name shows briefly.",
    "short_label": "VISUALISER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_vis.c",
      "lines": "1-13",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_vis.c#L1-L13"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "1063-1074",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L1063-L1074"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "shows",
    "action": "The page's four values, its graph if any, the engine and sound, and the page number within its family; separate SONG and DRUMS screens do not count toward that number.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "763-805",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L763-L805"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "837-853",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L837-L853"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "855-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L855-L905"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "shows",
    "action": "The four step values, and a small piano roll of 16 steps: notes by pitch, ties as lines, accents in white, slides slanted, the cursor marked.",
    "short_label": "STEP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "250-295",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L250-L295"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "812-836",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L812-L836"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "shows",
    "action": "16 sounds by 16 steps, hit levels as shades, ratchets as notches, the cursor framed; dials sound, step, hit, level.",
    "short_label": "DRUM GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "373-395",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L373-L395"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "418-429",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L418-L429"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "shows",
    "action": "16 pads that flash on each hit; dials kit, level, reverb, pan.",
    "short_label": "DRUM KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "396-409",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L396-L409"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "442-451",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L442-L451"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "shows",
    "action": "The song entries with their section, bar length and play position, loop or song mode, and a key reminder line.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_song.c",
      "lines": "18-85",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L18-L85"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "shows",
    "action": "Shows the next recording action, four tracks with the armed track framed, and MODE, LENGTH, START and QUANT dials when those choices apply.",
    "short_label": "REC READY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "717-770",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L717-L770"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "625-657",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L625-L657"
     }
    ]
   },
   {
    "mode": "count_in",
    "gesture": "shows",
    "action": "A big 4-3-2-1 countdown.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "727-732",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L727-L732"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "shows",
    "action": "Seconds played, the loop length and tempo it would make now, and a reminder to press REC on the 1.",
    "short_label": "FREE TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "680-714",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L680-L714"
     }
    ]
   },
   {
    "mode": "hold_clear",
    "gesture": "shows",
    "action": "A red ring filling around the word clear and the track number; keep holding to clear.",
    "short_label": "CLEAR RING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "1031-1070",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L1031-L1070"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "shows",
    "action": "All 27 keys drawn as a keyboard of effect tiles (the held one white) and the four knob dials.",
    "short_label": "PUNCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "614-649",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L614-L649"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "705-734",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L705-L734"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "shows",
    "action": "16 tiles naming each key's note or drum sound, red while held, and the undo or redo hint.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "735-787",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L735-L787"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "shows",
    "action": "16 step tiles (level shades, ratchet marks, a dot for nudge or lock, F or x for fill conditions), the page number and the dials; with a step held, its lock in the title.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "789-891",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L789-L891"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "shows",
    "action": "16 tiles with each white key's note, or its chord name in chord mode, the root lit, and the key and scale in the title.",
    "short_label": "KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "892-932",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L892-L932"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "shows",
    "action": "Mute 1-4, solo 1-4, fill, bar and the tempo tile, with the four level dials.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "933-968",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L933-L968"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "shows",
    "action": "Sections A-D (playing lit, next framed), store A-D, loop or song, rec; the title shows a chain being built.",
    "short_label": "SONG LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "969-1010",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L969-L1010"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "shows",
    "action": "The layer's screen with a LOCK badge in the title.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "651-668",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L651-L668"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Shows section tabs and each setting with its knob; SYSTEM uses the fourth row for ABOUT instead of the key reminder, USB settings can show RESTART, and an unavailable second core shows NOT RUNNING.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "153-198",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L153-L198"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "shows",
    "action": "Shows version, build date, credits, source and supply voltages, plus 2 CORES, 1 CORE or C1 OFF; if the second core misses its deadline, SLOOP uses one core until another power-on.",
    "short_label": "ABOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_menu.c",
      "lines": "125-146",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L125-L146"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/cpu1.c",
      "lines": "18-28",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/cpu1.c#L18-L28"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/cpu1.c",
      "lines": "43-71",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/cpu1.c#L43-L71"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "action": "Names each button to press, then each knob to turn right.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "1176-1230",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1176-L1230"
     }
    ]
   },
   {
    "mode": "usb_rescue",
    "gesture": "shows",
    "action": "SLOOP USB RESCUE, a prompt to open the installer, and AUDIO OFF.",
    "short_label": "RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/recovery.c",
      "lines": "60-67",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/recovery.c#L60-L67"
     }
    ]
   },
   {
    "mode": "update_countdown",
    "gesture": "shows",
    "action": "UPDATE MODE IN 3, 2, 1 in the title, then UBOOT.",
    "short_label": "UPDATE IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "291-305",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L291-L305"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Short messages replace the title line for a moment (KEY D, ERASED, AGAIN: SAVE, NEXT: B, LEARN, and so on).",
    "short_label": "MESSAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "107-117",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L107-L117"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "53-56",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L53-L56"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "shows",
    "action": "The sound list begins with favourites; FAV shows whether the current sound is included.",
    "short_label": "PRESETS FAV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-424",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L397-L424"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-905",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L897-L905"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui.c",
      "lines": "670-686",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L670-L686"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "shows",
    "action": "Sections A-D are shown as used or empty, with the selected section marked.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_draw.c",
      "lines": "447-466",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_draw.c#L447-L466"
     }
    ]
   },
   {
    "mode": "drums_sound",
    "gesture": "shows",
    "action": "Sixteen pads show hits, the selected sound is framed, edited sounds are marked, and the dials show sound, tune, decay and level.",
    "short_label": "DRUM SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_studio.c",
      "lines": "393-441",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_studio.c#L393-L441"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "A fault screen shows the fault and stack address with second-core status and late-job count for 10 seconds before restarting.",
    "short_label": "FAULT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/main.c",
      "lines": "126-163",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L126-L163"
     }
    ]
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "Updating from SLOOP 2.6 keeps the song, working loop, user sounds, samples, SYN kits and settings. Projects still use FUN6, and the new drum TUNE and DECAY travel with each section. The extra theme and favourite data share the settings sectors; they do not claim a new flash area. From the flash atlas (generated): install (loader): SLOOP's update loader writes the program area sector by sector, rewriting only sectors that differ, and verifies each; the flash head (SPL, isd_config) is never written. Nothing is erased before the package's key check (a SLOOP package installed through the update path; refuses to write anything on another flash chip). install (loader): After the write and the host's 'success', the loader erases every 4 KiB sector in 0x93000-0xFBFFF whose last 256 bytes hold a valid update record (rd16 at +6 == 0x5441 and a matching CRC16). Unlike Felucca 1.6's and JIANT's loaders, SLOOP's does NOT skip the data area 0x97000-0xDFFFF (only sectors with a valid update record at offset 0xF00; in practice the staging record sector 0xE4000 (Felucca-family updaters write their record at 0xE4F00)). install (loader): On a first install from the official firmware, the stock update record is expected at 0xE8F00, so the record drop above erases sector 0xE8000 (inside SLOOP's later USR4 range, and Melodee's shared U055-U072 copy B) (only if the stock updater left its record there; the 0xE8F00 location comes from Felucca/JIANT source comments, not from SLOOP's code or the closed stock firmware) [reported]. update: Leaving SLOOP through an update (installer or M-UPGRADE upgrade command, also from USB RESCUE): SLOOP erases the five staging sectors, stages the package's update loader at 0xE0000, then writes the UPDATA_PARM record at 0xE4F00 only after the host confirms 'success'; any failure erases the staging area again. In normal mode it first flushes RAM-only work (sections, pending settings/song, the working project) (an upgrade command from the host; the staged loader must be the official one matching SLOOP's head or a FELUCCA-LOADER-1). update: UPDATE MODE (OCT- + OCT+ held 5 s while stopped, which then enters the chip's USB update mode), the host's UBOOT SysEx and the upgrade command all run persist_flush_now first: dirty sections, a pending settings/song write, and the working project if its hash differs (including the hash-0 case after another firmware's data) (only what is pending; no question). every start-up: ota_boot_cleanup erases all five staging sectors (only if the first 4 bytes at 0xE0000 or the 8 bytes at 0xE4F00 are not blank (0xFF); data elsewhere in the range is not detected). first start-up after another firmware: If SLOOP cannot restore its working loop, it autosaves about 20 s after power-on. With no intact copy it can recognize, its first save writes copy A at 0x9F000, over whatever the previous firmware keeps there: Melodee's shared U109-U126 or Felucca's or JIANT's FM6 user-preset patches. An older intact record can make it use the other copy at 0xFE000 instead (transport stopped, menu shut, 2.5 s without input, nothing sounding). first start-up after another firmware: No settings write happens at start-up itself; but because no settings were loaded (persist_saved zero), the first menu close or any other settings trigger writes the settings even if nothing changed (settings area held a record SLOOP does not accept). first start-up after another firmware: Drum-channel migration on the first start of 2.6 after 2.5: the old project's drum channel is copied into the settings and written once stopped and quiet (settings object of 2.5's exact length and a pre-2.6 working project whose drum channel (0-16) differs from the setting). every start-up: After a warm reset (an update, UPDATE MODE, a crash) a section still valid in .noinit RAM that differs from its flash copy is marked and written back once stopped and quiet (only when RAM survived the reset and differs from flash). install (loader): SLOOP's web installer: no backup and no refusal by firmware identity; it installs over any running firmware that answers the handshake as an FM-1 (model check only), refuses to resume another firmware's update loader ('foreign'), and for the return to official V15 requires the 'backup saved' box and a confirm. It writes nothing to flash beyond the update path above (browser installer at the tag). first idle autosave after an update from 2.6: A restored 2.6 working project acquires the 0x40 saved-by-2.7 marker and drum tuning checksum on capture, changing its hash even with no panel edits. The normal stopped/quiet autosave can therefore commit a new copy (normal stopped/idle autosave guard, no earlier than 20 seconds after boot). What SLOOP writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over SLOOP's is in when_you_leave.",
  "lost": "The official firmware cannot open SLOOP’s music or samples. A 2.7.1 project opens in 2.6, but its new arp modes, KBD HOLD and per-drum TUNE/DECAY do not play the same; held-note overdubs and looping samples can also sound different. A settings save in 2.6 drops MIDI 3, newer setting bits, the custom theme and device favourites. A 2.7.1 backup still needs 2.6 or later for FUN6 projects; the current editor refuses an older target before writing. The editor’s sound library, scenes and playlist live in the browser. Device favourites are absent from its backup. Going back to 2.5 with changed MIDI channels, OTHER, BEND, any MIDI 3 value or a learned CC makes its SYN kits start from defaults; its next settings save loses the saved kits and MIDI part. From the flash atlas (generated): Other firmwares reading SLOOP's data: Felucca lists SLOOP's user sounds U01-U16; user sounds U17-U32; user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000), but plays them differently (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here); X0X reads and uses SLOOP's user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); JIANT lists SLOOP's user sounds U01-U16; user sounds U17-U32, but plays them differently; ChoralRoot lists SLOOP's user sounds U01-U16; user sounds U17-U32, but plays them differently (legacy records may be copied, but retired/renumbered engines and foreign deep patches change their sound; confirmed Flash Data still erases the sources); GHOULBOX lists SLOOP's user sounds U01-U16; user sounds U17-U32, but plays them differently (all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); GHOULBOX reads and uses SLOOP's user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); Hortator reads and uses SLOOP's user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); Skiff reads and uses SLOOP's user sounds U01-U16; user sounds U17-U32; user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000). What SLOOP reads of other firmwares' data: SLOOP reads and uses Felucca's user sample slot USR1; user sample slot USR2; user sample slot USR3; SLOOP reads and uses X0X's break loops slot 1; break loops slot 2; break loops slot 3; SLOOP reads and uses GHOULBOX's user sample slot USR1; user sample slot USR2; user sample slot USR3; SLOOP takes over Hortator's settings and panel calibration, converting them (settings convert when read; next save writes a newer format the previous firmware cannot import); SLOOP reads and uses Hortator's user samples USR1; user samples USR2; user samples USR3 (sample loop and slice behaviour follow this reader’s engines); SLOOP reads and uses Skiff's user sample USR1; user sample USR2; user sample USR3 (sample loop and slice behaviour follow this reader’s engines). Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "In SLOOP’s USB editor, open Song & sections, then Backup and Save a backup. The SLOOP-backup-<date>.json file holds the working loop, sections A–D and their order, 32 user sounds, the FM6 bank, SYN kits, samples USR1–USR4, the settings (including QUANT and MIDI 3) and a stored custom theme. It omits the device favourite list, browser library, browser scenes and playlist, undo, sounding notes and live drum mutes. Restore asks once in the browser and needs playback stopped; it writes the included objects, with one MIDI exception: a backup from 2.5.1 or later without MIDI object 10 resets MIDI LEARN, track and drum channels, OTHER, BEND and MIDI 3 to defaults. A file without a theme does not erase an existing theme. For a 2.7.1 backup restored onto 2.6, use the 2.7.1 editor: it skips a custom theme the 2.6 unit cannot accept; the 2.6 editor rejects a file containing that theme. Export this song makes a smaller .sloopsong file containing only the loop, sections and order; it cannot replace a full backup before changing firmware.",
  "source": [
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/project.c",
    "lines": "21-25",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/project.c#L21-L25"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/project.c",
    "lines": "290-299",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/project.c#L290-L299"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/project.c",
    "lines": "401-407",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/project.c#L401-L407"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/project.c",
    "lines": "485-519",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/project.c#L485-L519"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/storage.c",
    "lines": "127-157",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/storage.c#L127-L157"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/ui_layers.c",
    "lines": "375-385",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/ui_layers.c#L375-L385"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "firmware/src/project.c",
    "lines": "626-650",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/firmware/src/project.c#L626-L650"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.5",
    "commit": "fa9ce5742f4aea9484e7c129dd81079d07e7321f",
    "path": "web/editor.html",
    "lines": "1690-1750",
    "url": "https://github.com/isod89/sloop-fm1/blob/fa9ce5742f4aea9484e7c129dd81079d07e7321f/web/editor.html#L1690-L1750"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/storage.c",
    "lines": "20-32",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/storage.c#L20-L32"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/storage.c",
    "lines": "64-75",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/storage.c#L64-L75"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/upreset.c",
    "lines": "424-429",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/upreset.c#L424-L429"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/up_fm6.c",
    "lines": "142-155",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/up_fm6.c#L142-L155"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/project.c",
    "lines": "1276-1290",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/project.c#L1276-L1290"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/fm6_vbank.c",
    "lines": "24",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/fm6_vbank.c#L24"
   },
   {
    "kind": "source",
    "repo": "juanjiant-bit/JIANT",
    "ref": "f139492",
    "commit": "f139492d2a4863e71f5a35bb41577149163b61e4",
    "path": "firmware/src/storage.c",
    "lines": "20-32",
    "url": "https://github.com/juanjiant-bit/JIANT/blob/f139492d2a4863e71f5a35bb41577149163b61e4/firmware/src/storage.c#L20-L32"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-x0x",
    "ref": "v1.0.6",
    "commit": "47f8e4c4ad602591b81c21bc5480db7a94f6d6af",
    "path": "firmware/src/storage.c",
    "lines": "20-23",
    "url": "https://github.com/charlesvestal/fm1-x0x/blob/47f8e4c4ad602591b81c21bc5480db7a94f6d6af/firmware/src/storage.c#L20-L23"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.3.2",
    "commit": "405ef41aef75f7e70afd6decc01505df07c708e9",
    "path": "firmware/src/storage.c",
    "lines": "20-22",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/405ef41aef75f7e70afd6decc01505df07c708e9/firmware/src/storage.c#L20-L22"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.3.1",
    "commit": "757b65b0037aea8c62eed7a160351d3e3678d913",
    "path": "firmware/src/storage.c",
    "lines": "23-35",
    "url": "https://github.com/keremimo/melodee/blob/757b65b0037aea8c62eed7a160351d3e3678d913/firmware/src/storage.c#L23-L35"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/storage.c",
    "lines": "55-65",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/storage.c#L55-L65"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/storage.c",
    "lines": "72-172",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/storage.c#L72-L172"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/storage.c",
    "lines": "177-224",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/storage.c#L177-L224"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "378-387",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L378-L387"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "395-455",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L395-L455"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "459-514",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L459-L514"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "672-733",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L672-L733"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "785-814",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L785-L814"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "862-955",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L862-L955"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "975-989",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L975-L989"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ui.c",
    "lines": "610-667",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L610-L667"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/editor.c",
    "lines": "415-469",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/editor.c#L415-L469"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/editor.c",
    "lines": "537-563",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/editor.c#L537-L563"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "web/editor.html",
    "lines": "2414-2522",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2414-L2522"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "web/editor.html",
    "lines": "2677-2724",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2677-L2724"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/eng_sample.c",
    "lines": "118-135",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/eng_sample.c#L118-L135"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/panel.c",
    "lines": "98-133",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L98-L133"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/loader/ldr_core.c",
    "lines": "91-103",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/loader/ldr_core.c#L91-L103"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/loader/ldr_core.c",
    "lines": "105-176",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/loader/ldr_core.c#L105-L176"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ota.c",
    "lines": "272-410",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ota.c#L272-L410"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "1108-1181",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L1108-L1181"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/main.c",
    "lines": "284-337",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/main.c#L284-L337"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "docs/webapp/installer/index.html",
    "lines": "148-160",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/docs/webapp/installer/index.html#L148-L160"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "docs/webapp/installer/index.html",
    "lines": "345-399",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/docs/webapp/installer/index.html#L345-L399"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "docs/webapp/installer/index.html",
    "lines": "588-615",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/docs/webapp/installer/index.html#L588-L615"
   },
   {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "GUIDE.md",
    "lines": "1194-1217",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L1194-L1217"
   },
   {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "README.md",
    "lines": "44-64",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/README.md#L44-L64"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "web/editor.html",
    "lines": "2476-2491",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2476-L2491"
   },
   {
    "kind": "historical_comparison",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.6",
    "path": "web/editor.html",
    "lines": "1707",
    "url": "https://github.com/isod89/sloop-fm1/blob/d30d6553353373cf5506b9ed285fc4a2aa0c30ef/web/editor.html#L1707",
    "compared_commit": "d30d6553353373cf5506b9ed285fc4a2aa0c30ef"
   },
   {
    "kind": "historical_comparison",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.6",
    "path": "web/editor.html",
    "lines": "1737-1738",
    "url": "https://github.com/isod89/sloop-fm1/blob/d30d6553353373cf5506b9ed285fc4a2aa0c30ef/web/editor.html#L1737-L1738",
    "compared_commit": "d30d6553353373cf5506b9ed285fc4a2aa0c30ef"
   }
  ],
  "going_back": "For 2.7.1 to 2.6, the FUN6 projects still open, with the feature and settings limits described in lost above. The following older-version warning remains relevant because 2.7.1 still uses FUN6: SLOOP 2.6 to 2.5: 2.5 cannot read 2.6 projects (format 6), so the working project and sections A-D show empty. About 20 s after power-on, once stopped, idle 2.5 s and with the menu shut, 2.5 autosaves its own empty project into the other copy of the working-project slot; 2.6 then loads that one when you come back, and the next save on either version erases 2.6's last copy. Sections that look empty in 2.5 are stored over by SAVE + white key 5-8 with no second press. If a CC was learned, a track or drum MIDI channel, OTHER or BEND differs from its default, or any MIDI 3 value (FX CH, DR MAP, REMOTE or CLOCK) is non-default, 2.5 starts the SYN drum kits from their defaults and its next settings save drops them and the MIDI settings. User sounds, samples and the FM6 bank are read the same by 2.5. To 2.4: the same as 2.5 for projects (2.4 reads format 5 at most and has the same autosave, so it also writes over 2.6's working project about 20 s after starting), and the SYN kits are not kept; in projects it can read, tracks set to PHYS or NOISE open with another engine. To 2.3 or older: projects saved by 2.4 or later look empty and 2.3's autosave can write over them.",
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)",
     "stock Bluetooth data",
     "stock voices (128 user patches, banks A-D)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns); stock Bluetooth data; stock voices (128 user patches, banks A-D).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches of the FM6 user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the autosave (the music as you left it)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3"
    ],
    "kept_unseen": [
     "user presets 1-16",
     "user presets 17-32"
    ],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches of the FM6 user presets; settings, button calibration, favourites, MIDI LEARN map. At risk when you act: project slot A; project slot B; project slot C; project slot D; the autosave (the music as you left it); FM6 voice bank B1-B32. Carried over: user sample slot USR1; user sample slot USR2; user sample slot USR3. Kept but not shown: user presets 1-16; user presets 17-32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "break loops slot 1",
     "break loops slot 2",
     "break loops slot 3"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk when you act: X0X button calibration. Carried over: break loops slot 1; break loops slot 2; break loops slot 3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches of the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds U01-U16",
     "user sounds U17-U32"
    ],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches of the FM6 user sounds; settings, calibration, favourites, MENU options. At risk when you act: song 1 section A (a whole project); song 1 section B (a whole project); song 1 section C (a whole project); song 1 section D (a whole project); song 2: four sections (whole projects); song 3: four sections (whole projects); song 4: four sections (whole projects) (some of it lost); song 5: four sections (whole projects); song 6: four sections (whole projects); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; the music in progress (RESTORE LAST); FM6 voice bank B1-B32. Kept but not shown: user sounds U01-U16; user sounds U17-U32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U109-U126; settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; shared user presets U037-U054; shared user presets U055-U072; shared user presets U127-U144.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "32 imported DX7 voices",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last global-save session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 32 imported DX7 voices; options, playing setup and panel calibration. At risk when you act: CZ-1 bank A (16 tones); CZ-1 bank B (16 tones); CZ-1 bank C (16 tones); CZ-1 bank D (16 tones); CZ-1 bank E (16 tones); CZ-1 bank F (16 tones); CZ-1 bank G (16 tones); CZ-1 bank H (16 tones); last global-save session; favourite marks, chord/bass type and filter; 128 saved sounds with their complete engine patches; recorded loop 1; recorded loop 2; recorded loop 3; recorded loop 4; recorded loop 5; recorded loop 6; recorded loop 7; recorded loop 8; recorded loop 9; recorded loop 10.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1–B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3"
    ],
    "kept_unseen": [
     "user sounds 1–16 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question)",
     "user sounds 17–32 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question)"
    ],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches for user sounds; settings and panel calibration. At risk when you act: project A; project B; project C; project D; music in progress (RESTORE LAST); FM6 voice bank B1–B32. Carried over: user sample slot USR1; user sample slot USR2; user sample slot USR3. Kept but not shown: user sounds 1–16 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question); user sounds 17–32 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user samples USR1 (sample loop and slice behaviour follow this reader’s engines)",
     "user samples USR2 (sample loop and slice behaviour follow this reader’s engines)",
     "user samples USR3 (sample loop and slice behaviour follow this reader’s engines)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration (converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import). At risk when you act: project A; project B; project C; project D. Carried over: user samples USR1 (sample loop and slice behaviour follow this reader’s engines); user samples USR2 (sample loop and slice behaviour follow this reader’s engines); user samples USR3 (sample loop and slice behaviour follow this reader’s engines).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings; pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly shared memory 4; Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Optional QY70 style bank; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sounds’ own FM6 patches",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sound bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first) [through its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared 64-pattern pool",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample USR1 (sample loop and slice behaviour follow this reader’s engines)",
     "user sample USR2 (sample loop and slice behaviour follow this reader’s engines)",
     "user sample USR3 (sample loop and slice behaviour follow this reader’s engines)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sounds’ own FM6 patches; user sound bank 1 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sound bank 2 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); settings, calibration and favourites. At risk when you act: project A; project B; project C; project D; last session; shared 64-pattern pool. Carried over: user sample USR1 (sample loop and slice behaviour follow this reader’s engines); user sample USR2 (sample loop and slice behaviour follow this reader’s engines); user sample USR3 (sample loop and slice behaviour follow this reader’s engines).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "overwrites_previous_grade": "Generated from the flash atlas (output/fm1/flash-atlas/). Each fact carries its evidence grade. Available firmware source was read at the mapped release; Open’s USER layout is read in its package and APP source; its native SDK/loader are closed. Stock V15’s layout is reported from V13 analysis; Baud Girl’s is inferred. Nothing was tested on a unit. Anything listed is at risk, whatever saved copy might survive.",
  "going_back_source": [
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.4",
    "commit": "8d3823f7057102a0e64513701b640e79668c9212",
    "path": "firmware/src/project.c",
    "lines": "21-25",
    "url": "https://github.com/isod89/sloop-fm1/blob/8d3823f7057102a0e64513701b640e79668c9212/firmware/src/project.c#L21-L25"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.4",
    "commit": "8d3823f7057102a0e64513701b640e79668c9212",
    "path": "firmware/src/project.c",
    "lines": "459-512",
    "url": "https://github.com/isod89/sloop-fm1/blob/8d3823f7057102a0e64513701b640e79668c9212/firmware/src/project.c#L459-L512"
   },
   {
    "kind": "doc",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "README.md",
    "lines": "104",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/README.md#L104"
   },
   {
    "kind": "doc",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "SLOOP.md",
    "lines": "86",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/SLOOP.md#L86"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "862-885",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L862-L885"
   },
   {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "918-930",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L918-L930"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "song section A (a whole project)",
     "song section B (a whole project)",
     "song section C (a whole project)",
     "song section D (a whole project)",
     "the music in progress (autosave)",
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)",
     "user sounds U01-U16",
     "user sounds U17-U32",
     "FM6 patch bank B1-B27",
     "user sample slot USR4 (header at 0xE7000)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); user sounds U01-U16; user sounds U17-U32; FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "song section A (a whole project)",
     "song section B (a whole project)",
     "song section C (a whole project)",
     "song section D (a whole project)",
     "the music in progress (autosave)",
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)",
     "user sounds U01-U16",
     "user sounds U17-U32",
     "FM6 patch bank B1-B27",
     "user sample slot USR4 (header at 0xE7000)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); user sounds U01-U16; user sounds U17-U32; FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if its 2ND CORE is on and a render job fails or times out",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CCs (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if an earlier Felucca or GHOULBOX voice-bank upload survives and the saved bank is missing or older",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here)",
     "user sample slot USR2 (header at 0xB4000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here)",
     "user sample slot USR3 (header at 0xC8000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patch bank B1-B27; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: user sample slot USR4 (header at 0xE7000). At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sounds U01-U16 (converted when read, written back at your next save in that bank); user sounds U17-U32 (converted when read, written back at your next save in that bank). Carried over: user sample slot USR1 (header at 0xA0000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here); user sample slot USR2 (header at 0xB4000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here); user sample slot USR3 (header at 0xC8000) (new SLOOP LOOP / LOOP+TAIL samples play as ordinary loops here).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); user sounds U17-U32; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16. Carried over: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song through MIDI PROGRAM CHANGE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if its RESTORE LAST is on",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if it ran on this unit before and its staged voice bank survived",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you send data from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you send data from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sample slot USR3 (header at 0xC8000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000). At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sounds U01-U16 (converted when read, written back at your next save in that bank); user sounds U17-U32 (converted when read, written back at your next save in that bank).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the music in progress (autosave); user sounds U01-U16; user sounds U17-U32; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); user sample slot USR3 (header at 0xC8000); FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000). At risk when you act: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot favourites save survives and its next spare is not blank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if an older ChoralRoot session save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot sound-pool save survives and its next spare is not blank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if no pool bank exists and at least one legacy UPB1/192 sound passes validation",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion/reset with OCT+ (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you hold OCT- and OCT+ while switching on (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request Import 0.21 sounds from the device manager (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore favourites from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore pool banks 50..62, or accepted legacy sound objects that are redirected into pool slots 1..32 from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore settings, which also writes an empty session record from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording/editing/clearing this loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode with a nonempty current loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore loop id 40; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore loop id 41; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 42; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 43; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 44; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 45; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 46; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 47; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 48; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 49; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (no question)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore FM6 bank id 8 from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank dump (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank A (id 14) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank B (id 15) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank C (id 16) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank D (id 17) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank E (id 18) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank F (id 19) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank G (id 20) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank H (id 21) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sounds U01-U16; user sounds U17-U32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if no valid UPF6 exists and a valid old type-7 FM6B bank survives",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user patch",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patch bank B1-B27; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: the music in progress (autosave); user sample slot USR4 (header at 0xE7000). At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); user sounds U01-U16 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); user sounds U17-U32 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ). Carried over: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The factory-sample write runs by itself right after the Workbench installs Open, before any project save. The source-built V12 bank erases 0x8D000–0x9FFFF without another sample question. The shipped Workbench asset was not compared with the source."
    ],
    "owner_text": "At risk by itself: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave). At risk when you act: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); user sounds U01-U16; user sounds U17-U32; FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. The factory-sample write runs by itself right after the Workbench installs Open, before any project save. The source-built V12 bank erases 0x8D000–0x9FFFF without another sample question. The shipped Workbench asset was not compared with the source.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)",
     "user sample slot USR2 (header at 0xB4000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)",
     "user sample slot USR3 (header at 0xC8000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project). Carried over: user sample slot USR1 (header at 0xA0000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); user sample slot USR2 (header at 0xB4000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); user sample slot USR3 (header at 0xC8000) (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sample slot USR4 (header at 0xE7000) (damaged (part of it written over)); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: user sample slot USR4 (header at 0xE7000). At risk when you act: user sample slot USR3 (header at 0xC8000); user sounds U01-U16; user sounds U17-U32; FM6 patch bank B1-B27.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old autosave needs migration and its patterns fit",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a valid retired FM6 patch bank remains and no current patch object loads",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write an FM6 patch to a user sound from the editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you store a sound from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       },
       {
        "way": "when you store a sound from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave). At risk when you act: user sounds U01-U16 (converted when read, written back at your next save in that bank); user sounds U17-U32 (converted when read, written back at your next save in that bank). Carried over: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "Which pages each button opens",
   "docs_say": "The 'every button, alone' table lists LFO as LFO and LFO DEST, FX as five pages, EDIT as four and GLO as four (GLOBAL, MASTER, SYSTEM, DRUMS).",
   "source_says": "The page table includes LFO 2, INSERT and INSERT 2, ANALOG-only FILTER under EDIT, and nine GLO pages including MIDI, MIDI 2, MIDI 3, TEXTURE and TEXTURE 2. SAVE now calls its slot page SECTION. The guide’s detailed sections have these changes; its overview tables lag behind.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L153-L160",
    "path": "GUIDE.md",
    "lines": "153-160",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/params.c",
    "lines": "395-438",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L395-L438"
   }
  },
  {
   "topic": "Going back to an older SLOOP",
   "docs_say": "The guide's install section warns only that 2.3 cannot read 2.4 projects (format FUN5), and its backup section says a 2.4 backup restores into 2.4 or later.",
   "source_says": "2.7.1 still writes FUN6, introduced in 2.6, which 2.5 cannot read. The editor checks project formats before restoring. Its projects open in 2.6 with limits on the new 2.7 features; README and SLOOP.md explain this, while this GUIDE warning is still about 2.4.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L72",
    "path": "GUIDE.md",
    "lines": "72",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "27-45",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L27-L45"
   }
  },
  {
   "topic": "SAVE layer, white key 16",
   "docs_say": "SAVE + key 16 opens the SONG screen.",
   "source_says": "It does, but the layer screen labels that tile 'chain', which can mislead: chains are made with keys 1-4.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L441",
    "path": "GUIDE.md",
    "lines": "441",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ui_layers.c",
    "lines": "1006-1008",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L1006-L1008"
   }
  },
  {
   "topic": "ARP note repeat in chord mode",
   "docs_say": "The ARP layer repeats the held key; chord mode plays a whole chord from one key. The guide does not say which a roll repeats in chord mode.",
   "source_says": "A roll always repeats the key's single (root) note, never the chord; and on a synth track black keys are silent in chord mode, so they roll nothing.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L374",
    "path": "GUIDE.md",
    "lines": "374",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/seq.c",
    "lines": "1868-1883",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L1868-L1883"
   },
   "kind": "docs leave it open"
  },
  {
   "topic": "Pages that work on the drum track",
   "docs_say": "On the drum track the pages that work are SLICER, PATTERN, the SONG screen and the global pages.",
   "source_says": "INSERT and INSERT 2 also work on the drum track (the guide's effects section agrees), and so does the TRACKS screen.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L709",
    "path": "GUIDE.md",
    "lines": "709",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/params.c",
    "lines": "442-453",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/params.c#L442-L453"
   }
  },
  {
   "topic": "OCT- and OCT+ lights",
   "docs_say": "OCT- and OCT+ light when the octave is off 0.",
   "source_says": "Only on a synth track. On the drum track they light only while held (ghost or hard hits), and inside the FX layer they show the reverb and echo throws.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L905",
    "path": "GUIDE.md",
    "lines": "905",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ui_input.c",
    "lines": "227-236",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L227-L236"
   }
  },
  {
   "topic": "Undo after clearing a track",
   "docs_say": "Holding REC clears the selected track and undo brings it back.",
   "source_says": "Clearing also deletes parameter locks, nudges and fill conditions. Undo in 2.7 restores notes, pattern length and nudges, but it still has no snapshot of the locks or fill conditions.",
   "docs_ref": {
    "kind": "doc",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L578",
    "path": "GUIDE.md",
    "lines": "578",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/seq.c",
    "lines": "444-466",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L444-L466"
   }
  },
  {
   "topic": "DRUMS page overview",
   "docs_say": "The button and SELECT overviews describe switching between grid and kit only.",
   "source_says": "There are three pages: GRID, KIT and SOUND. EDIT or SEQ cycles through them; SELECT moves within the three-page range. The guide’s detailed DRUMS section already describes SOUND.",
   "docs_ref": {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "GUIDE.md",
    "lines": "157-164",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L157-L164"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ui_input.c",
    "lines": "680-685",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L680-L685"
   }
  },
  {
   "topic": "Theme record in the editor protocol",
   "docs_say": "The v11 protocol section describes a 36-byte THM1 record without a separate accent colour.",
   "source_says": "The current record is 40-byte THM2 and includes the accent and its CRC. A 36-byte THM1 from the beta is accepted and converted.",
   "docs_ref": {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "web/EDITOR_PROTOCOL.md",
    "lines": "430-439",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/EDITOR_PROTOCOL.md#L430-L439"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/gfx.c",
    "lines": "65-129",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/gfx.c#L65-L129"
   }
  },
  {
   "topic": "Saving device favourites",
   "docs_say": "The guide says the device favourites survive power-off.",
   "source_says": "A favourite edit does not trigger an idle save by itself. It needs another action that writes settings; closing the HOME menu while stopped commits it. Device favourites are not in an editor backup.",
   "docs_ref": {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "GUIDE.md",
    "lines": "601",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L601"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/project.c",
    "lines": "1108-1181",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L1108-L1181"
   }
  },
  {
   "topic": "When 2ND CORE OFF applies",
   "docs_say": "The release notes say disabling the second core takes effect after another power-on.",
   "source_says": "OFF stops assigning work to that core immediately. ON can resume it immediately only if it started successfully; otherwise another power-on is needed.",
   "docs_ref": {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "SLOOP.md",
    "lines": "15",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/SLOOP.md#L15"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "firmware/src/ui_menu.c",
    "lines": "264-269",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L264-L269"
   }
  },
  {
   "topic": "Where to find Backup",
   "docs_say": "The guide sends the owner to an editor tab named Projects for Backup.",
   "source_says": "The tab is now named Song & sections; its Backup buttons are in that panel.",
   "docs_ref": {
    "kind": "doc",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "GUIDE.md",
    "lines": "1198",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/GUIDE.md#L1198"
   },
   "source_ref": {
    "kind": "source",
    "repo": "isod89/sloop-fm1",
    "ref": "v2.7.1",
    "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
    "path": "web/editor.html",
    "lines": "5024",
    "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L5024"
   }
  }
 ],
 "not_mapped": [
  "led_play_stop_green: SLOOP's code addresses one LED per button and never a second PLAY LED; which colour the driven PLAY LED is on the hardware was not checked on a unit.",
  "The meaning of each page's four values per engine (EDIT 1 and EDIT 2 change with the twelve engines): listed in GUIDE.md section 17, not re-verified value by value in this map.",
  "The complete MIDI channel, CC, Program Change, sustain, pitch-bend and MIDI LEARN maps were not re-mapped value by value. The new MIDI 3 controls, CC74 fallback and USB clock output were read in source and are covered in the page controls and jack notes.",
  "Keys while the menu is open: the menu code takes no keys, but the audio interrupt may still play them; not traced.",
  "The developer USB SERIAL console and debug breadcrumbs: not for owners; the released FM-1 build now compiles out USB SERIAL.",
  "What the official V15 firmware does to SLOOP's data areas when it is reinstalled or saves: its storage map is only reported (FM-1-RE, Melodee docs), not readable code.",
  "The editor-only LIVE page’s browser scenes, setlist, MIDI learn, recorder and local WebAssembly preview are not panel gestures. Its song-file/playlist overwrite behavior and backup limits are covered here; its other browser-only controls are outside this panel map."
 ],
 "lights": {
  "button_play_stop": [
   {
    "mode": "playing",
    "gesture": "flash",
    "action": "Flashes on every beat, timed to when you hear it: a silent metronome.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "42-49",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L42-L49"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "223-224",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L223-L224"
     }
    ]
   },
   {
    "mode": "count_in",
    "gesture": "flash",
    "action": "Flashes on each of the four count-in beats.",
    "short_label": "COUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "223-224",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L223-L224"
     }
    ]
   },
   {
    "mode": "stopped",
    "gesture": "off",
    "action": "Dark while the transport is stopped.",
    "short_label": "STOPPED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "42-49",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L42-L49"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "rec_ready",
    "gesture": "blinking",
    "action": "Blinks while armed.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "225-226",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L225-L226"
     }
    ]
   },
   {
    "mode": "playing",
    "gesture": "lit",
    "action": "Lit while a track records, and during a free take.",
    "short_label": "RECORDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "225-226",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L225-L226"
     }
    ]
   },
   {
    "mode": "hold_clear",
    "gesture": "blinking",
    "action": "Blinks fast while the clear-track ring fills.",
    "short_label": "CLEARING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "225-226",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L225-L226"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "tracks",
    "gesture": "lit",
    "action": "Lit while the TRACKS screen shows.",
    "short_label": "TRACKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the FX pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the SEL pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the ENV pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the LFO pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the EDIT pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the GLO pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the ARP pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the SEQ pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "lit",
    "action": "Lit on the DRUMS screen, whichever button opened it.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "32-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L32-L39"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "pages",
    "gesture": "lit",
    "action": "Lit while one of the SAVE pages is on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_layers.c",
      "lines": "23",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L23"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "221-222",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L221-L222"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "lit",
    "action": "Lit on the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "32-35",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L32-L35"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Lit while the octave is below 0.",
    "short_label": "OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "233-236",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L233-L236"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Lit while held (ghost hits).",
    "short_label": "GHOST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "230-232",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L230-L232"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "Lit while REV THROW is on from the panel or the editor.",
    "short_label": "REV THROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "227-229",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L227-L229"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/fx.c",
      "lines": "1173-1180",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/fx.c#L1173-L1180"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu LIGHTS set above OFF, glows at that level so the label reads in the dark.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "245-247",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L245-L247"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/panel.c",
      "lines": "90-91",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/panel.c#L90-L91"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Lit while the octave is above 0.",
    "short_label": "OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "233-236",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L233-L236"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Lit while held (hard hits).",
    "short_label": "HARD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "230-232",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L230-L232"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "Lit while ECHO THROW is on from the panel or the editor.",
    "short_label": "ECHO THROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "227-229",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L227-L229"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/fx.c",
      "lines": "1173-1180",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/fx.c#L1173-L1180"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Each drum hit lights its sound's white key for a moment.",
    "short_label": "HITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "162-165",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L162-L165"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "55-63",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L55-L63"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Keys you hold light up; with menu NOTES on, every note sounding on the track, sequencer included, lights its key too.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "162-165",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L162-L165"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "55-78",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L55-L78"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "lit",
    "action": "The steps that play on this page are lit; the playhead blinks.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "111-124",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L111-L124"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "lit",
    "action": "Keys in the scale are lit; the root keys blink.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "125-128",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L125-L128"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "80-89",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L80-L89"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "lit",
    "action": "Drum track: the keys of sounds the pattern holds are lit, plus keys held.",
    "short_label": "IN PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "143-144",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L143-L144"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "91-102",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L91-L102"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "The key of the effect being held is lit.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "109-110",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L109-L110"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "lit",
    "action": "The chosen sound's steps on this page are lit; the playhead blinks.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "148-161",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L148-L161"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With menu KEYS set, the Cs, all white keys or all keys glow at the LIGHTS level.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "199-210",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L199-L210"
     },
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "239",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L239"
     }
    ]
   }
  ],
  "led_f3": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Faintly lit as a row marker (key 1 starts a row of four tiles) whenever a layer is held, and all the time on the drum track.",
    "short_label": "ROW START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "191-196",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L191-L196"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 1 is heard (not muted or left out by a solo).",
    "short_label": "T1 ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "129-135",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L129-L135"
     }
    ]
   }
  ],
  "led_c4": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Faintly lit as a row marker (key 5 starts a row of four tiles) whenever a layer is held, and all the time on the drum track.",
    "short_label": "ROW START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "191-196",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L191-L196"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 1 is soloed.",
    "short_label": "T1 SOLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "133-134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L133-L134"
     }
    ]
   }
  ],
  "led_g4": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Faintly lit as a row marker (key 9 starts a row of four tiles) whenever a layer is held, and all the time on the drum track.",
    "short_label": "ROW START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "191-196",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L191-L196"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while a fill plays.",
    "short_label": "FILL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "136-137",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L136-L137"
     }
    ]
   }
  ],
  "led_d5": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Faintly lit as a row marker (key 13 starts a row of four tiles) whenever a layer is held, and all the time on the drum track.",
    "short_label": "ROW START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "191-196",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L191-L196"
     }
    ]
   }
  ],
  "led_g3": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 2 is heard (not muted or left out by a solo).",
    "short_label": "T2 ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "129-135",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L129-L135"
     }
    ]
   }
  ],
  "led_a3": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 3 is heard (not muted or left out by a solo).",
    "short_label": "T3 ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "129-135",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L129-L135"
     }
    ]
   }
  ],
  "led_b3": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 4 is heard (not muted or left out by a solo).",
    "short_label": "T4 ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "129-135",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L129-L135"
     }
    ]
   }
  ],
  "led_d4": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 2 is soloed.",
    "short_label": "T2 SOLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "133-134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L133-L134"
     }
    ]
   }
  ],
  "led_e4": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 3 is soloed.",
    "short_label": "T3 SOLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "133-134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L133-L134"
     }
    ]
   }
  ],
  "led_f4": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 4 is soloed.",
    "short_label": "T4 SOLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "133-134",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L133-L134"
     }
    ]
   }
  ],
  "led_a4": [
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while a fill bar is armed or playing.",
    "short_label": "FILL BAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "138-139",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L138-L139"
     }
    ]
   }
  ],
  "led_g5": [
   {
    "mode": "layer_mix",
    "gesture": "flash",
    "action": "Flashes on the beat.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "isod89/sloop-fm1",
      "ref": "v2.7.1",
      "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
      "path": "firmware/src/ui_input.c",
      "lines": "140-141",
      "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L140-L141"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_a3",
   "led_a4",
   "led_as3",
   "led_as4",
   "led_b3",
   "led_b4",
   "led_c4",
   "led_c5",
   "led_cs4",
   "led_cs5",
   "led_d4",
   "led_d5",
   "led_ds4",
   "led_ds5",
   "led_e4",
   "led_e5",
   "led_f3",
   "led_f4",
   "led_f5",
   "led_fs3",
   "led_fs4",
   "led_fs5",
   "led_g3",
   "led_g4",
   "led_g5",
   "led_gs3",
   "led_gs4"
  ]
 },
 "overwrites_without_asking": [
  {
   "what": "SAVE + white key 1-4 puts that section in place of your working loop: at once when stopped, at the next bar when playing (a quick chain does it again each time it moves on). In loop mode the loop you had is not kept anywhere.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "364-384",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L364-L384"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2117-2130",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2117-L2130"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/arranger_scene.c",
     "lines": "31-45",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/arranger_scene.c#L31-L45"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/arranger_scene.c",
     "lines": "48-72",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/arranger_scene.c#L48-L72"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "1102-1106",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L1102-L1106"
    }
   ]
  },
  {
   "what": "SAVE + white key 5-8 stores the loop into a section.",
   "asks": "only when the section holds a project SLOOP can read, including one saved by an older SLOOP (press again within 3 s); a section it cannot read looks empty and is stored over at once",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "385-395",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L385-L395"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/arranger_scene.c",
     "lines": "3-9",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/arranger_scene.c#L3-L9"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "378-387",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L378-L387"
    }
   ]
  },
  {
   "what": "SAVE + white key 14 (song recording) replaces the whole song order when the recording ends.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_layers.c",
     "lines": "403-414",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_layers.c#L403-L414"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "2065-2080",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L2065-L2080"
    }
   ]
  },
  {
   "what": "The working project is autosaved by itself when stopped and idle.",
   "asks": "no",
   "undo": "not applicable",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/project.c",
     "lines": "672-706",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/project.c#L672-L706"
    }
   ]
  },
  {
   "what": "A MIDI Program Change loads a sound over the track's sound, unsaved edits included.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "689-735",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L689-L735"
    }
   ]
  },
  {
   "what": "Turning PRESETS on TRACKS or the PRESETS page, or KNOB 2 (engine) on the PRESETS page, replaces the track's sound, unsaved edits included.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "1125-1134",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L1125-L1134"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "422-431",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L422-L431"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "669-687",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L669-L687"
    }
   ]
  },
  {
   "what": "SECTION LOAD, SAVE and ERASE; USER LOAD, SAVE and ERASE; TOOLS NEW, INIT and CLRSQ. Saving over a used slot gets no further question.",
   "asks": "a second turn of the knob within roughly 1.5 s",
   "undo": "loads, saves, erases and INIT: no; NEW: the last track’s notes, nudges and length only; CLRSQ: notes, nudges and length, not locks or fill conditions",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "434-465",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L434-L465"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "478-519",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L478-L519"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "371-403",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L371-L403"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "230-253",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L230-L253"
    }
   ]
  },
  {
   "what": "SONG screen: OCT+ loads the entry's section; REC stores the loop into it.",
   "asks": "OCT+: press twice within 3 s; REC: only if that section already holds music",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_song.c",
     "lines": "104-132",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_song.c#L104-L132"
    }
   ]
  },
  {
   "what": "Holding REC clears the selected track.",
   "asks": "hold about 2 s",
   "undo": "notes, nudges and length only",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_input.c",
     "lines": "913-958",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_input.c#L913-L958"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "444-466",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L444-L466"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/seq.c",
     "lines": "937-946",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/seq.c#L937-L946"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "230-253",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L230-L253"
    }
   ]
  },
  {
   "what": "Restoring an editor backup replaces the saved objects on the FM-1; for backups from 2.5.1 or later, missing MIDI object 10 also resets MIDI LEARN, track and drum channels, OTHER, BEND and MIDI 3 to defaults. The device favourite list is not in the file.",
   "asks": "the browser asks once",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "2444-2522",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2444-L2522"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "9799-9815",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L9799-L9815"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/editor.c",
     "lines": "415-469",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/editor.c#L415-L469"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "2476-2482",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2476-L2482"
    }
   ]
  },
  {
   "what": "Loading a song file or selecting another song in the LIVE playlist replaces sections A–D, the working loop and song order. Sections absent from the file are erased. Sound banks, samples and SYN kits stay as on the unit.",
   "asks": "Song & sections file import asks once; LIVE playlist tap or Next does not ask and stops playback first",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "2709-2724",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L2709-L2724"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "9782-9795",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L9782-L9795"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "web/editor.html",
     "lines": "10301-10320",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/web/editor.html#L10301-L10320"
    }
   ]
  },
  {
   "source": [
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui_menu.c",
     "lines": "255-301",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui_menu.c#L255-L301"
    },
    {
     "kind": "source",
     "repo": "isod89/sloop-fm1",
     "ref": "v2.7.1",
     "commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
     "path": "firmware/src/ui.c",
     "lines": "826-834",
     "url": "https://github.com/isod89/sloop-fm1/blob/4ec1ac829fd2bdf2c571ea215fb3d62477d01220/firmware/src/ui.c#L826-L834"
    }
   ],
   "what": "MIDI LEARN CLEAR via OCT+ deletes all learned CCs at once, without an undo or confirmation; the change is saved once quiet.",
   "asks": "no",
   "undo": "no"
  }
 ],
 "fixed_after_check": "2026-10-13",
 "check_fixes": [
  {
   "error": "4 (undo after clear)",
   "fixed": "button_rec long_press and button_oct_down UNDO now say undo returns notes and length only, never locks, nudges or fill conditions; md Record and Erase tables changed; new disagreement on GUIDE.md:565."
  },
  {
   "error": "6 (black keys silent in chord/WHITE mode)",
   "fixed": "All 11 black-key layer_roll and layer_erase entries now say black keys do nothing on a synth track with chord mode on or KEYS = WHITE."
  },
  {
   "error": "9 (PRESETS page KNOB 2)",
   "fixed": "encoder_knob2 save_pages: right = next engine, left = previous."
  },
  {
   "error": "10 (DIV range)",
   "fixed": "encoder_knob2 layer_steps lists the nine divisions from params.c:42."
  },
  {
   "error": "5 ('writing to flash waits')",
   "fixed": "sloop.md Save table: while playing, project save/load/erase and user-sound save/erase are refused with a message and nothing is queued; only sections from SAVE + 5-8 and a recorded song are written later."
  },
  {
   "error": "7 (stopped mode)",
   "fixed": "modes.stopped: user sounds load while playing; the other flash writes are refused, not queued."
  },
  {
   "error": "11 (copied wording)",
   "fixed": "Rewrote modes.layer_erase_mute, modes.layer_steps, modes.chord_mode, the UBOOT countdown entry, the four row-marker lights and the md intro, Record, DRUMS grid, lights and power-on lines in our own words; an 8-word-run scan against GUIDE.md, README.md and SLOOP.md now finds none."
  },
  {
   "error": "minor (labels)",
   "fixed": "MUTE OPEN HA and MUTE PEDAL H were cut mid-word: now MUTE OPEN and MUTE PEDAL; the drum sound is named PEDAL as the firmware shows it (drums.c:65-67)."
  },
  {
   "error": "cross-map (no 'a question always comes first')",
   "fixed": "New top-level overwrites_without_asking list and md section: what overwrites with no question, and what undo cannot reverse."
  },
  {
   "error": "1 (2.5 overwrites 2.6's working project)",
   "fixed": "switching_note.going_back (new) and md 'Before you switch': 2.5 autosaves over the working project about 20 s after start; sections show empty and are stored over with no second press."
  },
  {
   "error": "2 (SYN kits and MIDI settings on going back)",
   "fixed": "going_back now says 2.5 resets the SYN kits and drops the MIDI settings when GLO > MIDI was changed or a CC learned; 2.4 loses the SYN kits; 2.3 or older sees 2.4+ projects as empty."
  },
  {
   "error": "3 (incomplete Felucca overlaps)",
   "fixed": "switching_note.lost lists every overlap: projects, user sounds and settings at the same addresses and object numbers, Felucca's FM6 user-patch object on SLOOP's working project, its autosave on the FM6 bank, its voice bank on USR4, plus X0X, FoMni, JIANT and Melodee."
  },
  {
   "error": "8 (official-firmware docs misattributed)",
   "fixed": "The restore advice is now attributed to SLOOP's installer page (web/index_pkg.html:162), not the official firmware."
  },
  {
   "error": "cross-map (what installing SLOOP does to the previous firmware)",
   "fixed": "New switching_note.overwrites_previous: eight areas with addresses, what SLOOP stores, when it writes (by itself or only when you save), and what each earlier firmware loses."
  },
  {
   "error": "cross-map (backup exactness)",
   "fixed": "back_up_first lists exactly what the backup holds and what it does not."
  },
  {
   "error": "disagreements (checker section 3)",
   "fixed": "ARP chord-mode item re-pointed to GUIDE.md:361 and marked an open point in the docs; undo-after-clear added."
  },
  {
   "error": "12 (INDEX.md word count)",
   "fixed": "Not changed here: INDEX.md is the shared index, not this map's file. The map's docs entry already says 18,712 words; noted in not_mapped."
  },
  {
   "error": "R2-12 (LOAD/ERASE label collision)",
   "fixed": "The SAVE pages are now four modes (save_presets, save_user, save_project, save_tools) and each KNOB has one plain label per page: SOUND, ENGINE, USER SLOT, LOAD, ERASE, SAVE, PROJECT SLOT, CLEAR PATT, INIT SOUND, NEW PROJECT.",
   "round": 2
  },
  {
   "error": "R2-2 (SAVE + 1-4 while playing)",
   "fixed": "overwrites_without_asking and sloop.md: while playing, SAVE + 1-4 (and a chain) replaces the working loop at the next bar, no question, no undo; in loop mode the old loop is not kept.",
   "round": 2
  },
  {
   "error": "R2-5 (missing no-question overwrites)",
   "fixed": "Added PRESETS / engine changes; the two-click group now names project and user-sound SAVE over a used slot and TOOLS INIT.",
   "round": 2
  },
  {
   "error": "R2-6 (SAVE + 5-8 and older SLOOP sections)",
   "fixed": "SAVE + 5-8 asks for any section SLOOP can read, older SLOOP versions included; only unreadable sections look empty.",
   "round": 2
  },
  {
   "error": "R2-10 (going back to 2.4)",
   "fixed": "going_back: 2.4 also cannot read 2.6 projects and autosaves over the working project like 2.5; the PHYS/NOISE swap applies only to projects 2.4 can read. Sources pinned to v2.4 (8d3823f).",
   "round": 2
  },
  {
   "error": "R2-11 (stale not_mapped note)",
   "fixed": "Removed the INDEX.md 18.9k note (INDEX now says 18.7k).",
   "round": 2
  },
  {
   "error": "R2-15 (remaining 8-word runs)",
   "fixed": "Reworded encoder_knob1/knob4 in the FX layer, modes.menu and modes.layer_song.",
   "round": 2
  }
 ],
 "checker_disputes": [],
 "fixed_after_recheck": "2026-10-13",
 "saving_note": "The FM-1 keeps one song: sections A–D and their order, plus a separate working loop. The working loop saves itself after stopping and at least 2.5 seconds without input, with at least 20 seconds between writes. A section stored during playback reaches flash once stopped and quiet. Sections keep per-drum TUNE and DECAY; settings keep QUANT, MIDI 3, the theme and favourites. Favourite edits alone wait for another save trigger; close the HOME menu while stopped to commit them. The editor backup includes the theme and sounds/samples, but omits the device favourite list; a song file holds only the working loop, A–D and their order.",
 "refreshed_from": {
  "release": "v2.6",
  "commit": "d30d6553353373cf5506b9ed285fc4a2aa0c30ef",
  "date": "2026-10-16"
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 MIDI 3 and 2.5 SYN-kit loss",
   "fixed": "Include non-default MIDI 3 values in the condition that makes 2.5 discard the saved SYN kits.",
   "at": "switching_note.going_back"
  },
  {
   "round": 1,
   "error": "1 MIDI 3 and 2.5 SYN-kit loss",
   "fixed": "Correct firmware_notes[7] and [8] with the MIDI 3 trigger.",
   "at": "refresh/work/sloop.storage.json"
  },
  {
   "round": 1,
   "error": "2 Missing MIDI object resets defaults",
   "fixed": "Explain the reset of MIDI settings when a 2.5.1-or-later backup omits object 10.",
   "at": "switching_note.back_up_first"
  },
  {
   "round": 1,
   "error": "6 Editor choice for a themed backup",
   "fixed": "Use the 2.7.1 editor for restoring a 2.7.1 backup onto 2.6; it skips an unsupported theme rather than rejecting the whole file.",
   "at": "switching_note.back_up_first"
  },
  {
   "round": 1,
   "error": "3 OCT+ destructive clear and core timing",
   "fixed": "Cycles the selected setting or opens calibration or ABOUT; on MIDI LEARN CLEAR it immediately deletes all learned CCs, without confirmation or undo, then saves when quiet; 2ND CORE OFF applies now, ON needs a power-on if the core is unavailable, and USB RATE needs a restart.",
   "at": "controls.button_oct_up[9]"
  },
  {
   "round": 1,
   "error": "4 SECTION erase removes song entries",
   "fixed": "Erases the chosen section after two rightward clicks within about 1.5 s, while stopped; its song-order entries are deleted too, or the default order is made if none remain; saving the section again does not restore the removed entries; no undo.",
   "at": "controls.encoder_knob2[20]"
  },
  {
   "round": 1,
   "error": "5 Favourite edits are not saved alone",
   "fixed": "Right adds this sound to the favourite list and left removes it, up to 16; each entry points to a factory preset or user slot and does not save sound edits; a favourite edit alone is lost at power-off unless another settings write occurs, so close the HOME menu while stopped to keep it.",
   "at": "controls.encoder_knob4[18]"
  },
  {
   "round": 1,
   "error": "8 DRUMS remembers the last page",
   "fixed": "Specify SELECT fully left after opening DRUMS to guarantee GRID; reopening DRUMS does not reset its page.",
   "at": "modes[12]"
  },
  {
   "round": 1,
   "error": "8 DRUMS remembers the last page",
   "fixed": "With the drum track selected, opens DRUMS on the last page used; turn SELECT fully left for GRID.",
   "at": "controls.button_edit[1]"
  },
  {
   "round": 1,
   "error": "8 DRUMS remembers the last page",
   "fixed": "With the drum track selected, opens DRUMS on the last page used; turn SELECT fully left for GRID.",
   "at": "controls.button_seq[1]"
  },
  {
   "round": 1,
   "error": "9 Sampled-kit decay cannot lengthen",
   "fixed": "Sets decay from -4 to +3 on synthesised kits and SYN1-4; sampled kits only shorten at -4 to -1, with +1 to +3 leaving the original decay; 0 leaves either kind unchanged; changes audition the sound while stopped.",
   "at": "controls.encoder_knob3[22]"
  },
  {
   "round": 1,
   "error": "10 DR MAP starts at note 36",
   "fixed": "Replace the notes 1-16 claim with the repeating sixteen-sound map anchored at MIDI note 36.",
   "at": "controls.encoder_knob2[1]"
  },
  {
   "round": 1,
   "error": "Storage 2(a-e): report gaps",
   "fixed": "Fill all five requested gaps: MIDI 3 downgrade trigger, themed backup editor choice, missing MIDI object defaults, NO FLASH loss of RAM-only user saves, and rejection of oversized UPB1 banks.",
   "at": "refresh/work/sloop.storage.json"
  },
  {
   "round": 1,
   "error": "Storage 2(d): no RAM-only save",
   "fixed": "State that NO FLASH keeps no RAM user-sound save.",
   "at": "controls.encoder_knob4[19]"
  },
  {
   "round": 1,
   "error": "3 MIDI LEARN CLEAR has no confirmation",
   "fixed": "Include immediate learned-CC deletion in the destructive-action summary.",
   "at": "overwrites_without_asking[11]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_f3[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_fs3[13]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_g3[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_gs3[12]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_a3[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_as3[12]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_b3[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_c4[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_cs4[12]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_d4[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_ds4[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_e4[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_f4[15]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_fs4[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_g4[14]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_gs4[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_a4[14]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_as4[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_b4[13]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_c5[13]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_cs5[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_d5[14]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_ds5[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_e5[14]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_f5[13]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_fs5[10]"
  },
  {
   "round": 1,
   "error": "11 SAMPLE LOOP switch required",
   "fixed": "For a user SAMPLE note with the engine LOOP switch on, if key-up ends the note (ARP, HOLD and sustain off), LOOP completes its current pass and LOOP+TAIL plays its ending; ENV REL may fade the sound sooner.",
   "at": "controls.key_g5[15]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_fs3[11]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_gs3[10]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_as3[10]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_cs4[10]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_ds4[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_fs4[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_gs4[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_as4[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_cs5[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_ds5[8]"
  },
  {
   "round": 1,
   "error": "12 Black-key chord modifiers under HOLD",
   "fixed": "With chord mode on, changes a chord while its white key is down; any extra chord tones join KBD HOLD; with chord mode off and KEYS set to WHITE it is silent, otherwise it latches its mapped note.",
   "at": "controls.key_fs5[8]"
  },
  {
   "round": 1,
   "error": "13 Loaded arp changes the meaning of HOLD",
   "fixed": "Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one. On the drum track, picks the kit.",
   "at": "controls.encoder_presets[0]"
  },
  {
   "round": 1,
   "error": "13 Loaded arp changes the meaning of HOLD",
   "fixed": "On the PRESETS page: Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
   "at": "controls.encoder_presets[1]"
  },
  {
   "round": 1,
   "error": "13 Loaded arp changes the meaning of HOLD",
   "fixed": "Browses favourites first, then factory sounds by kind and user sounds. A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one. The track's old sound and unsaved edits are replaced at once (no question, no undo).",
   "at": "controls.encoder_knob1[18]"
  },
  {
   "round": 1,
   "error": "13 Loaded arp changes the meaning of HOLD",
   "fixed": "Right: next engine, left: previous; loads that engine's first sound at once (no question, no undo). A running arp keeps its settings and held notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
   "at": "controls.encoder_knob2[18]"
  },
  {
   "round": 1,
   "error": "13 Loaded arp changes the meaning of HOLD",
   "fixed": "Loads the slot's sound onto the track (two clicks: the first shows AGAIN, the second within about 1.5 s acts); the track's sound and unsaved edits are replaced, no undo. A running arp keeps its settings and notes; Held keyboard notes stop; HOLD still enables keyboard hold if the loaded sound has no arp, or latches that arp if it brings one.",
   "at": "controls.encoder_knob2[19]"
  },
  {
   "round": 1,
   "error": "14 Drum-level label and display",
   "fixed": "Sets drum track volume, shown from 0 to 100 on the dial.",
   "at": "controls.encoder_knob4[22]"
  },
  {
   "round": 1,
   "error": "15 NEW LOOP label",
   "fixed": "Rename the overlay NEW LOOP to avoid suggesting stored sections are erased.",
   "at": "controls.encoder_knob4[21]"
  },
  {
   "round": 1,
   "error": "16 Clock out requires internal sync",
   "fixed": "Specify SYNC INT in the CLOCK control entry.",
   "at": "controls.encoder_knob4[1]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_f3[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_fs3[14]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_g3[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_gs3[13]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_a3[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_as3[13]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_b3[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_c4[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_cs4[13]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_d4[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_ds4[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_e4[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_f4[16]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_fs4[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_g4[15]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_gs4[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_a4[15]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_as4[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_b4[14]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_c5[14]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_cs5[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_d5[15]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_ds5[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_e5[15]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_f5[14]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_fs5[11]"
  },
  {
   "round": 1,
   "error": "17 POLY overdub continuation",
   "fixed": "While recording a synth track in POLY mode, a mapped note played into a tied step joins up to three notes already sustaining there, without retriggering them; four notes fit, so an older one may be displaced; step entry still replaces notes.",
   "at": "controls.key_g5[16]"
  },
  {
   "round": 1,
   "error": "17 ORD follows playing order",
   "fixed": "On the ARP page, selecting MODE ORD makes the arp follow the sequence of note presses even when ARP 2 ORD is SORT.",
   "at": "controls.encoder_knob1[23]"
  },
  {
   "round": 1,
   "error": "17 ARP swing while stopped",
   "fixed": "On ARP 2, SWG changes the arp timing while the transport is stopped as well as playing; rates without swing stay straight.",
   "at": "controls.encoder_knob1[24]"
  },
  {
   "round": 1,
   "error": "18 Stopped-only actions versus live sections",
   "fixed": "Limit the stopped-only claim to SECTION-page actions; distinguish SAVE-layer calls and stores.",
   "at": "modes[15]"
  },
  {
   "round": 1,
   "error": "19 Menu hints and SYSTEM fourth row",
   "fixed": "Shows section tabs and each setting with its knob; SYSTEM uses the fourth row for ABOUT instead of the key reminder, USB settings can show RESTART, and an unavailable second core shows NOT RUNNING.",
   "at": "controls.screen[18]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 1 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_f3[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_fs3[10]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 2 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_g3[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_gs3[9]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 3 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_a3[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_as3[9]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 4 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_b3[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 5 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_c4[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_cs4[9]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 6 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_d4[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_ds4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 7 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_e4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 8 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_f4[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_fs4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 9 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_g4[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_gs4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 10 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_a4[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_as4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 11 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_b4[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 12 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_c5[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_cs5[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 13 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_d5[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_ds5[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 14 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_e5[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 15 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_f5[7]"
  },
  {
   "round": 1,
   "error": "20 Black keys can be silent in step entry",
   "fixed": "Writes its mapped note into the cursor step, except with KEYS WHITE or chord mode, where this black key writes nothing; after all keys are released the cursor advances if a note entry was opened.",
   "at": "controls.key_fs5[7]"
  },
  {
   "round": 1,
   "error": "20 Rephrase the SEQ step action",
   "fixed": "Controls step 16 on the displayed page: pressing an empty step adds the selected drum hit or recent synth notes; an occupied step is removed on key-up unless a knob adjustment kept it.",
   "at": "controls.key_g5[7]"
  },
  {
   "round": 1,
   "error": "20 Pattern rotate leaves step metadata behind",
   "fixed": "Shifts the note or drum steps right or left by one position, while nudges, parameter locks and fill conditions stay at their old step positions.",
   "at": "controls.encoder_knob1[10]"
  },
  {
   "round": 1,
   "error": "20 Pattern resize leaves step metadata behind",
   "fixed": "Right copies the note or drum steps into a second pass, up to 64 steps; left halves the length; nudges, parameter locks and fill conditions are not copied or moved.",
   "at": "controls.encoder_knob2[10]"
  },
  {
   "round": 1,
   "error": "20 Rephrase layer lock",
   "fixed": "Rewrite the locked-layer description in original wording.",
   "at": "modes[31]"
  },
  {
   "round": 1,
   "error": "21 Favourite doc line",
   "fixed": "Point the power-off persistence claim to GUIDE line 601.",
   "at": "disagreements[9].docs_ref"
  },
  {
   "round": 1,
   "error": "21 Live DRUMS page switch",
   "fixed": "Cite layer_tap, which handles the actual page cycling.",
   "at": "disagreements[7].source_ref"
  },
  {
   "round": 1,
   "error": "22 Second-core OFF timing disagreement",
   "fixed": "Record that OFF changes the render split immediately, unlike the release-note claim.",
   "at": "disagreements[10]"
  },
  {
   "round": 1,
   "error": "22 Backup tab name disagreement",
   "fixed": "Record the guide’s old tab name and the current Song & sections tab.",
   "at": "disagreements[11]"
  },
  {
   "round": 1,
   "error": "7 Backup navigation",
   "fixed": "Change the Full backup row to Song & sections, Backup; the mismatch is now recorded in disagreements.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "23 REMOTE order and TRS disconnect",
   "fixed": "Give every CC-to-button assignment and warn that TRS unplug does not release remote REC.",
   "at": "controls.encoder_knob3[1]"
  },
  {
   "round": 1,
   "error": "23 REMOTE input safety",
   "fixed": "Explain remote assignments and missing TRS disconnect release at the input jack.",
   "at": "jack_notes[1]"
  },
  {
   "round": 1,
   "error": "23 ABOUT status and late-core fallback",
   "fixed": "Shows version, build date, credits, source and supply voltages, plus 2 CORES, 1 CORE or C1 OFF; if the second core misses its deadline, SLOOP uses one core until another power-on.",
   "at": "controls.screen[19]"
  },
  {
   "round": 1,
   "error": "23 ABOUT third label",
   "fixed": "Include C1 OFF and the until-power-on fallback after a late core.",
   "at": "modes[33]"
  },
  {
   "round": 1,
   "error": "23 Second-core late fallback",
   "fixed": "Mention the recovery limit after a late second-core job.",
   "at": "controls.encoder_knob1[17]"
  },
  {
   "round": 1,
   "error": "1 MIDI 3 and 2.5 loss in switching prose",
   "fixed": "Carry the MIDI 3 downgrade warning into the owner-facing switching paragraph.",
   "at": "switching_note.lost"
  },
  {
   "round": 1,
   "error": "1 Owner guide",
   "fixed": "Include MIDI 3 in the 2.5 SYN-kit-loss warning.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "2 Owner guide",
   "fixed": "Explain default MIDI restoration without object 10.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "3 Owner guide",
   "fixed": "State immediate learned-CC deletion and conditional core enabling.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "4 Owner guide",
   "fixed": "State song-order deletion during section erase.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "5 Owner guide",
   "fixed": "Explain favourite references, pending saves and the stopped-menu save trigger.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "6 Owner guide",
   "fixed": "Use the 2.7.1 editor when restoring a themed backup onto 2.6.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "8 Owner guide",
   "fixed": "Guarantee GRID with SELECT fully left after reopening DRUMS.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "9 Owner guide",
   "fixed": "Limit positive DECAY to synthesised kits.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "10 Owner guide",
   "fixed": "Anchor the repeating drum MIDI map at note 36.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "11 Owner guide",
   "fixed": "Require the SAMPLE engine LOOP switch.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "12 Owner guide",
   "fixed": "Include black-key changes to held chord tones.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "13 Owner guide",
   "fixed": "Qualify HOLD after a sound loads its own arp.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "14 Owner guide",
   "fixed": "Show drum volume as 0-100.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "17 Owner guide",
   "fixed": "Match the new JSON overdub, ORD and stopped-swing entries.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "18 Owner guide",
   "fixed": "Distinguish SECTION-page restrictions from live section shortcuts.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "19 Owner guide",
   "fixed": "Describe SYSTEM help and status hints.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "20 Owner guide",
   "fixed": "Rephrase step behavior and describe unchanged metadata positions.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "22 Owner guide",
   "fixed": "Render the two additional guide/source disagreements.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "23 Owner guide",
   "fixed": "Give remote CC assignments, TRS release risk and all core status labels.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 1,
   "error": "5 Favourite persistence wording",
   "fixed": "Explain the pending-settings save in plain owner wording, keeping the corrected GUIDE line 601 citation.",
   "at": "disagreements[9]"
  },
  {
   "round": 1,
   "error": "Round 1 record",
   "fixed": "Record all reported corrections and no disputes; historical v2.6 check fields remain intact.",
   "at": "refresh_check_fixes"
  },
  {
   "round": 2,
   "error": "1 ORD names and label",
   "fixed": "Use NOTE, the actual ARP 2 ORD value, and label the KNOB 1 job ARP MODE ORD to distinguish it from KNOB 4.",
   "at": "controls.encoder_knob1[23]"
  },
  {
   "round": 2,
   "error": "1 ORD names and label",
   "fixed": "Replace SORT with NOTE in the ARP MODE explanation.",
   "at": "control-maps/sloop.md"
  },
  {
   "round": 2,
   "error": "2 Restore defaults without MIDI object",
   "fixed": "Add the default MIDI reset when a 2.5.1-or-later backup omits object 10.",
   "at": "overwrites_without_asking[9]"
  },
  {
   "round": 2,
   "error": "3 Historical editor refusal citation",
   "fixed": "Add the v2.6 editor’s supported object list and its rejection of unsupported objects, pinned to d30d655.",
   "at": "switching_note.source"
  },
  {
   "round": 2,
   "error": "3 Historical editor refusal citation",
   "fixed": "Add the same historical source evidence for the v2.6 editor’s refusal of theme object 11.",
   "at": "refresh/work/sloop.storage.json.changes[27].source"
  },
  {
   "round": 3,
   "error": "1 Deliberate older-release citations",
   "fixed": "Use historical_comparison and compared_commit for the v2.6 editor evidence; keep its commit-pinned URL.",
   "at": "switching_note.source[46]"
  },
  {
   "round": 3,
   "error": "1 Deliberate older-release citations",
   "fixed": "Use historical_comparison and compared_commit for the v2.6 editor evidence; keep its commit-pinned URL.",
   "at": "switching_note.source[47]"
  },
  {
   "round": 3,
   "error": "1 Deliberate older-release citations",
   "fixed": "Use historical_comparison and compared_commit for the v2.6 editor evidence; keep its commit-pinned URL.",
   "at": "refresh/work/sloop.storage.json.changes[27].source[1]"
  },
  {
   "round": 3,
   "error": "1 Deliberate older-release citations",
   "fixed": "Use historical_comparison and compared_commit for the v2.6 editor evidence; keep its commit-pinned URL.",
   "at": "refresh/work/sloop.storage.json.changes[27].source[2]"
  }
 ],
 "checker_disputes_refresh": []
}