{
 "firmware": "SLOOP Floyd FM",
 "slug": "floyd",
 "author": "René Bohne, based on SLOOP by isod89 (3dSam) and Felucca by Leo Kuroshita (Hügelton Instruments)",
 "repo": "https://github.com/renebohne/sloop-fm1",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v2.4",
 "mapped_commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
 "release_date": "2026-10-06",
 "date_mapped": "2026-10-17",
 "status": "Independently checked: zero errors in round 4 (2026-10-17). No device testing.",
 "turns_it_into": "A four-track groovebox with a four-operator FM engine and coloured envelope and routing views.",
 "docs": [
  {
   "title": "Overview",
   "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/README.md",
   "read_at": "2026-10-17"
  },
  {
   "title": "SLOOP guide",
   "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/SLOOP.md",
   "read_at": "2026-10-17"
  },
  {
   "title": "Licensing",
   "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/LICENSING.md",
   "read_at": "2026-10-17"
  }
 ],
 "install": {
  "official": "https://github.com/renebohne/sloop-fm1/releases/tag/v2.4",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "SEL is B_SCL in source; PLAY/STOP is B_PLAY and OCT-/OCT+ are B_OCTDN/B_OCTUP; keys run from F3 to G5, with white-key numbers counted left to right; button lamps live in lights under their button ids and key lamps in lights.key_lights, as listed by groups.key_lights; calibration can change the physical button and encoder mapping.",
 "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "100-146",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L100-L146"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1012-1034",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
    }
   ]
  },
  {
   "id": "chord_mode",
   "name": "Chord mode on a synth track",
   "how_to_get_there": "Hold SEL and set KNOB 1 to a chord type.",
   "what_it_is": "White keys play chords from the selected scale, rooted from C4; black keys are silent, and CHR uses natural minor for chord building.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "140-174",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L140-L174"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "997-1010",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "199-280",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L199-L280"
    }
   ]
  },
  {
   "id": "pages",
   "name": "A button's pages",
   "how_to_get_there": "Tap a page-family button.",
   "what_it_is": "Four knob columns per page; a family button first reopens its last page and later taps cycle, while SELECT remains tempo.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "277-314",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L277-L314"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "428-473",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L428-L473"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-201",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
    }
   ]
  },
  {
   "id": "step_page",
   "name": "SEQ STEP page (synth tracks)",
   "how_to_get_there": "On a synth track tap SEQ, then cycle its remembered STEP, PATTERN and SONG pages until STEP appears.",
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "372-405",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L405"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-201",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "309-311",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L309-L311"
    }
   ]
  },
  {
   "id": "save_pages",
   "name": "SAVE pages",
   "how_to_get_there": "Tap SAVE away from TRACKS, DRUMS and SONG.",
   "what_it_is": "PRESETS browses sounds, USER stores 32 user sounds, PROJECT loads or stores four sections, and TOOLS resets patterns, sounds or the loop.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "303-306",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L303-L306"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "286-370",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L286-L370"
    }
   ]
  },
  {
   "id": "save_presets",
   "name": "SAVE > PRESETS page",
   "how_to_get_there": "Cycle SAVE to PRESETS.",
   "what_it_is": "Factory sounds grouped by kind followed by stored user sounds; no device favourites.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "357-397",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L357-L397"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "286-294",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L286-L294"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "296-313",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L296-L313"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/upreset.c",
     "lines": "17-33",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L17-L33"
    }
   ]
  },
  {
   "id": "save_project",
   "name": "SAVE > SECTION page",
   "how_to_get_there": "Cycle SAVE to PROJECT.",
   "what_it_is": "Four stored sections A–D, displayed as numbered project slots, with load and save controls but no erase control.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "114-117",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L114-L117"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "305",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L305"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/project.c",
     "lines": "309-359",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L309-L359"
    }
   ]
  },
  {
   "id": "save_tools",
   "name": "SAVE > TOOLS page",
   "how_to_get_there": "Cycle SAVE to TOOLS.",
   "what_it_is": "Two rightward turns arm and execute pattern clear, sound reset or a new working loop.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "322-365",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L365"
    }
   ]
  },
  {
   "id": "drums_grid",
   "name": "DRUMS screen, grid page",
   "how_to_get_there": "Select track 4 and tap EDIT or SEQ from TRACKS to reopen the last GRID or KIT page, then tap either again if needed for GRID.",
   "what_it_is": "A sixteen-lane drum grid edited with knobs; the keyboard still plays drum sounds here.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "309-407",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L309-L407"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "9-11",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L9-L11"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "108-116",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L108-L116"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "435-444",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L444"
    }
   ]
  },
  {
   "id": "drums_kit",
   "name": "DRUMS screen, kit page",
   "how_to_get_there": "Select track 4 and tap EDIT or SEQ from TRACKS to reopen the last GRID or KIT page, then tap either again if needed for KIT.",
   "what_it_is": "Sixteen pads show drum hits; the knobs set kit, level, reverb and pan.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "370-405",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L370-L405"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "9-11",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L9-L11"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "108-116",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L108-L116"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "435-444",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L444"
    }
   ]
  },
  {
   "id": "song_screen",
   "name": "SONG screen",
   "how_to_get_there": "Tap SAVE on TRACKS or DRUMS, hold SAVE and use white key 16, or cycle SEQ to SONG.",
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_song.c",
     "lines": "19-84",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L19-L84"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "309-311",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L309-L311"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-201",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
    }
   ]
  },
  {
   "id": "stopped",
   "name": "Transport stopped",
   "how_to_get_there": "Stop with PLAY.",
   "what_it_is": "The loop is stopped, allowing flash saves and song edits; user sounds can still load during playback.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "718-726",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L718-L726"
    }
   ]
  },
  {
   "id": "playing",
   "name": "Transport playing",
   "how_to_get_there": "Press PLAY.",
   "what_it_is": "All four tracks loop.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1252-1294",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1252-L1294"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1405-1448",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1405-L1448"
    }
   ]
  },
  {
   "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 performs the saved section order, while REC is refused during song playback and arms ordinary loop recording when stopped.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "282-288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L282-L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_studio.c",
     "lines": "122-140",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L122-L140"
    }
   ]
  },
  {
   "id": "rec_ready",
   "name": "REC armed (rec ready)",
   "how_to_get_there": "Press REC while stopped.",
   "what_it_is": "An empty loop starts a free take with the first note; existing music starts loop recording with that note, while PLAY can start loop recording directly and KNOB 1–4 do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "749-765",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L749-L765"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1476-1487",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1476-L1487"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "696-699",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
    }
   ]
  },
  {
   "id": "free_take",
   "name": "Free take",
   "how_to_get_there": "Arm an empty loop with REC, then play a note.",
   "what_it_is": "Play freely, then press REC to fit a one-, two- or four-bar loop with notes rounded to the grid, or press PLAY to discard the take; it closes itself after 24 seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "373-380",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L373-L380"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "492-562",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L492-L562"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "591-640",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L591-L640"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "734-775",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L734-L775"
    }
   ]
  },
  {
   "id": "layer_fx",
   "name": "FX layer (punch)",
   "how_to_get_there": "Hold FX.",
   "what_it_is": "Sixteen white keys hold effects over the whole mix, while three knobs set master filter, dust and duck.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "333-340",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L333-L340"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/punch.c",
     "lines": "12-19",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L19"
    }
   ]
  },
  {
   "id": "layer_erase",
   "name": "EDIT layer (erase)",
   "how_to_get_there": "Hold EDIT.",
   "what_it_is": "Erase a note or drum sound with a key, rotate, resize or transpose patterns with knobs, and undo or redo notes and length with OCT-/OCT+.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "565-619",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L565-L619"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "341-348",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L341-L348"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "874-932",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L874-L932"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "100-158",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L100-L158"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "237-245",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L237-L245"
    }
   ]
  },
  {
   "id": "layer_steps_held",
   "name": "SEQ layer with step keys held",
   "how_to_get_there": "Hold SEQ and one or more white step keys.",
   "what_it_is": "Edit pitches or drum lane, four hit levels and ratchets; KNOB 4 still sets track length, with no parameter locks, fills or nudge.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "159-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L202"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "353-374",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "247-251",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L251"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "376-390",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L376-L390"
    }
   ]
  },
  {
   "id": "layer_mix",
   "name": "GLO layer (mix)",
   "how_to_get_there": "Hold GLO.",
   "what_it_is": "White keys 1–4 mute, 5–8 solo and 16 taps tempo, while four knobs set track levels.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "306-313",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L313"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "392-395",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L392-L395"
    }
   ]
  },
  {
   "id": "layer_song",
   "name": "SAVE layer (song)",
   "how_to_get_there": "Hold SAVE.",
   "what_it_is": "White keys 1–4 recall sections, 5–8 store them, 13 switches song mode, 14 records the section order and 16 opens SONG.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_layers.c",
     "lines": "254-304",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "502-543",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L502-L543"
    }
   ]
  },
  {
   "id": "menu",
   "name": "HOME menu",
   "how_to_get_there": "Hold HOME for 0.7 seconds.",
   "what_it_is": "Six choices: COLOR, LOWCUT, ZOOM, HARDWARE CALIBRATION, ABOUT and BACK, using PRESETS, KNOB 1 and OCT+/OCT-.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_menu.c",
     "lines": "5-6",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L5-L6"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_menu.c",
     "lines": "83-129",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L83-L129"
    }
   ]
  },
  {
   "id": "about",
   "name": "ABOUT screen",
   "how_to_get_there": "Choose ABOUT in the HOME menu with PRESETS, then press OCT+.",
   "what_it_is": "Version, build date and credits, still bearing the parent SLOOP name.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_menu.c",
     "lines": "24-40",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L24-L40"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Hardware calibration",
   "how_to_get_there": "Power on holding OCT- and OCT+, or open HARDWARE CALIBRATION in the HOME menu.",
   "what_it_is": "Press each named button and turn each named knob right, with 30 seconds of inactivity retaining the old mapping; a power-on attempt saves settings afterward only when the bytes differ.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "791-856",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L791-L856"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/main.c",
     "lines": "139-143",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L139-L143"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/project.c",
     "lines": "507-525",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L507-L525"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/recovery.c",
     "lines": "41-70",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/recovery.c#L41-L70"
    }
   ]
  },
  {
   "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": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/main.c",
     "lines": "172-200",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L172-L200"
    }
   ]
  },
  {
   "id": "arp_hold",
   "name": "Arpeggiator HOLD",
   "how_to_get_there": "Turn on an ARP mode, then set HOLD on ARP 2.",
   "what_it_is": "The arpeggiator keeps the notes after release; a new press after every key is released replaces its held set.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "57",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L57"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "308",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "622-649",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L649"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "768-784",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L784"
    }
   ]
  },
  {
   "id": "env",
   "name": "ENV",
   "how_to_get_there": "Tap ENV until ENV appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "278",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "env_dest",
   "name": "ENV DEST",
   "how_to_get_there": "Tap ENV until ENV DEST appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "279",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "lfo_page",
   "name": "LFO",
   "how_to_get_there": "Tap LFO until LFO appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "280",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "lfo_dest",
   "name": "LFO DEST",
   "how_to_get_there": "Tap LFO until LFO DEST appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "281",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "fx_page",
   "name": "FX",
   "how_to_get_there": "Tap FX until FX appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "282",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "slicer",
   "name": "SLICER",
   "how_to_get_there": "Tap FX until SLICER appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "283",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "delay",
   "name": "DLY",
   "how_to_get_there": "Tap FX until DLY appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "284",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "reverb_chorus",
   "name": "REV/CHO",
   "how_to_get_there": "Tap FX until REV/CHO appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "285",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "scale_page",
   "name": "SCL",
   "how_to_get_there": "Tap SEL until SCL appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "286",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "scale2",
   "name": "SCL 2",
   "how_to_get_there": "Tap SEL until SCL 2 appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "287",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "voice_page",
   "name": "VOICE",
   "how_to_get_there": "Tap EDIT until VOICE appears. Normally available with a non-Floyd synth engine selected.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "290",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "voice2",
   "name": "VOICE 2",
   "how_to_get_there": "Tap EDIT until VOICE 2 appears. Normally available with a non-Floyd synth engine selected.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "291",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "global_page",
   "name": "GLOBAL",
   "how_to_get_there": "Tap GLO until GLOBAL appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "299",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "master_page",
   "name": "MASTER",
   "how_to_get_there": "Tap GLO until MASTER appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "300",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "system_page",
   "name": "SYSTEM",
   "how_to_get_there": "Tap GLO until SYSTEM appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "301",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "drum_settings",
   "name": "DRUMS settings",
   "how_to_get_there": "Tap GLO until DRUMS settings appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "302",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "arp_page",
   "name": "ARP",
   "how_to_get_there": "Tap ARP until ARP appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "307",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "arp2",
   "name": "ARP 2",
   "how_to_get_there": "Tap ARP until ARP 2 appears.",
   "what_it_is": "Four knob columns for synth tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "308",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "pattern_page",
   "name": "PATTERN",
   "how_to_get_there": "Tap SEQ until PATTERN appears.",
   "what_it_is": "Four knob columns for all tracks; blank columns do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "310",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "183-202",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
    }
   ]
  },
  {
   "id": "edit1_analog",
   "name": "ANALOG OSC",
   "how_to_get_there": "Choose ANALOG, then tap EDIT until OSC appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are WAVE, DTN, MIX, NOIS.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_analog.c",
     "lines": "123-126",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L123-L126"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_analog",
   "name": "ANALOG FLT",
   "how_to_get_there": "Choose ANALOG, then tap EDIT until FLT appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are CUT, RES, DRV, KTR.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_analog.c",
     "lines": "127-130",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L127-L130"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_digital",
   "name": "DIGITAL OPS",
   "how_to_get_there": "Choose DIGITAL, then tap EDIT until OPS appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are ALG, R2, R3, R4.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_digital.c",
     "lines": "138-141",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L138-L141"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_digital",
   "name": "DIGITAL MOD",
   "how_to_get_there": "Choose DIGITAL, then tap EDIT until MOD appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are IDX, MDEC, FB, blank.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_digital.c",
     "lines": "142-145",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L142-L145"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_phase",
   "name": "PHASE PHS",
   "how_to_get_there": "Choose PHASE, then tap EDIT until PHS appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are WAVE, WAVE2, DCW, ENV.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_phase.c",
     "lines": "184-187",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L184-L187"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_phase",
   "name": "PHASE LINE",
   "how_to_get_there": "Choose PHASE, then tap EDIT until LINE appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are DTN, LINE, SUB, blank.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_phase.c",
     "lines": "188-191",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L188-L191"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_lofi",
   "name": "LOFI CHIP",
   "how_to_get_there": "Choose LOFI, then tap EDIT until CHIP appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are CHIP, WAVE, DUTY, CRSH.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_lofi.c",
     "lines": "215-218",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L215-L218"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_lofi",
   "name": "LOFI MOTN",
   "how_to_get_there": "Choose LOFI, then tap EDIT until MOTN appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are SWP, VIB, ARP, TONE.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_lofi.c",
     "lines": "219-222",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L219-L222"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_sample",
   "name": "SAMPLE SET",
   "how_to_get_there": "Choose SAMPLE, then tap EDIT until SET appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are SET, TUNE, BITS, LOOP.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_sample.c",
     "lines": "205-208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L205-L208"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_sample",
   "name": "SAMPLE TONE",
   "how_to_get_there": "Choose SAMPLE, then tap EDIT until TONE appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are CUT, blank, DRV, blank.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_sample.c",
     "lines": "209-212",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L209-L212"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_voice",
   "name": "VOICE VOWL",
   "how_to_get_there": "Choose VOICE, then tap EDIT until VOWL appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are VOWL, VOWL2, TALK, SHIFT.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_formant.c",
     "lines": "225-228",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L225-L228"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_voice",
   "name": "VOICE TONE",
   "how_to_get_there": "Choose VOICE, then tap EDIT until TONE appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are BUZZ, BRTH, Q, RAND.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_formant.c",
     "lines": "229-232",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L229-L232"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_trio",
   "name": "TRIO OSC",
   "how_to_get_there": "Choose TRIO, then tap EDIT until OSC appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are WAVE, INT2, INT3, DTN.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_trio.c",
     "lines": "376-379",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L376-L379"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_trio",
   "name": "TRIO TONE",
   "how_to_get_there": "Choose TRIO, then tap EDIT until TONE appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are MODE, CUT, RES, PW.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_trio.c",
     "lines": "380-383",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L380-L383"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_wheel",
   "name": "WHEEL BARS",
   "how_to_get_there": "Choose WHEEL, then tap EDIT until BARS appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are REG, SUB, BODY, TOP.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_drawbar.c",
     "lines": "282-285",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L282-L285"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_wheel",
   "name": "WHEEL TONE",
   "how_to_get_there": "Choose WHEEL, then tap EDIT until TONE appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are PERC, CLICK, DRV, ROTR.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_drawbar.c",
     "lines": "286-289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L286-L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit1_grain",
   "name": "GRAIN GRAN",
   "how_to_get_there": "Choose GRAIN, then tap EDIT until GRAN appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are SRC, POS, SIZE, DENS.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "288",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_grain.c",
     "lines": "434-437",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L434-L437"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "edit2_grain",
   "name": "GRAIN SPRY",
   "how_to_get_there": "Choose GRAIN, then tap EDIT until SPRY appears, reopening its last page first when returning from another family.",
   "what_it_is": "The four columns are PTCH, SPRD, RAND, TONE.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "289",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L289"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_grain.c",
     "lines": "438-441",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L438-L441"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_draw.c",
     "lines": "1193-1208",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
    }
   ]
  },
  {
   "id": "floyd_algo",
   "name": "Floyd ALGO",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until ALGO appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "292",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L292"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_op1",
   "name": "Floyd OP1",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until OP1 appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "293",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L293"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_op2",
   "name": "Floyd OP2",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until OP2 appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "294",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L294"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_op3",
   "name": "Floyd OP3",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until OP3 appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "295",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L295"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_op4",
   "name": "Floyd OP4",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until OP4 appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "296",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L296"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_level",
   "name": "Floyd LEVEL",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until LEVEL appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "297",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L297"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "floyd_ratio",
   "name": "Floyd RATIO",
   "how_to_get_there": "Choose the FLOYD engine, then tap EDIT until RATIO appears.",
   "what_it_is": "Floyd editing normally opens this page, but changing track can leave it visible for another synth and keep editing that track’s values.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "298",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L298"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "322-329",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    }
   ]
  },
  {
   "id": "pattern_controls",
   "name": "Pattern controls outside SONG",
   "how_to_get_there": "Use a page outside SONG and the HOME menu.",
   "what_it_is": "Holding REC can clear the selected track here.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "594-642",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L594-L642"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui_input.c",
     "lines": "665-669",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L665-L669"
    }
   ]
  },
  {
   "id": "update_transfer",
   "name": "Firmware update transfer",
   "how_to_get_there": "Start a firmware install over USB.",
   "what_it_is": "The firmware displays each update stage and a failure code if a stage fails.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/felucca.c",
     "lines": "142-167",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/felucca.c#L142-L167"
    }
   ]
  },
  {
   "id": "retained_floyd_page",
   "name": "Floyd page after a track change",
   "how_to_get_there": "Open a Floyd EDIT page, then turn ALGORITHM to a different synth track.",
   "what_it_is": "The page stays open and acts on the newly selected track; use EDIT or HOME to leave it.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "421-432",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "372-405",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L372-L405"
    }
   ]
  }
 ],
 "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "718-726",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L718-L726"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "718-726",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L718-L726"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1252-1262",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1252-L1262"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "action": "Starts the loop and selected-track recording immediately, including in an empty project.",
    "short_label": "REC START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1476-1487",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1476-L1487"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "547-562",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L547-L562"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "98-101",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L98-L101"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while the menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "665-669",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L665-L669"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "84-128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L84-L128"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "122-140",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L122-L140"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "122-140",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L122-L140"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "122-140",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L122-L140"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "press",
    "action": "Closes a free take into a 1, 2 or 4 bar loop at a fitted tempo, rounds its notes to the grid and starts playback.",
    "short_label": "CLOSE LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "492-538",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L492-L538"
     }
    ]
   },
   {
    "mode": "pattern_controls",
    "gesture": "long_press",
    "action": "Outside SONG and the HOME menu, holding REC for about 2 seconds clears the selected track’s pattern after the ring, with early release cancelling, one-level undo restoring notes and length, and autosave storing the result later.",
    "short_label": "CLEAR TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "594-642",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L594-L642"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "734-741",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L734-L741"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "135-159",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L135-L159"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Stores the working loop into the cursor’s section in flash while stopped, asking for a second REC within 3 seconds only if that section is readable, with no panel undo and no saved copy of Floyd’s extra operator edits.",
    "short_label": "STORE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "104-132",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L104-L132"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "309-322",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L309-L322"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "18-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L18-L22"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A short tap goes to TRACKS when released.",
    "short_label": "TRACKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "710-711",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L710-L711"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "204-216",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L204-L216"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "417-419",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L417-L419"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "92",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L92"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held 0.7 s: opens the menu.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "408-426",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L408-L426"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "653-668",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L653-L668"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "long_press",
    "action": "Held for 0.7 seconds: closes the menu and returns to TRACKS, writing changed settings at once while stopped or deferring the write until quiet after playback.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "653-668",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L653-L668"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "72-80",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L72-L80"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_fx",
    "action": "A short HOME tap locks the FX layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "action": "A short HOME tap locks the EDIT layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_arp",
    "action": "A short HOME tap locks the ARP layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "action": "A short HOME tap locks the SEQ layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_sel",
    "action": "A short HOME tap locks the SEL layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "action": "A short HOME tap locks the GLO layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "A short HOME tap locks the SAVE layer open so both hands are free once HOME is released, with LOCK on screen.",
    "short_label": "LOCK LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "522-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L522-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "498-506",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L498-L506"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "739-741",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L739-L741"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "183-202",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L202"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278-279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278-L279"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens LFO or LFO DEST, cycling to the next page on each press.",
    "short_label": "LFO PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "742-744",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L742-L744"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280-L281"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A tap shorter than 0.45 seconds with no other control used cycles FX, SLICER, DLY and REV/CHO on release.",
    "short_label": "FX PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-434",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L428-L434"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "508-527",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L508-L527"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282-285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282-L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "31-32",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L31-L32"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Holding FX gives the white keys sixteen punch-in effects and shows their layer after 0.14 seconds.",
    "short_label": "PUNCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "31-32",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L31-L32"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-19",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L19"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A tap cycles SCL and SCL 2 on release.",
    "short_label": "SEL PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "458-460",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L458-L460"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286-287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286-L287"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the key and chord layer.",
    "short_label": "KEY/CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "458-460",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L458-L460"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A tap reopens the last valid EDIT page, then cycles the selected engine’s two named pages, VOICE and VOICE 2, or Floyd’s ALGO, OP1–OP4, LEVEL and RATIO pages.",
    "short_label": "EDIT PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-454",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L454"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "288-298",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L288-L298"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "322-329",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L322-L329"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "183-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
     }
    ]
   },
   {
    "mode": "tracks",
    "gesture": "release",
    "action": "On the drum track, a tap from TRACKS opens DRUMS on the last GRID or KIT page used.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-444",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L444"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "9-11",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L9-L11"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "release",
    "action": "Switches to the kit page.",
    "short_label": "KIT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "437-440",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L437-L440"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "release",
    "action": "A tap returns from KIT to GRID.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "437-440",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L437-L440"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Clears the step under the cursor and moves to the next.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "446-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L446-L450"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the erase layer.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-454",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L454"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "release",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "455-457",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L455-L457"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the note-repeat layer (not the arpeggiator).",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "455-457",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L455-L457"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A tap reopens the last SEQ page used, then later taps cycle STEP, PATTERN and SONG.",
    "short_label": "SEQ PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-454",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L454"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "183-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
     }
    ]
   },
   {
    "mode": "tracks",
    "gesture": "release",
    "action": "On the drum track, a tap from TRACKS opens DRUMS on the last GRID or KIT page used.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-444",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L444"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "9-11",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L9-L11"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "release",
    "action": "Switches to the kit page.",
    "short_label": "KIT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "437-440",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L437-L440"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "release",
    "action": "A tap returns from KIT to GRID.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "437-440",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L437-L440"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "release",
    "action": "Leaves the SONG screen for the SEQ pages.",
    "short_label": "SEQ PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-454",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L454"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the step-entry layer.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "435-454",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L435-L454"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "A tap cycles GLOBAL, MASTER, SYSTEM and DRUMS on release.",
    "short_label": "GLO PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "461-463",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L461-L463"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299-302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299-L302"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the mix layer.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "461-463",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L461-L463"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "tracks",
    "gesture": "release",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L473"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "release",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L473"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "release",
    "action": "Opens the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L473"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "release",
    "action": "A tap writes the song order to settings flash while stopped without a question or panel undo, or refuses during playback.",
    "short_label": "SAVE SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-466",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L466"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "533-543",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L533-L543"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "release",
    "action": "A tap reopens the last SAVE-family page used, then later taps cycle PRESETS, USER, PROJECT and TOOLS on release.",
    "short_label": "SAVE PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L473"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "303-306",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L303-L306"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "183-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L183-L201"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: the song layer.",
    "short_label": "SONG LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "464-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L464-L473"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "493-564",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L493-L564"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "hold",
    "action": "While held, keys hit at ghost level.",
    "short_label": "GHOST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Restores one track’s previous notes and pattern length from its single undo snapshot, leaving sound changes alone.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "565-576",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L565-L576"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "135-159",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L135-L159"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "578-586",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L578-L586"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "874-892",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L874-L892"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "104-112",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L104-L112"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Closes the menu and saves changed settings while stopped or later when quiet, or returns from ABOUT to the menu list.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "72-93",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L72-L93"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/main.c",
      "lines": "172-200",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L172-L200"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "hold",
    "action": "While held, keys hit at hard level.",
    "short_label": "HARD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "728-736",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L728-L736"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "565-576",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L565-L576"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "135-159",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L135-L159"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "578-586",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L578-L586"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "938-941",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L938-L941"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "874-892",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L874-L892"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "press",
    "action": "Two presses within 3 seconds load the cursor’s section while stopped, replacing unsaved loop edits without panel undo and leaving Floyd’s extra operator edits as they are.",
    "short_label": "LOAD X2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "104-122",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L104-L122"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "344-359",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L344-L359"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Changes the selected colour or LOWCUT or ZOOM choice, opens calibration or ABOUT, or closes the menu at BACK, with changed settings saved on close without another question.",
    "short_label": "OK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "102-129",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L102-L129"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "507-525",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L507-L525"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/recovery.c",
      "lines": "41-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/recovery.c#L41-L70"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/bootguard.h",
      "lines": "27-30",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/bootguard.h#L27-L30"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/main.c",
      "lines": "281-283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L281-L283"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Starts button and knob calibration, retaining the old mapping on a 30-second timeout, then attempts a settings save without asking and writes only if the saved bytes differ.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/main.c",
      "lines": "139-143",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "791-856",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L791-L856"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "507-525",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L507-L525"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "764-766",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L764-L766"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "764-766",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L764-L766"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "681-694",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L681-L694"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "764-766",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L764-L766"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "436-438",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L436-L438"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM, with faster turns moving farther.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "436-438",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L436-L438"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "166-172",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L166-L172"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Does nothing in the menu.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "95-97",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L95-L97"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L128"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Does nothing on the SONG screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "152-153",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L152-L153"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Loads factory sounds by kind followed by stored user sounds, replacing the track’s sound edits and releasing its held notes without a question or panel undo, or selects a drum kit on the drum track.",
    "short_label": "SOUND/KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "752-760",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L752-L760"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "240-275",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L240-L275"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "357-397",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L357-L397"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "240-263",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L240-L263"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Loads factory or stored user sounds only on PRESETS, replacing sound edits and releasing held notes without asking or making an undo copy, while USER, PROJECT and TOOLS ignore this encoder.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "752-760",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L752-L760"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "240-275",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L240-L275"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "240-263",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L240-L263"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Ignored on the other pages so a stray turn cannot replace the sound being edited.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "752-760",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L752-L760"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "440-447",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L440-L447"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "440-447",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L440-L447"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Does nothing while the SEQ layer is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "686-687",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L686-L687"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves through the six menu rows, wrapping at the ends.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "95-96",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L95-L96"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "short_label": "FLOYD SOUND",
    "action": "Browses FLOYD TINE, DUAL LEAD, STACK BASS, ORGAN 4, CRYSTAL, METALLIC, WARM SINE and VELVET PAD among the factory sounds, loading each selection immediately without an undo copy.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "320-342",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L320-L342"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "385-397",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L385-L397"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "197-207",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L197-L207"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "762-763",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L762-L763"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "686-687",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L686-L687"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "420-431",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L420-L431"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "152-153",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L152-L153"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L128"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "440-447",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L440-L447"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "440-447",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L440-L447"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Does nothing while the SEQ layer is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "686-687",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L686-L687"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Global swing for all tracks; Fast turns increase the change on broad numeric ranges.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "180-205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L180-L205"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets column 1 of the current page, with faster turns moving farther on broad ranges and no change for an empty column or DRUM TRACK.",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "269-370",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L269-L370"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "357-408",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L357-L408"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "208-239",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L208-L239"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Chooses the drum sound whose hits the GRID knobs edit, without auditioning it.",
    "short_label": "DRUM LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "451-467",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L451-L467"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Picks the drum kit.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "469-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L469-L473"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "turn",
    "action": "Moves the cursor through the song entries.",
    "short_label": "ENTRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "135-150",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L135-L150"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Does nothing while REC READY is shown.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "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; Faster turns increase the change.",
    "short_label": "MASTER FILT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "333-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L333-L340"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Rotates the selected track’s note or drum steps one position right or left, with wraparound.",
    "short_label": "SHIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "49-66",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L49-L66"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "349-352",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L349-L352"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "Chooses the drum lane or single synth note for new steps, without auditioning it.",
    "short_label": "SOUND/NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "359-365",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L359-L365"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "159-202",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L202"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "376-390",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L376-L390"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 1; Fast turns increase the change on broad numeric ranges.",
    "short_label": "LEVEL T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "392-395",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L392-L395"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "332-399",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L332-L399"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes COLOR, LOWCUT or ZOOM on the selected menu row, with calibration, ABOUT and BACK needing OCT+.",
    "short_label": "SETTING 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "97-128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L97-L128"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Loads the chosen factory or stored user sound immediately, releasing held notes and replacing unsaved sound edits without a question or panel undo.",
    "short_label": "LOAD SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "286-290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L286-L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "240-275",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L240-L275"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "385-397",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L385-L397"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "240-263",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L240-L263"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Picks user slot 1-32.",
    "short_label": "USER SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "296-313",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L296-L313"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "290-321",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L290-L321"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Picks section A-D.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L340"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "257-307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L257-L307"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds clear the selected track’s pattern, which EDIT + OCT- can restore before another undo snapshot replaces it and autosave later stores the changed loop.",
    "short_label": "CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "322-348",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L348"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "135-159",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L135-L159"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "362-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L362-L398"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets attack time.",
    "short_label": "ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "35",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L35"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets envelope depth into filter.",
    "short_label": "ENV FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L39"
     }
    ]
   },
   {
    "mode": "lfo_page",
    "gesture": "turn",
    "action": "Sets LFO speed.",
    "short_label": "LFO RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "43",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L43"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO depth into pitch.",
    "short_label": "LFO PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "47",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L47"
     }
    ]
   },
   {
    "mode": "fx_page",
    "gesture": "turn",
    "action": "Sets track distortion.",
    "short_label": "DISTORTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "67",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L67"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets slicer mode OFF, GATE or STUT.",
    "short_label": "SLICER MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L79"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets shared delay division.",
    "short_label": "DELAY TIME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "102",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L102"
     }
    ]
   },
   {
    "mode": "reverb_chorus",
    "gesture": "turn",
    "action": "Sets shared reverb size.",
    "short_label": "REVERB SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "106",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L106"
     }
    ]
   },
   {
    "mode": "scale_page",
    "gesture": "turn",
    "action": "Sets selected track root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "59",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L59"
     }
    ]
   },
   {
    "mode": "scale2",
    "gesture": "turn",
    "action": "Sets transpose from -24 to +24 semitones.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "62",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L62"
     }
    ]
   },
   {
    "mode": "voice_page",
    "gesture": "turn",
    "action": "Sets voice mode POLY, MONO, LEG or UNI.",
    "short_label": "VOICE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "71",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L71"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets voice allocation ROT or REUSE.",
    "short_label": "VOICE ALLOC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "75",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L75"
     }
    ]
   },
   {
    "mode": "global_page",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "98",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L98"
     }
    ]
   },
   {
    "mode": "master_page",
    "gesture": "turn",
    "action": "Sets master dust.",
    "short_label": "DUST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "125",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L125"
     }
    ]
   },
   {
    "mode": "system_page",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "110-113",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L110-L113"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "drum_settings",
    "gesture": "turn",
    "action": "Sets drum MIDI channel OFF or 1–16.",
    "short_label": "DRUM MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "122",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L122"
     }
    ]
   },
   {
    "mode": "arp_page",
    "gesture": "turn",
    "action": "Sets arp mode OFF, UP, DN, UPDN, RND or ORD.",
    "short_label": "ARP MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "51",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L51"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets arp swing during playback, with no swing while stopped.",
    "short_label": "ARP SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "308",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "55",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L55"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-746",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L746"
     }
    ]
   },
   {
    "mode": "pattern_page",
    "gesture": "turn",
    "action": "Sets pattern length from 1 to 64 steps.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "310",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "63",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L63"
     }
    ]
   },
   {
    "mode": "edit1_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s oscillator waveform.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L123"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s filter cutoff.",
    "short_label": "CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "127",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L127"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s FM algorithm.",
    "short_label": "ALG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "138",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L138"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s modulation depth.",
    "short_label": "IDX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L142"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s first phase waveform.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "184",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L184"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s detune.",
    "short_label": "DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "188",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L188"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s chip type.",
    "short_label": "CHIP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "215",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L215"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s sweep.",
    "short_label": "SWP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "219",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L219"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s sample set.",
    "short_label": "SET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L205"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s sample tone.",
    "short_label": "CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "209",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L209"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s first vowel.",
    "short_label": "VOWL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "225",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L225"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s buzz.",
    "short_label": "BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "229",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L229"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s waveform combination.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "376",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L376"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s oscillator mode.",
    "short_label": "OSC MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "380",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L380"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s organ registration.",
    "short_label": "REG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s percussion mode.",
    "short_label": "PERC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain source.",
    "short_label": "SRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "434",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L434"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain pitch.",
    "short_label": "PTCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "438",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L438"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_algo",
    "gesture": "turn",
    "action": "Chooses one of eight Floyd routing algorithms.",
    "short_label": "ALGORITHM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "374-378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L374-L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op1",
    "gesture": "turn",
    "action": "Sets attack of the envelope that shapes the complete mixed voice, shared with ENV.",
    "short_label": "OP1 ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-386",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L386"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op2",
    "gesture": "turn",
    "action": "Sets operator 2 attack for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP2 ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op3",
    "gesture": "turn",
    "action": "Sets operator 3 attack for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP3 ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op4",
    "gesture": "turn",
    "action": "Sets operator 4 attack for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP4 ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_level",
    "gesture": "turn",
    "action": "Changes the operator 1 level shown in the drawing without changing the sound, with the value lost on restart.",
    "short_label": "OP1 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "394-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L394-L398"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-481",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L481"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_ratio",
    "gesture": "turn",
    "action": "Sets operator 4 feedback.",
    "short_label": "FLOYD FDBK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "400-404",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L400-L404"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "4-8",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L4-L8"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "58-79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L58-L79"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L123"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "short_label": "LOWCUT",
    "action": "With LOWCUT selected, right enables and left disables a master high-pass filter around 110 Hz, with the changed setting saved on menu close.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "102-107",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L102-L107"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/fx.c",
      "lines": "59-60",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/fx.c#L59-L60"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/fx.c",
      "lines": "96-105",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/fx.c#L96-L105"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "72-81",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L72-L81"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "short_label": "ZOOM",
    "action": "With ZOOM selected, right enables and left disables an enlarged view of the last-touched value, with the changed setting saved on menu close.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "102-107",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L102-L107"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1162-1168",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1162-L1168"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "72-81",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L72-L81"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "turn",
    "short_label": "ALGO VALUE",
    "action": "On ALGO after switching to a non-Floyd synth, changes that engine’s first parameter within Floyd’s 0–7 range, so its algorithm label can misdescribe the sound.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "421-432",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "372-378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L372-L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "212",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L212"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "turn",
    "short_label": "PAGE VALUE 1",
    "action": "On a retained OP, LEVEL or RATIO page, edits OP1 attack, OP2–OP4 live Floyd attack, LEVEL’s visual-only operator 1 level or RATIO’s feedback value on the newly selected synth, using the still-visible Floyd page’s ranges.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-405",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L405"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "Level of the selected track; if it was muted, the first turn unmutes it; Fast turns increase the change on broad numeric ranges.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "180-205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L180-L205"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets column 2 of the current page, with faster turns moving farther on broad ranges and no change for an empty column or DRUM TRACK.",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "269-370",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L269-L370"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "357-408",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L357-L408"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Moves every note of the cursor’s step up or down, or places the last played note into an empty step.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "218-229",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L218-L229"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "turn",
    "action": "Moves the drum-grid cursor through the pattern without auditioning its hits.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "451-467",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L451-L467"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum track level.",
    "short_label": "DRUM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "469-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L469-L473"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "135-150",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L135-L150"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Does nothing while REC READY is shown.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Master DUST (old sampler and vinyl colour); Faster turns increase the change.",
    "short_label": "DUST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "333-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L333-L340"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Right duplicates the note or drum steps into a second pass up to 64 steps, while left halves the length.",
    "short_label": "LEN X2 / 1/2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "68-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L68-L85"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "349-352",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L349-L352"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "Chooses the step division: 1/4, 1/8, 1/16, 1/32, 8T or 16T.",
    "short_label": "DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "366-367",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L366-L367"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "6",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L6"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Changes held notes or drum hits through ghost, soft, normal and hard levels.",
    "short_label": "HIT LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "159-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L201"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "turn_while_holding:button_sel",
    "action": "One scale for all three synth tracks, chosen from 16.",
    "short_label": "ALL SCALES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "376-390",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L376-L390"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 2; Fast turns increase the change on broad numeric ranges.",
    "short_label": "LEVEL T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "392-395",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L392-L395"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "332-399",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L332-L399"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Does nothing in the menu.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "95-128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L95-L128"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Loads the previous or next engine’s first sound immediately, releasing held notes and replacing sound edits without a question or panel undo.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "291-293",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L291-L293"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "240-291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L240-L291"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds load the chosen user sound, replacing unsaved sound edits and releasing held notes without panel undo, while leaving its stored pattern unloaded and Floyd’s extra operator edits unchanged.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "296-313",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L296-L313"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "240-263",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L240-L263"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Does nothing on the PROJECT page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "305",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L305"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-317",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L317"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds replace the track’s sound with its engine’s first preset without panel undo, with the changed loop saved later by autosave.",
    "short_label": "INIT SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "322-354",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L354"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "240-291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L240-L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "362-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L362-L398"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets decay time.",
    "short_label": "DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "36",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L36"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets envelope depth into pitch.",
    "short_label": "ENV PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "40",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L40"
     }
    ]
   },
   {
    "mode": "lfo_page",
    "gesture": "turn",
    "action": "Sets LFO waveform.",
    "short_label": "LFO WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "44",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L44"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO depth into filter.",
    "short_label": "LFO FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "48",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L48"
     }
    ]
   },
   {
    "mode": "fx_page",
    "gesture": "turn",
    "action": "Sets track chorus send.",
    "short_label": "CHORUS SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "68",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L68"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets slicer pattern from 1 to 16.",
    "short_label": "SLICER PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "80",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L80"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets shared delay feedback.",
    "short_label": "DELAY FDBK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "103",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L103"
     }
    ]
   },
   {
    "mode": "reverb_chorus",
    "gesture": "turn",
    "action": "Sets shared reverb damping.",
    "short_label": "REVERB DAMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "107",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L107"
     }
    ]
   },
   {
    "mode": "scale_page",
    "gesture": "turn",
    "action": "Sets selected track scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "60",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L60"
     }
    ]
   },
   {
    "mode": "scale2",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "voice_page",
    "gesture": "turn",
    "action": "Sets glide time.",
    "short_label": "GLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "72",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L72"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets voice detune.",
    "short_label": "DETUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "76",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L76"
     }
    ]
   },
   {
    "mode": "global_page",
    "gesture": "turn",
    "action": "Sets global swing.",
    "short_label": "GLOBAL SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "99",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L99"
     }
    ]
   },
   {
    "mode": "master_page",
    "gesture": "turn",
    "action": "Sets master ducking.",
    "short_label": "DUCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L126"
     }
    ]
   },
   {
    "mode": "system_page",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "110-113",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L110-L113"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "drum_settings",
    "gesture": "turn",
    "action": "Sets drum track level.",
    "short_label": "DRUM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L123"
     }
    ]
   },
   {
    "mode": "arp_page",
    "gesture": "turn",
    "action": "Sets arp division.",
    "short_label": "ARP RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "52",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L52"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets arp note probability.",
    "short_label": "ARP PROB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "308",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "56",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L56"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-746",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L746"
     }
    ]
   },
   {
    "mode": "pattern_page",
    "gesture": "turn",
    "action": "Sets step division 1/4, 1/8, 1/16, 1/32, 8T or 16T.",
    "short_label": "STEP DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "310",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "64",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L64"
     }
    ]
   },
   {
    "mode": "edit1_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s oscillator detune.",
    "short_label": "DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "124",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L124"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s filter resonance.",
    "short_label": "RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L128"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s operator 2 ratio.",
    "short_label": "R2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "139",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L139"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s modulation decay.",
    "short_label": "MDEC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "143",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L143"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s second phase waveform.",
    "short_label": "WAVE2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "185",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L185"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s line arrangement.",
    "short_label": "LINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "189",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L189"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s chip waveform.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "216",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L216"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s vibrato.",
    "short_label": "VIB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "220",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L220"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s sample tuning.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "206",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L206"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_sample",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "210",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L210"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s second vowel.",
    "short_label": "VOWL2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "226",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L226"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s breath.",
    "short_label": "BRTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "230",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L230"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s oscillator 2 interval.",
    "short_label": "INT2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "377",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L377"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s filter cutoff.",
    "short_label": "CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "381",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L381"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s sub register trim.",
    "short_label": "SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s key click.",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain position.",
    "short_label": "POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "435",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L435"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain spread.",
    "short_label": "SPRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "439",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L439"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_algo",
    "gesture": "turn",
    "action": "Sets the whole track’s output level.",
    "short_label": "TRACK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "374-378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L374-L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op1",
    "gesture": "turn",
    "action": "Sets decay of the envelope that shapes the complete mixed voice, shared with ENV.",
    "short_label": "OP1 DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-386",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L386"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op2",
    "gesture": "turn",
    "action": "Sets operator 2 decay for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP2 DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op3",
    "gesture": "turn",
    "action": "Sets operator 3 decay for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP3 DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op4",
    "gesture": "turn",
    "action": "Sets operator 4 decay for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP4 DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_level",
    "gesture": "turn",
    "action": "Sets operator 2 modulation strength where the chosen algorithm uses it.",
    "short_label": "OP2 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "394-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L394-L398"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-481",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L481"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_ratio",
    "gesture": "turn",
    "action": "Sets operator 2 frequency ratio to 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 or 16 times the played pitch.",
    "short_label": "OP2 RATIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "400-404",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L400-L404"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "4-8",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L4-L8"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "58-79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L58-L79"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L123"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "turn",
    "short_label": "PAGE VALUE 2",
    "action": "On a retained OP, LEVEL or RATIO page, edits OP1 decay, OP2–OP4 live Floyd decay, LEVEL’s fifth engine parameter or RATIO’s second engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-405",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L405"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "The selected track's pattern length in steps; Fast turns increase the change on broad numeric ranges.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "180-205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L180-L205"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets column 3 of the current page, with faster turns moving farther on broad ranges and no change for an empty column or DRUM TRACK.",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "269-370",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L269-L370"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "357-408",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L357-L408"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Chooses NOTE, TIE or REST for the cursor’s step.",
    "short_label": "TIME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "208-239",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L208-L239"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "451-467",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L451-L467"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum reverb send.",
    "short_label": "DRUM REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "469-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L469-L473"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "135-150",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L135-L150"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Does nothing while REC READY is shown.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Master DUCK (the kick pumps the synth tracks); Faster turns increase the change.",
    "short_label": "DUCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "333-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L333-L340"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "341-348",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L341-L348"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "49-98",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L49-L98"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "349-352",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L349-L352"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "The track's own swing, added to the global one.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "159-202",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L202"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "159-202",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L202"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "376-390",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L376-L390"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 3; Fast turns increase the change on broad numeric ranges.",
    "short_label": "LEVEL T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "392-395",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L392-L395"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "332-399",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L332-L399"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Does nothing in the menu.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "95-128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L95-L128"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "286-294",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L286-L294"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds erase the selected user sound while stopped, immediately rewriting its whole sixteen-sound bank without further questions or panel undo.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "296-313",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L296-L313"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "172-194",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L172-L194"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "290-321",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L290-L321"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds load the section while stopped, replacing unsaved loop edits without panel undo and leaving Floyd’s extra operator edits unchanged.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "322-337",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L337"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "344-359",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L344-L359"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "322-365",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L365"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets sustain level.",
    "short_label": "SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "37",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L37"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets envelope depth into shape.",
    "short_label": "ENV SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "41",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L41"
     }
    ]
   },
   {
    "mode": "lfo_page",
    "gesture": "turn",
    "action": "Sets LFO starting phase.",
    "short_label": "LFO PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "45",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L45"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO depth into shape.",
    "short_label": "LFO SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "49",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L49"
     }
    ]
   },
   {
    "mode": "fx_page",
    "gesture": "turn",
    "action": "Sets track delay send.",
    "short_label": "DELAY SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "69",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L69"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets slicer division.",
    "short_label": "SLICER RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "81",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L81"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets shared delay colour.",
    "short_label": "DELAY COLOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "104",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L104"
     }
    ]
   },
   {
    "mode": "reverb_chorus",
    "gesture": "turn",
    "action": "Sets shared chorus rate.",
    "short_label": "CHORUS RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "108",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L108"
     }
    ]
   },
   {
    "mode": "scale_page",
    "gesture": "turn",
    "action": "Sets key mapping OFF, SNAP or WHITE.",
    "short_label": "KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "61",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L61"
     }
    ]
   },
   {
    "mode": "scale2",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "voice_page",
    "gesture": "turn",
    "action": "Sets glide mode RATE or TIME.",
    "short_label": "GLIDE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "73",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L73"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets track pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "77",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L77"
     }
    ]
   },
   {
    "mode": "global_page",
    "gesture": "turn",
    "action": "Sets metronome OFF, REC or ON.",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L100"
     }
    ]
   },
   {
    "mode": "master_page",
    "gesture": "turn",
    "action": "Sets master filter, left low-pass, centre open and right high-pass.",
    "short_label": "MASTER FILT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "127",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L127"
     }
    ]
   },
   {
    "mode": "system_page",
    "gesture": "turn",
    "action": "Sets the shared NOTES switch for sounding-note lights on the selected synth track, leaving physical key-press lights enabled and saving the choice with the working loop or a section; NEW LOOP turns NOTES off.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "112",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L112"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "104-116",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L104-L116"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "259-267",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L259-L267"
     }
    ]
   },
   {
    "mode": "drum_settings",
    "gesture": "turn",
    "action": "Sets drum reverb send.",
    "short_label": "DRUM REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "124",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L124"
     }
    ]
   },
   {
    "mode": "arp_page",
    "gesture": "turn",
    "action": "Sets arp octave span from 1 to 4.",
    "short_label": "ARP OCTAVES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "53",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L53"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets arp HOLD, which retains its notes after release but does not latch ordinary keyboard playing.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "308",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "57",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L57"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-746",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L746"
     }
    ]
   },
   {
    "mode": "pattern_page",
    "gesture": "turn",
    "action": "Sets track swing added to global swing.",
    "short_label": "TRACK SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "310",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "65",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L65"
     }
    ]
   },
   {
    "mode": "edit1_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s oscillator mix.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "125",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L125"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s filter drive.",
    "short_label": "DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "129",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L129"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s operator 3 ratio.",
    "short_label": "R3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "140",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L140"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s feedback.",
    "short_label": "FB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "144",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L144"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s phase distortion amount.",
    "short_label": "DCW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "186",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L186"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s sub level.",
    "short_label": "SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "190",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L190"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s duty or wavetable choice.",
    "short_label": "DUTY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "217",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L217"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s chip arpeggio.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L221"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s bit reduction.",
    "short_label": "BITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "207",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L207"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s sample drive.",
    "short_label": "DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "211",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L211"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s vowel transition time.",
    "short_label": "TALK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "227",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L227"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s formant resonance.",
    "short_label": "Q",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "231",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L231"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s oscillator 3 interval.",
    "short_label": "INT3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s filter resonance.",
    "short_label": "RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "382",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L382"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s body register trim.",
    "short_label": "BODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s organ drive.",
    "short_label": "DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "288",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L288"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain size.",
    "short_label": "SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "436",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L436"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s random variation.",
    "short_label": "RAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "440",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L440"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_algo",
    "gesture": "turn",
    "action": "Sets track pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "374-378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L374-L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op1",
    "gesture": "turn",
    "action": "Sets sustain of the envelope that shapes the complete mixed voice, shared with ENV.",
    "short_label": "OP1 SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-386",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L386"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op2",
    "gesture": "turn",
    "action": "Sets operator 2 sustain for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP2 SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op3",
    "gesture": "turn",
    "action": "Sets operator 3 sustain for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP3 SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op4",
    "gesture": "turn",
    "action": "Sets operator 4 sustain for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP4 SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_level",
    "gesture": "turn",
    "action": "Sets operator 3 modulation strength where the chosen algorithm uses it.",
    "short_label": "OP3 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "394-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L394-L398"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-481",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L481"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_ratio",
    "gesture": "turn",
    "action": "Sets operator 3 frequency ratio to 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 or 16 times the played pitch.",
    "short_label": "OP3 RATIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "400-404",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L400-L404"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "4-8",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L4-L8"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "58-79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L58-L79"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L123"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "turn",
    "short_label": "PAGE VALUE 3",
    "action": "On a retained OP, LEVEL or RATIO page, edits OP1 sustain, OP2–OP4 live Floyd sustain, LEVEL’s seventh engine parameter or RATIO’s third engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-405",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L405"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "tracks",
    "gesture": "turn",
    "action": "The selected track's pan; Fast turns increase the change on broad numeric ranges.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "180-205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L180-L205"
     }
    ]
   },
   {
    "mode": "pages",
    "gesture": "turn",
    "action": "Sets column 4 of the current page, with faster turns moving farther on broad ranges and no change for an empty column or DRUM TRACK.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "269-370",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L269-L370"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "357-408",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L357-L408"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "turn",
    "action": "Step flag: none, accent, slide, or both.",
    "short_label": "FLAG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "208-239",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L208-L239"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "451-467",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L451-L467"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "turn",
    "action": "Drum track pan.",
    "short_label": "DRUM PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "469-473",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L469-L473"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "135-150",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L135-L150"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "turn",
    "action": "Does nothing while REC READY is shown.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "free_take",
    "gesture": "turn",
    "action": "Does nothing during a free take.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "696-699",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L696-L699"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Does nothing in the FX layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "333-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L333-L340"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "turn_while_holding:button_edit",
    "action": "Does nothing.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "341-348",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L341-L348"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "49-98",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L49-L98"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "turn_while_holding:button_arp",
    "action": "Does nothing in the ARP layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "349-352",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L349-L352"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "turn_while_holding:button_seq",
    "action": "Sets track length from 1 to 64 steps, with faster turns moving farther.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "159-202",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L159-L202"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "turn_while_holding:button_seq",
    "action": "Changes the track’s pattern length from 1 to 64 steps even while step keys are held.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "376-390",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L376-L390"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "turn_while_holding:button_glo",
    "action": "Level of track 4 (the drum level); Fast turns increase the change on broad numeric ranges.",
    "short_label": "LEVEL T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "392-395",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L392-L395"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "turn_while_holding:button_save",
    "action": "Does nothing in the SAVE layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "332-399",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L332-L399"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Does nothing in the menu.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "95-128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L95-L128"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "turn",
    "action": "Does nothing on PRESETS.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "286-294",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L286-L294"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds save the track’s sound and a reduced sixteen-step pattern while stopped, immediately rewriting its whole sixteen-sound bank without further questions or panel undo and omitting Floyd’s extra operator edits, with SAVED (RAM) meaning it will not survive power-off.",
    "short_label": "SAVE SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "296-313",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L296-L313"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "172-194",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L172-L194"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "205-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L205-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "310-320",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L310-L320"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds write the working loop into the chosen section while stopped without another question or panel undo, omitting Floyd’s extra operator edits.",
    "short_label": "SAVE SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "322-340",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L322-L340"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "309-322",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L309-L322"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "turn",
    "action": "Two rightward turns within about 1.5 seconds reset the loop’s sounds, patterns and all global controls, including tempo, swing, NOTES, effects and drum level, except the project-slot choice and drum MIDI channel, without another question; stored sections remain and only the last track’s notes and length can be undone before autosave later keeps the reset.",
    "short_label": "NEW LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "243-267",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L243-L267"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "356-365",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L356-L365"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "135-159",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L135-L159"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "362-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L362-L398"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "97-129",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L97-L129"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets release time.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "38",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L38"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "lfo_page",
    "gesture": "turn",
    "action": "Sets LFO fade time.",
    "short_label": "LFO FADE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "46",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L46"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO amplitude depth.",
    "short_label": "LFO AMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "50",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L50"
     }
    ]
   },
   {
    "mode": "fx_page",
    "gesture": "turn",
    "action": "Sets track reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L70"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets slicer depth.",
    "short_label": "SLICER DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "82",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L82"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets shared delay mix.",
    "short_label": "DELAY MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "105",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L105"
     }
    ]
   },
   {
    "mode": "reverb_chorus",
    "gesture": "turn",
    "action": "Sets shared chorus depth.",
    "short_label": "CHORUS DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "109",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L109"
     }
    ]
   },
   {
    "mode": "scale_page",
    "gesture": "turn",
    "action": "Sets chord type OFF, TRIAD, 7TH, 9TH, SUS4 or POWER.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "83",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L83"
     }
    ]
   },
   {
    "mode": "scale2",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "voice_page",
    "gesture": "turn",
    "action": "Sets note priority LAST, LOW or HIGH.",
    "short_label": "NOTE PRIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "74",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L74"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/voice.c",
      "lines": "302-315",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/voice.c#L302-L315"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/voice.c",
      "lines": "359-372",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/voice.c#L359-L372"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/voice.c",
      "lines": "386-401",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/voice.c#L386-L401"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets track mute.",
    "short_label": "MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "78",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L78"
     }
    ]
   },
   {
    "mode": "global_page",
    "gesture": "turn",
    "action": "Sets master tuning from -50 to +50.",
    "short_label": "MASTER TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "101",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L101"
     }
    ]
   },
   {
    "mode": "master_page",
    "gesture": "turn",
    "action": "Sets roll division 1/8, 1/16, 1/32, 32T or 1/64.",
    "short_label": "ROLL RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "128",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L128"
     }
    ]
   },
   {
    "mode": "system_page",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "110-113",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L110-L113"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "drum_settings",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "arp_page",
    "gesture": "turn",
    "action": "Sets arp gate length.",
    "short_label": "ARP GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "54",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L54"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets arp note ordering NOTE or PLAY.",
    "short_label": "ARP ORDER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "308",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "58",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L58"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-746",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L746"
     }
    ]
   },
   {
    "mode": "pattern_page",
    "gesture": "turn",
    "action": "Sets sequence gate length.",
    "short_label": "SEQ GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "310",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L66"
     }
    ]
   },
   {
    "mode": "edit1_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s noise level.",
    "short_label": "NOIS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L126"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_analog",
    "gesture": "turn",
    "action": "Sets the ANALOG engine’s filter key tracking.",
    "short_label": "KTR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L130"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_digital",
    "gesture": "turn",
    "action": "Sets the DIGITAL engine’s operator 4 ratio.",
    "short_label": "R4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_digital",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L145"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_phase",
    "gesture": "turn",
    "action": "Sets the PHASE engine’s phase envelope depth.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_phase",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "191",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L191"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s crush or stepped envelope.",
    "short_label": "CRSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "218",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L218"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_lofi",
    "gesture": "turn",
    "action": "Sets the LOFI engine’s tone.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "222",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L222"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_sample",
    "gesture": "turn",
    "action": "Sets the SAMPLE engine’s sample looping.",
    "short_label": "LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_sample",
    "gesture": "turn",
    "action": "Does nothing in this column.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "212",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L212"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s formant shift.",
    "short_label": "SHIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "228",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L228"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_voice",
    "gesture": "turn",
    "action": "Sets the VOICE engine’s random variation.",
    "short_label": "RAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "232",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L232"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s detune.",
    "short_label": "DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "379",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L379"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_trio",
    "gesture": "turn",
    "action": "Sets the TRIO engine’s pulse width.",
    "short_label": "PW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "383",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L383"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s top register trim.",
    "short_label": "TOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_wheel",
    "gesture": "turn",
    "action": "Sets the WHEEL engine’s rotor speed.",
    "short_label": "ROTR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "289",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L289"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit1_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain density.",
    "short_label": "DENS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "437",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L437"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "edit2_grain",
    "gesture": "turn",
    "action": "Sets the GRAIN engine’s grain tone.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "441",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L441"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "133-141",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L133-L141"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_algo",
    "gesture": "turn",
    "action": "Sets unison voice detune for newly started notes.",
    "short_label": "DETUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "374-378",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L374-L378"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/voice.c",
      "lines": "261-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/voice.c#L261-L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/voice.c",
      "lines": "561-571",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/voice.c#L561-L571"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op1",
    "gesture": "turn",
    "action": "Sets release of the envelope that shapes the complete mixed voice, shared with ENV.",
    "short_label": "OP1 RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-386",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L386"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op2",
    "gesture": "turn",
    "action": "Sets operator 2 release for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP2 RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op3",
    "gesture": "turn",
    "action": "Sets operator 3 release for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP3 RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_op4",
    "gesture": "turn",
    "action": "Sets operator 4 release for this running session, outside every save, retaining the current value across preset or project loads.",
    "short_label": "OP4 RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-391",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L391"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "80-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L100"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "183-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/upreset.c",
      "lines": "230-233",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_level",
    "gesture": "turn",
    "action": "Sets operator 4 modulation strength where the chosen algorithm uses it, with the value lost on restart and omitted from saves.",
    "short_label": "OP4 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "394-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L394-L398"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-187",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-481",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L481"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "10-22",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "233-248",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "floyd_ratio",
    "gesture": "turn",
    "action": "Sets operator 4 frequency ratio to 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 or 16 times the played pitch.",
    "short_label": "OP4 RATIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "400-404",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L400-L404"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "4-8",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L4-L8"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "58-79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L58-L79"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_floyd.c",
      "lines": "104-123",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L123"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "turn",
    "short_label": "PAGE VALUE 4",
    "action": "On a retained OP, LEVEL or RATIO page, edits OP1 release, OP2–OP4 live Floyd release, LEVEL’s live Floyd operator 4 level or RATIO’s fourth engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "380-405",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L405"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "315-319",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L315-L319"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Sets headphone and line-output volume.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/main.c",
      "lines": "159-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L159-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/fx.c",
      "lines": "429-438",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/fx.c#L429-L438"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "48-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L48-L70"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or KICK on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 1 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Loads section A immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
    "short_label": "PLAY A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "259-270",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L259-L270"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "326-342",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L326-L342"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "558-563",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L558-L563"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays KICK.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays KICK.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases KICK on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays KICK 2.",
    "short_label": "KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "48-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L48-L70"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or KICK 2 on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 2 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Loads section B immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
    "short_label": "PLAY B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "259-270",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L259-L270"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "326-342",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L326-L342"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "558-563",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L558-L563"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays KICK 2.",
    "short_label": "KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays KICK 2.",
    "short_label": "KICK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases KICK 2 on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "48-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L48-L70"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or SNARE on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 3 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Loads section C immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
    "short_label": "PLAY C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "259-270",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L259-L270"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "326-342",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L326-L342"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "558-563",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L558-L563"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays SNARE.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays SNARE.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases SNARE on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CLAP.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "48-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L48-L70"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or CLAP on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 4 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Loads section D immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
    "short_label": "PLAY D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "259-270",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L259-L270"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "326-342",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L326-L342"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "558-563",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L558-L563"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays CLAP.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays CLAP.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays HAT.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "48-70",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L48-L70"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or HAT on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 5 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop in section A immediately in RAM, requiring a second press within three seconds to replace a used section, then writes it to flash once stopped and quiet; undo cannot restore the replaced section.",
    "short_label": "STORE A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "271-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L271-L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "546-571",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L546-L571"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "612-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L612-L618"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays HAT.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays HAT.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases HAT on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays OPEN HAT.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "84-109",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L84-L109"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or OPEN HAT on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 6 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop in section B immediately in RAM, requiring a second press within three seconds to replace a used section, then writes it to flash once stopped and quiet; undo cannot restore the replaced section.",
    "short_label": "STORE B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "271-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L271-L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "546-571",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L546-L571"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "612-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L612-L618"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays OPEN HAT.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays OPEN HAT.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases OPEN HAT on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays PEDAL (the pedal hi-hat).",
    "short_label": "PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "84-109",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L84-L109"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or PEDAL (the pedal hi-hat) on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 7 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop in section C immediately in RAM, requiring a second press within three seconds to replace a used section, then writes it to flash once stopped and quiet; undo cannot restore the replaced section.",
    "short_label": "STORE C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "271-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L271-L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "546-571",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L546-L571"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "612-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L612-L618"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays PEDAL (the pedal hi-hat).",
    "short_label": "PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays PEDAL (the pedal hi-hat).",
    "short_label": "PEDAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIM.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "84-109",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L84-L109"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or RIM on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 8 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Stores the loop in section D immediately in RAM, requiring a second press within three seconds to replace a used section, then writes it to flash once stopped and quiet; undo cannot restore the replaced section.",
    "short_label": "STORE D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "271-281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L271-L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "546-571",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L546-L571"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "612-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L612-L618"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays RIM.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays RIM.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases RIM on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SNARE 2.",
    "short_label": "SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "146-164",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L146-L164"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or SNARE 2 on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 9 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays SNARE 2.",
    "short_label": "SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays SNARE 2.",
    "short_label": "SNARE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases SNARE 2 on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays LOW TOM.",
    "short_label": "LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "146-168",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L146-L168"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or LOW TOM on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 10 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays LOW TOM.",
    "short_label": "LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays LOW TOM.",
    "short_label": "LOW TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases LOW TOM on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "short_label": "LOW TOM",
    "action": "Plays LOW TOM, matching the white key on its left.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-79",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L79"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays HI TOM.",
    "short_label": "HI TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays the scale’s VII chord, counting C4 as I in a seven-note scale.",
    "short_label": "CHORD VII",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Squeezes the mix into a phone-speaker band while the key is held.",
    "short_label": "PHONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "170-174",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L170-L174"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or HI TOM on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 11 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays HI TOM.",
    "short_label": "HI TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays HI TOM.",
    "short_label": "HI TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CRASH.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "176-179",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L176-L179"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or CRASH on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 12 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays CRASH.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays CRASH.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases CRASH on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays RIDE.",
    "short_label": "RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "180-188",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L180-L188"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or RIDE on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 13 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Switches between loop and song playback unless SONG REC is on.",
    "short_label": "LOOP/SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "282-288",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L282-L288"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays RIDE.",
    "short_label": "RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays RIDE.",
    "short_label": "RIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases RIDE on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays SHAKER.",
    "short_label": "SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "189-197",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L189-L197"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or SHAKER on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 14 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Starts or ends recording of the section order from the next bar, unless the song is already running, and writes the resulting song when stopped and quiet without another question; pattern undo cannot restore the earlier order.",
    "short_label": "SONG REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "289-300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L289-L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "576-578",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L576-L578"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "594-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L594-L618"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays SHAKER.",
    "short_label": "SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays SHAKER.",
    "short_label": "SHAKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays CONGA.",
    "short_label": "CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "140-143",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L140-L143"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "199-205",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L199-L205"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or CONGA on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 15 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays CONGA.",
    "short_label": "CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays CONGA.",
    "short_label": "CONGA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "press",
    "action": "Plays no note while chord mode is on.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Starts no effect.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases CONGA on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "254-304",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L254-L304"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1040",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1040"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays COWBELL.",
    "short_label": "COWBELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L146"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "151-180",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L151-L180"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "12-16",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L12-L16"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "239-243",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L239-L243"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "952-959",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L952-L959"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/punch.c",
      "lines": "97-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/punch.c#L97-L100"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "press_while_holding:button_edit",
    "action": "Erases this mapped synth note and its chord, or COWBELL on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "969-993",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L969-L993"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "574-618",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L574-L618"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "225-235",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L225-L235"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1427-1428",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1427-L1428"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1021",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1021"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "906-934",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L906-L934"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "122-126",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L122-L126"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "press_while_holding:button_seq",
    "action": "Controls step 16 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-245",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L245"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "109-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L109-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-201",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L201"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "247-252",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L247-L252"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "306-314",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L306-L314"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "205-221",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L205-L221"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "301-303",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L301-L303"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "press",
    "action": "Plays COWBELL.",
    "short_label": "COWBELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "press",
    "action": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "press",
    "action": "Plays COWBELL.",
    "short_label": "COWBELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/drums.c",
      "lines": "54-85",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/drums.c#L54-L85"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "997-1010",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "413-476",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L413-L476"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "press",
    "action": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "release",
    "action": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "141-158",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L141-L158"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "160-165",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L160-L165"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "225-234",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/project.c",
      "lines": "383-398",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L383-L398"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this key’s effect if it is still the selected punch effect.",
    "short_label": "END EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1049-1054",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1049-L1054"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "release",
    "action": "Releases the notes started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "chord_mode",
    "gesture": "release",
    "action": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
    "short_label": "CHORD OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1070-1076",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1070-L1076"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "787-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L787-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "639-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L639-L650"
     }
    ]
   },
   {
    "mode": "arp_hold",
    "gesture": "release",
    "action": "Leaves the arpeggiator’s held set in place after this key is released.",
    "short_label": "KEEP ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "622-650",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L622-L650"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "768-798",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L768-L798"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1012-1034",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1012-L1034"
     }
    ]
   },
   {
    "mode": "step_page",
    "gesture": "release",
    "action": "Moves the step cursor on when the last key is released after a note was entered.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "372-406",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L372-L406"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "102-146",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L102-L146"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "release",
    "action": "Stops the repeat started by this key.",
    "short_label": "STOP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1065-1069",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1065-L1069"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "899-904",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L899-L904"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "release",
    "action": "Stops erasing this key’s note or drum sound from later steps.",
    "short_label": "STOP ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/seq.c",
      "lines": "1058-1064",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1058-L1064"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "199-280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L199-L280"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1175-1254",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1175-L1254"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "686-730",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L686-L730"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "344-394",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L344-L394"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "370-405",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L370-L405"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_song.c",
      "lines": "19-84",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L19-L84"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "shows",
    "action": "Shows the armed track and either a free-take prompt for an empty loop or a note-start prompt for existing music, without recording-option dials.",
    "short_label": "REC READY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "497-512",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L497-L512"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "534-582",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L534-L582"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "497-534",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L497-L534"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_studio.c",
      "lines": "578-582",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_studio.c#L578-L582"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "734-775",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L734-L775"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "shows",
    "action": "Shows sixteen effect tiles and three working knob dials.",
    "short_label": "PUNCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "482-504",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L482-L504"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "506-540",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L506-L540"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "shows",
    "action": "Shows sixteen step tiles with hit levels and ratchet marks, a page number and four knob values.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "548-610",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L548-L610"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "604-644",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L604-L644"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "shows",
    "action": "Shows mute and solo tiles for four tracks, the tap-tempo tile and four track levels.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "654-680",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L654-L680"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "shows",
    "action": "Shows four recall tiles, four store tiles, loop or song mode and song recording, with no temporary section chain.",
    "short_label": "SONG LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "683-718",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L683-L718"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "436-450",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L436-L450"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Shows COLOR, LOWCUT, ZOOM, HARDWARE CALIBRATION, ABOUT and BACK in one list.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "5-6",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L5-L6"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "8-62",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L8-L62"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "shows",
    "action": "Shows SLOOP branding, the version, build date, credits and the parent project’s source address.",
    "short_label": "ABOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_menu.c",
      "lines": "24-40",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L24-L40"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "791-856",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L791-L856"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/recovery.c",
      "lines": "60-67",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/main.c",
      "lines": "172-200",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L172-L200"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Brief messages show the current action or result, such as ERASED, AGAIN: SAVE or NEXT: B.",
    "short_label": "MESSAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "101-111",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L101-L111"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "49-56",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L49-L56"
     }
    ]
   },
   {
    "mode": "save_presets",
    "gesture": "shows",
    "action": "Shows factory sounds grouped by kind followed by stored user sounds.",
    "short_label": "PRESETS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "841-864",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L841-L864"
     }
    ]
   },
   {
    "mode": "save_project",
    "gesture": "shows",
    "action": "Shows four project slots with their used or empty state.",
    "short_label": "PROJECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "889-902",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L889-L902"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "shows",
    "action": "Shows ENV with attack time, decay time, sustain level, release time.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "278",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L278"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "shows",
    "action": "Shows ENV DEST with envelope depth into filter, envelope depth into pitch, envelope depth into shape, an empty column.",
    "short_label": "ENV DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "279",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L279"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "lfo_page",
    "gesture": "shows",
    "action": "Shows LFO with LFO speed, LFO waveform, LFO starting phase, LFO fade time.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "280",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L280"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "shows",
    "action": "Shows LFO DEST with LFO depth into pitch, LFO depth into filter, LFO depth into shape, LFO amplitude depth.",
    "short_label": "LFO DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "281",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L281"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "fx_page",
    "gesture": "shows",
    "action": "Shows FX with track distortion, track chorus send, track delay send, track reverb send.",
    "short_label": "FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "282",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L282"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "shows",
    "action": "Shows SLICER with slicer mode OFF, GATE or STUT, slicer pattern from 1 to 16, slicer division, slicer depth.",
    "short_label": "SLICER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "283",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L283"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "shows",
    "action": "Shows DLY with shared delay division, shared delay feedback, shared delay colour, shared delay mix.",
    "short_label": "DLY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "284",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L284"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "reverb_chorus",
    "gesture": "shows",
    "action": "Shows REV/CHO with shared reverb size, shared reverb damping, shared chorus rate, shared chorus depth.",
    "short_label": "REV/CHO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "285",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L285"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "scale_page",
    "gesture": "shows",
    "action": "Shows SCL with selected track root, selected track scale, key mapping OFF, SNAP or WHITE, chord type OFF, TRIAD, 7TH, 9TH, SUS4 or POWER.",
    "short_label": "SCL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "286",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L286"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "scale2",
    "gesture": "shows",
    "action": "Shows SCL 2 with transpose from -24 to +24 semitones, an empty column, an empty column, an empty column.",
    "short_label": "SCL 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "287",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L287"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "voice_page",
    "gesture": "shows",
    "action": "Shows VOICE with voice mode POLY, MONO, LEG or UNI, glide time, glide mode RATE or TIME, note priority LAST, LOW or HIGH.",
    "short_label": "VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "290",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L290"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "shows",
    "action": "Shows VOICE 2 with voice allocation ROT or REUSE, voice detune, track pan, track mute.",
    "short_label": "VOICE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "291",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L291"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "global_page",
    "gesture": "shows",
    "action": "Shows GLOBAL with tempo from 40 to 240 BPM, global swing, metronome OFF, REC or ON, master tuning from -50 to +50.",
    "short_label": "GLOBAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "299",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L299"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "master_page",
    "gesture": "shows",
    "action": "Shows MASTER with master dust, master ducking, master filter, left low-pass, centre open and right high-pass, roll division 1/8, 1/16, 1/32, 32T or 1/64.",
    "short_label": "MASTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "300",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L300"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "system_page",
    "gesture": "shows",
    "action": "Shows USB MIDI connection state, an unused SYNC column, NOTES and CPU usage.",
    "short_label": "SYSTEM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "110-113",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L110-L113"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1352-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1352-L1368"
     }
    ]
   },
   {
    "mode": "drum_settings",
    "gesture": "shows",
    "action": "Shows DRUMS settings with drum MIDI channel OFF or 1–16, drum track level, drum reverb send, an empty column.",
    "short_label": "DRUM SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "302",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L302"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "arp_page",
    "gesture": "shows",
    "action": "Shows ARP with arp mode OFF, UP, DN, UPDN, RND or ORD, arp division, arp octave span from 1 to 4, arp gate length.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "307",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L307"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "shows",
    "action": "Shows ARP 2 with arp swing during playback, with no swing while stopped, arp note probability, arp HOLD, which retains its notes after release but does not latch ordinary keyboard playing, arp note ordering NOTE or PLAY.",
    "short_label": "ARP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "308",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L308"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "pattern_page",
    "gesture": "shows",
    "action": "Shows PATTERN with pattern length from 1 to 64 steps, step division 1/4, 1/8, 1/16, 1/32, 8T or 16T, track swing added to global swing, sequence gate length.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "310",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L310"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "edit1_analog",
    "gesture": "shows",
    "action": "Shows OSC for ANALOG, with columns WAVE, DTN, MIX, NOIS.",
    "short_label": "ANALOG OSC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "120-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L120-L130"
     }
    ]
   },
   {
    "mode": "edit2_analog",
    "gesture": "shows",
    "action": "Shows FLT for ANALOG, with columns CUT, RES, DRV, KTR.",
    "short_label": "ANALOG FLT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_analog.c",
      "lines": "120-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_analog.c#L120-L130"
     }
    ]
   },
   {
    "mode": "edit1_digital",
    "gesture": "shows",
    "action": "Shows OPS for DIGITAL, with columns ALG, R2, R3, R4.",
    "short_label": "DIGITAL OPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "135-145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L135-L145"
     }
    ]
   },
   {
    "mode": "edit2_digital",
    "gesture": "shows",
    "action": "Shows MOD for DIGITAL, with columns IDX, MDEC, FB, blank.",
    "short_label": "DIGITAL MOD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_digital.c",
      "lines": "135-145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_digital.c#L135-L145"
     }
    ]
   },
   {
    "mode": "edit1_phase",
    "gesture": "shows",
    "action": "Shows PHS for PHASE, with columns WAVE, WAVE2, DCW, ENV.",
    "short_label": "PHASE PHS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "181-191",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L181-L191"
     }
    ]
   },
   {
    "mode": "edit2_phase",
    "gesture": "shows",
    "action": "Shows LINE for PHASE, with columns DTN, LINE, SUB, blank.",
    "short_label": "PHASE LINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_phase.c",
      "lines": "181-191",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_phase.c#L181-L191"
     }
    ]
   },
   {
    "mode": "edit1_lofi",
    "gesture": "shows",
    "action": "Shows CHIP for LOFI, with columns CHIP, WAVE, DUTY, CRSH.",
    "short_label": "LOFI CHIP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "212-222",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L212-L222"
     }
    ]
   },
   {
    "mode": "edit2_lofi",
    "gesture": "shows",
    "action": "Shows MOTN for LOFI, with columns SWP, VIB, ARP, TONE.",
    "short_label": "LOFI MOTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_lofi.c",
      "lines": "212-222",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_lofi.c#L212-L222"
     }
    ]
   },
   {
    "mode": "edit1_sample",
    "gesture": "shows",
    "action": "Shows SET for SAMPLE, with columns SET, TUNE, BITS, LOOP.",
    "short_label": "SAMPLE SET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "202-212",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L202-L212"
     }
    ]
   },
   {
    "mode": "edit2_sample",
    "gesture": "shows",
    "action": "Shows TONE for SAMPLE, with columns CUT, blank, DRV, blank.",
    "short_label": "SAMPLE TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_sample.c",
      "lines": "202-212",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L202-L212"
     }
    ]
   },
   {
    "mode": "edit1_voice",
    "gesture": "shows",
    "action": "Shows VOWL for VOICE, with columns VOWL, VOWL2, TALK, SHIFT.",
    "short_label": "VOICE VOWL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-232",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L222-L232"
     }
    ]
   },
   {
    "mode": "edit2_voice",
    "gesture": "shows",
    "action": "Shows TONE for VOICE, with columns BUZZ, BRTH, Q, RAND.",
    "short_label": "VOICE TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-232",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_formant.c#L222-L232"
     }
    ]
   },
   {
    "mode": "edit1_trio",
    "gesture": "shows",
    "action": "Shows OSC for TRIO, with columns WAVE, INT2, INT3, DTN.",
    "short_label": "TRIO OSC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "373-383",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L373-L383"
     }
    ]
   },
   {
    "mode": "edit2_trio",
    "gesture": "shows",
    "action": "Shows TONE for TRIO, with columns MODE, CUT, RES, PW.",
    "short_label": "TRIO TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_trio.c",
      "lines": "373-383",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_trio.c#L373-L383"
     }
    ]
   },
   {
    "mode": "edit1_wheel",
    "gesture": "shows",
    "action": "Shows BARS for WHEEL, with columns REG, SUB, BODY, TOP.",
    "short_label": "WHEEL BARS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "279-289",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L279-L289"
     }
    ]
   },
   {
    "mode": "edit2_wheel",
    "gesture": "shows",
    "action": "Shows TONE for WHEEL, with columns PERC, CLICK, DRV, ROTR.",
    "short_label": "WHEEL TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_drawbar.c",
      "lines": "279-289",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_drawbar.c#L279-L289"
     }
    ]
   },
   {
    "mode": "edit1_grain",
    "gesture": "shows",
    "action": "Shows GRAN for GRAIN, with columns SRC, POS, SIZE, DENS.",
    "short_label": "GRAIN GRAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "431-441",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L431-L441"
     }
    ]
   },
   {
    "mode": "edit2_grain",
    "gesture": "shows",
    "action": "Shows SPRY for GRAIN, with columns PTCH, SPRD, RAND, TONE.",
    "short_label": "GRAIN SPRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1353",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1353"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/eng_grain.c",
      "lines": "431-441",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_grain.c#L431-L441"
     }
    ]
   },
   {
    "mode": "floyd_algo",
    "gesture": "shows",
    "action": "Shows ALGO with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "ALGO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_op1",
    "gesture": "shows",
    "action": "Shows OP1 with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "OP1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_op2",
    "gesture": "shows",
    "action": "Shows OP2 with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "OP2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_op3",
    "gesture": "shows",
    "action": "Shows OP3 with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "OP3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_op4",
    "gesture": "shows",
    "action": "Shows OP4 with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "OP4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_level",
    "gesture": "shows",
    "action": "Shows LEVEL with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "floyd_ratio",
    "gesture": "shows",
    "action": "Shows RATIO with four coloured envelope outlines, the active operator highlighted, routing hints and moving voice markers.",
    "short_label": "RATIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "397-449",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L397-L449"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "477-511",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L477-L511"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "533-648",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L533-L648"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "shows",
    "action": "Shows note or drum tiles and the roll-rate dial.",
    "short_label": "ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "506-545",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L506-L545"
     }
    ]
   },
   {
    "mode": "layer_steps_held",
    "gesture": "shows",
    "action": "Shows the held steps and level and ratchet dials, with the track-length knob still active even though its dial is blank.",
    "short_label": "HELD STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "548-610",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L548-L610"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_layers.c",
      "lines": "353-374",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_layers.c#L353-L374"
     }
    ]
   },
   {
    "mode": "save_user",
    "gesture": "shows",
    "action": "Shows user slots U01–U32 with names or EMPTY and the SLOT, LOAD, ERASE and SAVE columns.",
    "short_label": "USER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "867-885",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L867-L885"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1310-1316",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1310-L1316"
     }
    ]
   },
   {
    "mode": "save_tools",
    "gesture": "shows",
    "action": "Shows CLRSQ, INIT, an empty third column and NEW.",
    "short_label": "TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "306",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L306"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1348-1368",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1348-L1368"
     }
    ]
   },
   {
    "mode": "update_transfer",
    "gesture": "shows",
    "short_label": "UPDATE",
    "action": "Shows UPDATE with stage labels during an install, or FAILED followed by an error number if it stops.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/felucca.c",
      "lines": "142-167",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/felucca.c#L142-L167"
     }
    ]
   },
   {
    "mode": "retained_floyd_page",
    "gesture": "shows",
    "short_label": "FLOYD PAGE",
    "action": "Keeps the Floyd page name after a synth-track change, with its page count showing zero of four because that page is outside the new engine’s normal edit set.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui.c",
      "lines": "421-432",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L421-L432"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_draw.c",
      "lines": "1193-1208",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_draw.c#L1193-L1208"
     }
    ]
   }
  ]
 },
 "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "41-49",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L41-L49"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "143",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L143"
     }
    ]
   },
   {
    "mode": "stopped",
    "gesture": "off",
    "action": "Dark while stopped, including during a free take.",
    "short_label": "STOPPED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "41-49",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L41-L49"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "143",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L143"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "rec_ready",
    "gesture": "blinking",
    "action": "Blinks while armed.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "144-145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L144-L145"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "144-145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L144-L145"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "144-145",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L144-L145"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "tracks",
    "gesture": "lit",
    "action": "Lit while the TRACKS screen shows.",
    "short_label": "TRACKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_roll",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_song",
    "gesture": "lit",
    "action": "Lit while its layer is held.",
    "short_label": "HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "blinking",
    "action": "Blinks while its layer is locked open.",
    "short_label": "LOCKED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   },
   {
    "mode": "song_screen",
    "gesture": "lit",
    "action": "Lit on the SONG screen.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "28-39",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L28-L39"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "141-142",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L141-L142"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Lit while the octave is below 0.",
    "short_label": "OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "146-152",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L146-L152"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Lit while held (ghost hits).",
    "short_label": "GHOST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "146-152",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L146-L152"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Lit while the octave is above 0.",
    "short_label": "OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "146-152",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L146-L152"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Lit while held (hard hits).",
    "short_label": "HARD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "146-152",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L146-L152"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "drum_play",
    "gesture": "lit",
    "action": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
    "short_label": "HITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "104-108",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L104-L108"
     }
    ]
   },
   {
    "mode": "synth_play",
    "gesture": "lit",
    "action": "Held keys light up; SYSTEM NOTES also lights keys matching the synth’s held notes, including sequencer notes.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "104-120",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L104-L120"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "112",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L112"
     },
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/params.c",
      "lines": "301",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L301"
     }
    ]
   },
   {
    "mode": "layer_steps",
    "gesture": "lit",
    "action": "Occupied steps on this page are lit along with keys held; the playing step stays lit when empty and flashes when occupied.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "59-72",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L59-L72"
     }
    ]
   },
   {
    "mode": "layer_key",
    "gesture": "lit",
    "action": "Keys in the scale are lit and root keys blink.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "73-81",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L73-L81"
     }
    ]
   },
   {
    "mode": "layer_erase",
    "gesture": "lit",
    "action": "On drums, keys for sounds in the pattern are lit along with held keys; on synths the held keys light up.",
    "short_label": "IN PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "92-100",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L92-L100"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "57-58",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L57-L58"
     }
    ]
   },
   {
    "mode": "drums_grid",
    "gesture": "lit",
    "action": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
    "short_label": "HITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "104-108",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L104-L108"
     }
    ]
   },
   {
    "mode": "drums_kit",
    "gesture": "lit",
    "action": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
    "short_label": "HITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "104-108",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L104-L108"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "123-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L123-L130"
     }
    ]
   },
   {
    "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "123-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L123-L130"
     }
    ]
   },
   {
    "mode": "layer_mix",
    "gesture": "lit",
    "action": "Lit while track 1 is soloed.",
    "short_label": "T1 SOLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "123-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L123-L130"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "123-130",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L123-L130"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "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": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ],
  "led_g5": [
   {
    "mode": "layer_mix",
    "gesture": "flash",
    "action": "Flashes on the beat.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "renebohne/sloop-fm1",
      "ref": "v2.4",
      "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
      "path": "firmware/src/ui_input.c",
      "lines": "82-91",
      "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L82-L91"
     }
    ]
   }
  ]
 },
 "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"
  ]
 },
 "version_note": "The v2.4 release ships two different packages: the Firmware Hub installs sloop-2.4.fwsc, built at aff6ba4 from the SLOOP 2.2 base with Floyd, before the SLOOP 2.3 merge; the tag’s later build is felucca-2.4.fwsc.",
 "version_source": [
  {
   "kind": "release_asset",
   "repo": "renebohne/sloop-fm1",
   "ref": "v2.4",
   "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
   "path": "docs/firmware/sloop-2.4.fwsc",
   "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/docs/firmware/sloop-2.4.fwsc",
   "sha256": "d70301ad3e1f67a71792a2644829658a8570eceb0681ba2ac6eb41d771cc7560",
   "bytes": 609802,
   "evidence": "Local artifact digest measured with Python; matching release and hub assets measured by the lead on 2026-10-17."
  }
 ],
 "disagreements": [
  {
   "topic": "Inherited version and counts",
   "docs_say": "The docs call this SLOOP 2.2, with nine engines and 68 factory sounds.",
   "source_says": "The installed build adds Floyd as a tenth engine and includes its eight sounds in the browse bank, making 76 sounds.",
   "docs_ref": {
    "kind": "doc",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "SLOOP.md",
    "lines": "3-5",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/SLOOP.md#L3-L5"
   },
   "source_ref": {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ui.c",
    "lines": "320-342",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L320-L342"
   }
  },
  {
   "topic": "SELECT exceptions",
   "docs_say": "The panel table calls SELECT a tempo control everywhere.",
   "source_says": "SELECT changes tempo on ordinary pages and DRUMS, but the SONG screen and HOME menu ignore it.",
   "docs_ref": {
    "kind": "doc",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "SLOOP.md",
    "lines": "120",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/SLOOP.md#L120"
   },
   "source_ref": {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ui_song.c",
    "lines": "152-153",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L152-L153"
   }
  },
  {
   "topic": "Autosave includes all edits",
   "docs_say": "The guide says startup recovers the state as it was left.",
   "source_says": "Floyd’s OP2–4 envelopes and LVL1/LVL4 are live-only values omitted by saved projects and user sounds, so restart resets those values. This build offers no full-device backup.",
   "docs_ref": {
    "kind": "doc",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "SLOOP.md",
    "lines": "207",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/SLOOP.md#L207"
   },
   "source_ref": {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "233-248",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
   }
  },
  {
   "topic": "Undo after a new project",
   "docs_say": "The guide calls NEW PROJECT undoable.",
   "source_says": "NEW snapshots each track into one shared undo record, leaving only the final track available to undo; it cannot recover the whole old project.",
   "docs_ref": {
    "kind": "doc",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "SLOOP.md",
    "lines": "208",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/SLOOP.md#L208"
   },
   "source_ref": {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ui_input.c",
    "lines": "242-267",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_input.c#L242-L267"
   }
  }
 ],
 "not_mapped": [
  "Nothing was tested on a unit; control behavior and timings were read in source.",
  "There is no full backup or restore in the installed build; record the audio through the audio output and write down settings and operator edits before switching.",
  "Older Floyd releases were not audited for downgrade compatibility.",
  "Stock and Baud Girl locations remain partly reported, so their possible loss is described without asserting exact saved-record positions."
 ],
 "technical_notes": [
  {
   "topic": "Floyd operator values",
   "detail": "Operator 1 level is held only in memory for drawing and is never read by the audio renderer; operator 2–4 envelope edits and operator 4 level are also kept outside stored track parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_floyd.c",
     "lines": "10-22",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_floyd.c",
     "lines": "104-187",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/params.c",
     "lines": "380-398",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L398"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/project.c",
     "lines": "233-248",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
    }
   ]
  },
  {
   "topic": "Legacy HOME macro",
   "detail": "The arranger build sends HOME to TRACKS; the unused non-arranger branch would expose a DEC2 macro whose parameter is not read by the Floyd renderer.",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/felucca.c",
     "lines": "45",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/felucca.c#L45"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/ui.c",
     "lines": "204-216",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui.c#L204-L216"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_floyd.c",
     "lines": "209-222",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L209-L222"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/eng_floyd.c",
     "lines": "80-96",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L80-L96"
    }
   ]
  }
 ],
 "saving_note": "The working loop saves itself once stopped and silent, after 2.5 seconds without panel input and at least 20 seconds between writes; the first idle save can happen without an edit if no readable loop loaded; live-section and recorded-song writes wait until stopped, quiet and idle for 1.5 seconds, with checks at least 5 seconds apart; power-off does not flush edits; OP2–OP4 envelopes and LEVEL 1/4 are omitted from every save.",
 "switching_note": {
  "kept_on_unit": "Settings, panel calibration, song order, sections A–D, two banks of user sounds, three sample sets and the working loop are kept when their corresponding saves succeed; power-off does not flush changes. From the flash atlas: install (included loader): Included loader overwrites differing application sectors 0x4000–0x92FFF. This includes all 16 M-VAVE Open USER projects, preferences, shared save staging and beginning/header of its shared sample bank. Losing that header invalidates the bank even where later audio bytes survive. Head/SPL below 0x4000 is preserved (accepted package and matching chip key; no device confirmation beyond initiating the host install). install finalization: Checks each sector trailer and erases only a matching update record, never the whole scan range. Saved projects and sound records end before the sector trailer; sample data is not an update record. The stock record location is reported from the base atlas, not tested on a unit (After an install, erase only a 4 KiB sector whose last 256 bytes hold a valid update record: marker 0x5441 at +6 and a matching nonzero CRC16 over bytes 2..79. In practice these are the family staging-record sector 0xE4000 and, on a first install from stock, stock's record sector 0xE8000. Saved music does not hold that record and is not at risk from this cleanup. This loader does not skip 0x97000–0xDFFFF). startup: If checked staging bytes are nonblank, boot erases all five update-area sectors without asking. Besides Open sample audio and uncertain stock/Baud Girl contents, this discards X0X and Polly pending-restore journals; interrupted restores may then remain unfinished (first 4 bytes at E0000 or first 8 at E4F00 are not all FF; no question). first eligible idle after startup: If no supported working loop was imported, autosave_hash stays 0 and the default loop is saved without any owner edit. Each later changed-loop autosave alternates storage-valid copies. A different FELU type or bad payload CRC is not protected; first no-valid copy writes A (normal stopped, quiet, menu-closed guards; >=20 s since boot and >=2.5 s input idle; no question). first HOME-menu close or any settings trigger after unreadable settings or older PER2 import: Rejected settings leave persist_saved zero; HOME-menu close or another real settings trigger can commit current/default 84 bytes even without an edit. Boot calibration calls saver even after timeout; only a byte difference writes. SONG SAVE, SONG REC section-store, completed SONG REC and a pending update-flush are also settings triggers. No REC MODE/START/SYNC trigger or backup restore in this package. An accepted 48-byte PER2 import preserves its old magic in persist_saved; serializing 84-byte PER3 differs even without an edit, so the first settings trigger writes (settings differ from saved bytes; menu close deferred during playback; no question). warm restart with retained live sections: A valid noinit RAM section differing from flash is marked dirty and later written after quiet/idle guards; cold power-on makes no such promise (valid retained FUN4 RAM section differs from flash; no question). before update or host UBOOT: Before update or host UBOOT, flush dirty sections, song/settings only with song_dirty, and changed working loop unless arrangement is running. Only changed 84-byte settings write; an open-menu edit alone is not guaranteed flushed. No backup restore path (only respective dirty/hash-change flags; no extra question). web installer: Included page serves selected package through M-UPGRADE protocol; no separate erase-storage operation or automatic backup. It checks FM-1 model, refuses another firmware update-loader identity, and requires a saved-backup checkbox/confirm only for the official V15 return (included browser page, not a claim about community hub code). What SLOOP Floyd FM writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over SLOOP Floyd FM's is in when_you_leave.",
  "lost": "The separate OP2–OP4 envelopes and LEVEL 1/4 values survive sound or section loads in memory, but restarting resets them and every save omits them; LEVEL 1 affects the drawing only. From the flash atlas: Other firmwares reading SLOOP Floyd FM's data: Felucca lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Rainbow Mode lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Felucca [Salt] lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Only older sounds this firmware supports can play. Some may use a different instrument here. Newer sounds stay stored but hidden and cannot play in Salt; Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); WaveLoop FM-1 lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); WaveLoop FM-1 reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2 (Saved samples may have no slice positions set by you); SLOOP reads and uses SLOOP Floyd FM's settings, panel calibration and song order; user sample slot USR1; user sample slot USR2; user sample slot USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it); SLOOP takes over SLOOP Floyd FM's song section A; song section B; song section C; song section D; working loop kept by autosave, converting them (Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved; Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved); SLOOP lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved); sloopDX reads and uses SLOOP Floyd FM's settings, panel calibration and song order (New DX7 settings use defaults. Favourite and sound choices use the new firmware’s bank); sloopDX takes over SLOOP Floyd FM's song section A; song section B; song section C; song section D; working loop kept by autosave, converting them (Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices; Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices); sloopDX lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (Only sounds in the first engine appear. They play as DX7 sounds. Other sounds stay hidden. Saving other slots keeps them); SLOOP DX7 Banks reads and uses SLOOP Floyd FM's settings, panel calibration and song order; user sample slot USR1; user sample slot USR2; user sample slot USR3 (Floyd has no saved count of the DX banks DX7 Banks has set up. At start-up, DX7 Banks erases DX banks 1–8 and saves a new count; Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP DX7 Banks takes over SLOOP Floyd FM's song section A; song section B; song section C; song section D; working loop kept by autosave, converting them (Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved; Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved); SLOOP DX7 Banks lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved); FM1 Quest lists SLOOP Floyd FM's settings, panel calibration and song order; song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32; working loop kept by autosave, but plays them differently (Quest uses the old zoom choice for game options. Calibration and song order load. Changing Quest’s game options can change the zoom choice when you return; Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice; Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. Floyd’s FLOYD sounds stay hidden); FM1 Quest reads and uses SLOOP Floyd FM's user sample slot USR1 (USR1 plays only if its audio and zones fit Quest’s 64 KiB slot. Sending into or erasing USR1 replaces it, including holding REC on a readable USR1 in IMPORTER. Sending into or erasing USR2 can damage the end of the old USR1. Extra slice markers are not used here); JIANT takes over SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, converting them (JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept); ChoralRoot lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from); GHOULBOX lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently; GHOULBOX reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3; fm1-chord takes over SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, converting them (Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered); fm1-chord reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored); MAKU reads and uses SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3 (MAKU leaves these sample bytes in place, but its controls use built-in material; these uploaded samples are not available to play here); Jangada reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3; Skiff lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (The same saved sound format does not guarantee the same sound or pattern playback); Skiff reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Skiff uses its own sound engines, so saved loops or slices can play differently); Hortator lists SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); ORBIT takes over SLOOP Floyd FM's settings, panel calibration and song order; song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32; working loop kept by autosave, converting them (Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings; Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different; Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play); ORBIT reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); PIGEON reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); winampFM Synth takes over SLOOP Floyd FM's settings, panel calibration and song order; song section A; song section B; song section C; song section D; working loop kept by autosave, converting them (Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings; Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different); winampFM Synth lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32, but plays them differently (Shared older sounds may play differently because engines or sound controls mean different things); winampFM Synth reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); FM1 Move lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; working loop kept by autosave, but plays them differently (Shared older sounds may play differently because engines or sound controls mean different things; Only the working project is imported. It may play differently. Saved SLOOP sections are not imported); FM1 Move reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); X0X lists SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used); Jangada converts only older version 1 sounds in this group. Newer sound versions look empty, and saving anywhere in the group drops them from the rewritten group.. What SLOOP Floyd FM reads of other firmwares' data: SLOOP Floyd FM reads and uses Felucca's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM takes over SLOOP's settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites, converting them; SLOOP Floyd FM lists SLOOP's user sounds U01-U16; user sounds U17-U32, but plays them differently (A saved FM6 sound in engine 9 becomes a FLOYD sound and plays differently. PHYS and NOISE sounds stay hidden. Saving another slot keeps them. Replacing their slots or restoring the whole bank removes them); SLOOP Floyd FM reads and uses SLOOP's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM reads and uses X0X's break loops slot 1; break loops slot 2; break loops slot 3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM reads and uses GHOULBOX's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM takes over Hortator's settings and panel calibration, converting them; SLOOP Floyd FM reads and uses Hortator's user samples USR1; user samples USR2; user samples USR3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM reads and uses Skiff's user sample USR1; user sample USR2; user sample USR3 (Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used); SLOOP Floyd FM takes over sloopDX's settings, calibration, song order, MIDI, theme and favourites, converting them (Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load); SLOOP Floyd FM reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses MAKU's inherited user sample 1; inherited user sample 2; inherited user sample 3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses fm1-chord's uploaded sample USR1 and optional SLICE markers; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM takes over SLOOP DX7 Banks's settings, calibration, song order, synthesized drum kits and DX-bank setup, converting them (Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching); SLOOP Floyd FM lists SLOOP DX7 Banks's user sounds 1–16; user sounds 17–32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); SLOOP Floyd FM reads and uses SLOOP DX7 Banks's user sample USR1; user sample USR2; user sample USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses Jangada's user samples USR1; user samples USR2; user samples USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses WaveLoop FM-1's user sample USR1; user sample USR2 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM takes over ORBIT's settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences, converting them (Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options); SLOOP Floyd FM reads and uses ORBIT's sample slot USR1; sample slot USR2; sample slot USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM takes over winampFM Synth's settings, panel calibration, song order, SYN kits and MIDI, converting them (Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options); SLOOP Floyd FM lists winampFM Synth's user sounds 1-16; user sounds 17-32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); SLOOP Floyd FM reads and uses winampFM Synth's sample USR1; sample USR2; sample USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM takes over Felucca [Salt]'s project 1; project 2; project 3; project 4, converting them (Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy); SLOOP Floyd FM lists Felucca [Salt]'s user sounds U01-U16; user sounds U17-U32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced); SLOOP Floyd FM reads and uses Felucca [Salt]'s user sample USR1; user sample USR2; user sample USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM lists FM1 Move's user sounds U01–U16; user sounds U17–U32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); SLOOP Floyd FM reads and uses FM1 Move's sample slot USR1; sample slot USR2; sample slot USR3 (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM takes over FM1 Quest's settings, panel mapping, song order and Quest preferences/progress, converting them (Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings); SLOOP Floyd FM reads and uses FM1 Quest's song section A; song section B; song section C; song section D; working music (autosave); sample USR1 (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine; Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM lists FM1 Quest's user sounds U01–U16; user sounds U17–U32, but plays them differently (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced). Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "Preserve your work before switching. See the switching advice in this section. Before installing or first starting it, back up with the firmware that made the saved work. Floyd itself has no complete backup or restore: record audio through its audio output, write down settings, song order and operator edits, and keep the original sample files. The editor’s Export bank reads visible user sounds from the unit into a file, but omits full projects, song order, settings, samples and the separate operator edits; Export library saves the browser’s own collection.",
  "restore": "There is no Backup page or whole-device restore in this build. An individual sound file applies selected sound and sequence values in memory; saving a user sound rewrites its whole sixteen-sound bank, and sample sends replace the reached sample sectors without a recovery copy or panel undo.",
  "going_back": "No older Floyd release was audited for downgrading. Later SLOOP can read the older saved settings and loop layout, but interprets Floyd’s engine number as its different FM engine, so the sound can change. If Floyd replaces all readable X0X settings copies, returning to X0X can reset its whole project even if its pattern bytes survived. Melodee can replace incompatible settings and shared sound banks at startup, so a trip through it can destroy Floyd’s saved work.",
  "parent_data": "Floyd reuses SLOOP v2.7.1’s locations for sections, the working loop, settings and both user-sound banks, plus its first three sample locations. It ignores the newer parent’s saved projects and working loop, reads only the older portion of parent settings and discards later additions when writing settings. Common user sounds can load, parent FM6 user sounds become Floyd sounds, and PHYS/NOISE sounds are hidden. It has no fourth sample slot; parent samples using release tails instead loop normally.",
  "overwrites_of_other_firmwares": [
   "Installing Floyd with the included loader replaces differing program sectors without a separate question about saved work. See the switching advice in this section for the affected saved work. M-VAVE Open’s sample header is lost during install, so the shared bank becomes unusable even where later audio bytes remain.",
   "At installation cleanup, the loader erases a sector only when its last 256 bytes hold a valid update record, with the expected marker and a matching nonzero checksum. The realistic targets are the Felucca-family sector holding pending install instructions and, on a first install from stock, stock’s sector holding its install request and temporary VM backup (location reported). Clearing the family record can discard pending install instructions for ChoralRoot’s recovery loader and install request; Hortator’s temporary update data; OberVave’s temporary update loader, temporary update resume record; Rainbow Mode’s Temporary incoming firmware loader and pending-update record; DUELL’s firmware update staging; FiMba-1’s temporary firmware update loader, temporary update resume record; MAKU’s temporary update data; Fart Machine One’s temporary update loader, temporary update resume record. Clearing stock’s record erases that VM backup. This happens without another question. Saved music does not hold a valid update record; this cleanup does not erase songs, sounds or samples.",
   "A firmware-update attempt, including a refused attempt, erases the update area without a device question. Starting Floyd also erases that area if its checked beginning or update-record bytes are present; a journal elsewhere alone does not trigger cleanup. See the switching advice in this section for the affected saved work. Stock and Baud Girl locations are broad reported ranges; exact losses are uncertain. Writes to shared storage can also remove other firmwares’ unfinished restores and pending updates; keep the original files.",
   "The working loop saves itself while stopped and quiet, first eligible about 20 seconds after power-on, even with no edit when the old loop could not load. Updating or entering update mode can flush it sooner. There is no replacement question. See the switching advice in this section for the affected saved work. Stock and Baud Girl locations are broad reported ranges; exact losses are uncertain.",
   "Changed settings are saved without a replacement question when HOME closes, after power-on calibration, with SAVE on SONG, when REC stores a section from SONG, when SONG REC finishes, or when pending changes flush before an update. A first menu close after unreadable settings can write even without an edit; after loading Hortator’s older settings, the first settings trigger writes the newer format even without an edit; cancelled calibration can write only if current bytes differ. Later saves can replace the other copy. See the switching advice in this section for the affected saved work. Replacing X0X settings can make X0X return with its whole project reset once it has no readable settings copy.",
   "Saving or storing a section writes its saved project, immediately while stopped or later after live storage while playing; a warm restart can flush a surviving changed section too. The SAVE page arms a second turn, while live/SONG replacement asks only for a section Floyd can read. Foreign work can appear empty. See the switching advice in this section for the affected saved work. Stock and Baud Girl locations are broad reported ranges; exact losses are uncertain.",
   "Saving or erasing a user sound rewrites its entire sixteen-sound bank. The panel arms a second turn; raw editor commands ask nothing and may write during playback. A sound that Floyd cannot read can look empty. See the switching advice in this section for the affected saved work. Stock and Baud Girl locations are broad reported ranges; exact losses are uncertain.",
   "Sending a sample set starts replacing that slot immediately; erasing a slot clears all of it. The included editor asks, but the device protocol does not and can write during playback. There is no recovery copy. See the switching advice in this section for the affected saved work. Stock and Baud Girl locations are broad reported ranges; exact losses are uncertain."
  ],
  "cross_firmware": "See the switching advice in this section. Other firmwares can overwrite its saved work at startup and during ordinary use, without a save action; preserve audio, written settings and any sound exports before leaving it. Floyd’s section saves, section writes after a warm reset or before updates or USB update mode, user-sound saves, sends and erases, and sample uploads and erases can also replace ChoralRoot’s legacy sounds 1–32, VA patches, FM6 patches 1–32, CZ patches 1–32 and FM TONE patches, kept for returning to ChoralRoot 0.21 or older.",
  "source": [
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "233-248",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L233-L248"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "362-417",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L362-L417"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "419-527",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L419-L527"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "533-619",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L533-L619"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/upreset.c",
    "lines": "163-194",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L163-L194"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/eng_floyd.c",
    "lines": "10-22",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L10-L22"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/eng_floyd.c",
    "lines": "104-187",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_floyd.c#L104-L187"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/params.c",
    "lines": "380-405",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/params.c#L380-L405"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/storage.c",
    "lines": "51-156",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/storage.c#L51-L156"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/eng_sample.c",
    "lines": "41-102",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L41-L102"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/editor.c",
    "lines": "16-22",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L16-L22"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/editor.c",
    "lines": "476-515",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L476-L515"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/editor.c",
    "lines": "579-623",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L579-L623"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "web/editor.html",
    "lines": "1012-1033",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/web/editor.html#L1012-L1033"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "web/editor.html",
    "lines": "3573-3620",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/web/editor.html#L3573-L3620"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "web/editor.html",
    "lines": "3994-4029",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/web/editor.html#L3994-L4029"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "31-34",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/loader/ldr_core.c#L31-L34"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "105-176",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/loader/ldr_core.c#L105-L176"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "91-103",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/loader/ldr_core.c#L91-L103"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "175-176",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/loader/ldr_core.c#L175-L176"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ota.c",
    "lines": "269-408",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ota.c#L269-L408"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/main.c",
    "lines": "107-110",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L107-L110"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/storage.c",
    "lines": "14-30",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/storage.c#L14-L30"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "19-86",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L19-L86"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "166-230",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L166-L230"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "300-323",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L300-L323"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/storage.c",
    "lines": "51-155",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/storage.c#L51-L155"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ui_menu.c",
    "lines": "72-81",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_menu.c#L72-L81"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/main.c",
    "lines": "139-142",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L139-L142"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/ui_song.c",
    "lines": "123-132",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/ui_song.c#L123-L132"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/upreset.c",
    "lines": "17-63",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L17-L63"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/upreset.c",
    "lines": "152-194",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L152-L194"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/engines.c",
    "lines": "19-24",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/engines.c#L19-L24"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/upreset.c",
    "lines": "17-53",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/upreset.c#L17-L53"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/editor.c",
    "lines": "76-122",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L76-L122"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/eng_sample.c",
    "lines": "112-130",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/eng_sample.c#L112-L130"
   },
   {
    "kind": "source",
    "repo": "renebohne/sloop-fm1",
    "ref": "v2.4",
    "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
    "path": "firmware/src/project.c",
    "lines": "458-475",
    "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/project.c#L458-L475"
   }
  ],
  "return_trip_evidence": [
   {
    "reader": "x0x",
    "what_happens": "If Floyd overwrote both needed X0X settings copies, X0X cannot load that required object and its all-or-nothing project load returns the whole project to defaults. Do not equate surviving pattern bytes with a usable project.",
    "src": "flash-atlas/atlas.json x0x.settings load_rule and load_group; x0x.project load_groups",
    "grade": "read-in-source"
   },
   {
    "reader": "melodee",
    "what_happens": "Melodee foreign-settings policy defaults and writes settings at startup without asking; matching committed unsupported preset banks are repaired at startup too. Floyd working music has the same type7 at9F000/FE000 but isFUN4,not a supported shared sound bank,so do not rely on it surviving a trip through Melodee.",
    "src": "flash-atlas/atlas.json reads_foreign reader=melodee writer=sloop settings/working_project; melodee.settings and native_fm6_f033_f048 load_rule; Floyd ownFUN4/type7 layout above",
    "grade": "inferred",
    "why": "Same source-proven reader header/type locations and unsupported format class; a Floyd-specific unit test was not run."
   },
   {
    "reader": "sloop",
    "what_happens": "The later mapped SLOOP reads this84-bytePER3 prefix and defaults missing lights/kits/MIDI additions. Its newer project importer supportsFUN4 but FLOYD engine9 has a different meaning there (FM6),so sound identity is not preserved.",
    "src": "flash-atlas/atlas.json sloop.settings load_rule and sloop.section_a payload_format; parent2.7.1 engine table; ownaff6ba4 engines.c19-24",
    "grade": "inferred",
    "why": "Reader shapes and engine-number collision are documented; no hardware round trip was run."
   }
  ],
  "stock_backup_evidence": {
   "grade": "reported",
   "sources": [
    "Felucca firmware/hal/fm1_flash.h:47@v1.6.1 (comment, reported)",
    "flash-atlas/atlas.json stock.vm short/holds and install_and_startup_writes stock update mode under stock (reported)"
   ]
  },
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns).",
    "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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user presets 1-16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)",
     "user presets 17-32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)"
    ],
    "notes": [
     "SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used."
    ],
    "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; user sample slot USR1; user sample slot USR2; user sample slot USR3. Kept but not shown: user presets 1-16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them); user presets 17-32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them). SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds U01-U16 (A saved FM6 sound in engine 9 becomes a FLOYD sound and plays differently. PHYS and NOISE sounds stay hidden. Saving another slot keeps them. Replacing their slots or restoring the whole bank removes them)",
     "user sounds U17-U32 (A saved FM6 sound in engine 9 becomes a FLOYD sound and plays differently. PHYS and NOISE sounds stay hidden. Saving another slot keeps them. Replacing their slots or restoring the whole bank removes them)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used."
    ],
    "owner_text": "At risk by itself: the music in progress (autosave); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites (changed to the new format: Saving settings removes the newer light settings, synthesized drum kits, learned MIDI controls, theme and favourites from that saved copy). 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 sample slot USR1; user sample slot USR2; user sample slot USR3. Carried over: user sounds U01-U16 (A saved FM6 sound in engine 9 becomes a FLOYD sound and plays differently. PHYS and NOISE sounds stay hidden. Saving another slot keeps them. Replacing their slots or restoring the whole bank removes them); user sounds U17-U32 (A saved FM6 sound in engine 9 becomes a FLOYD sound and plays differently. PHYS and NOISE sounds stay hidden. Saving another slot keeps them. Replacing their slots or restoring the whole bank removes them). SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
    "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": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads break loops slot 1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads break loops slot 2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads break loops slot 3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used."
    ],
    "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; break loops slot 1; break loops slot 2; break loops slot 3. SLOOP Floyd FM reads break loops slot 1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads break loops slot 2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads break loops slot 3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
    "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 for the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds U01-U16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)",
     "user sounds U17-U32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)"
    ],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches for 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) (partly 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. Kept but not shown: user sounds U01-U16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them); user sounds U17-U32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them).",
    "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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "partly lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "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 (partly 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.",
    "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": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes 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": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes 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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session saved with a global save",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "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 session saved with a global save; 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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds 1–16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)",
     "user sounds 17–32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them)"
    ],
    "notes": [
     "SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used."
    ],
    "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; user sample slot USR1; user sample slot USR2; user sample slot USR3. Kept but not shown: user sounds 1–16 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them); user sounds 17–32 (These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them). SLOOP Floyd FM reads user sample slot USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample slot USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
    "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": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if the checked parts at the start of the firmware update tool or in its saved update progress contain data",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you start an update with a computer tool",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "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.",
    "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": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "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).",
    "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": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user samples USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user samples USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user samples USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used."
    ],
    "owner_text": "At risk by itself: settings and panel calibration (changed to the new format: After the new firmware saves its settings, returning to Hortator uses defaults for settings, control calibration and the remembered Bluetooth device). At risk when you act: project A; project B; project C; project D; user samples USR1; user samples USR2; user samples USR3. SLOOP Floyd FM reads user samples USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user samples USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user samples USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
    "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": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses 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 calibrate the controls from HOME and close the menu (without asking) [uses 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 press REC on the SONG screen to save a section and the song order (without asking) [uses 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 (without asking) [uses 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 start calibrating the controls at power-on (without asking) [uses 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: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); 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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes 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": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses 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": "automatically during use [uses 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 save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "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": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses 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": "automatically during use [uses 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 save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "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": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used.",
     "SLOOP Floyd FM keeps stored but does not show user sound bank 1 until you write over the saved data. These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them.",
     "SLOOP Floyd FM keeps stored but does not show user sound bank 2 until you write over the saved data. These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them."
    ],
    "owner_text": "At risk by itself: user sounds’ own FM6 patches; settings, calibration and favourites; 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); 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). At risk when you act: project A; project B; project C; project D; user sample USR1; user sample USR2; user sample USR3. SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Samples play only if they pass the check and their zones fit this slot. Sending to or erasing this slot replaces the sample. Extra slice markers are not used. SLOOP Floyd FM keeps stored but does not show user sound bank 1 until you write over the saved data. These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them. SLOOP Floyd FM keeps stored but does not show user sound bank 2 until you write over the saved data. These sounds stay hidden. Saving elsewhere in the bank keeps them; replacing their slots or restoring a whole bank removes them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopdx",
    "name": "sloopDX",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, MIDI, theme and favourites",
      "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "DX7 bank 1 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 1 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "selected DX7 bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "MY KIT",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1–16",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "user presets 17–32",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM keeps stored but does not show user presets 1–16 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP Floyd FM keeps stored but does not show user presets 17–32 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: working loop; settings, calibration, song order, MIDI, theme and favourites (changed to the new format: Saving settings removes sloopDX’s light options, learned MIDI controls, theme and favourites from that copy. The shared calibration and song order still load). At risk when you act: section A; section B; section C; section D; DX7 bank 1 voices 1–16; DX7 bank 1 voices 17–32; DX7 bank 2 voices 1–16; DX7 bank 2 voices 17–32; DX7 bank 3 voices 1–16; DX7 bank 3 voices 17–32; DX7 bank 4 voices 1–16; DX7 bank 4 voices 17–32; DX7 bank 5 voices 1–16; DX7 bank 5 voices 17–32; DX7 bank 6 voices 1–16; DX7 bank 6 voices 17–32; DX7 bank 7 voices 1–16; DX7 bank 7 voices 17–32; DX7 bank 8 voices 1–16; DX7 bank 8 voices 17–32; selected DX7 bank; MY KIT; user presets 1–16 (partly lost (only that slot)); user presets 17–32 (partly lost (only that slot)). SLOOP Floyd FM keeps stored but does not show user presets 1–16 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP Floyd FM keeps stored but does not show user presets 17–32 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "rainbow",
    "name": "Rainbow Mode",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "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 save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "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 sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "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 save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "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": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP Floyd FM keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. SLOOP Floyd FM reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP Floyd FM keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "duell",
    "name": "DUELL beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved patches",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M01–M02",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M03–M04",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M05–M06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M07–M08",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M09–M10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M11–M12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M13–M14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M15–M16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P01–P06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P07–P12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P13–P16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved patches; settings and panel setup. At risk when you act: multis M01–M02; multis M03–M04; multis M05–M06; multis M07–M08; user wavetable USR1; user wavetable USR2; user wavetable USR3; multis M09–M10; multis M11–M12; multis M13–M14; multis M15–M16; patterns P01–P06; patterns P07–P12; patterns P13–P16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fimba",
    "name": "FiMba-1 beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FiMba-1 beta sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FiMba-1 beta panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FiMba-1 beta sound and playing setup. At risk when you act: FiMba-1 beta panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "maku",
    "name": "MAKU",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "inherited FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "inherited user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)",
     "inherited user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)"
    ],
    "notes": [
     "SLOOP Floyd FM reads inherited user sample 1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads inherited user sample 2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads inherited user sample 3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: inherited FM6 patches for user presets; settings and calibration. At risk when you act: inherited project A; inherited project B; inherited project C; inherited project D; inherited user sample 1; inherited user sample 2; inherited user sample 3. Kept but not shown: inherited user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound); inherited user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound). SLOOP Floyd FM reads inherited user sample 1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads inherited user sample 2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads inherited user sample 3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "learned button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: learned button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "chord",
    "name": "fm1-chord",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration, four chord preset setups and the current chord setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P1: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P2: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P3: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P4: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR1 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR2 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR3 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds 1-16 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)",
     "user sounds 17-32 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)"
    ],
    "notes": [
     "SLOOP Floyd FM reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: FM6 bank B1-B27; settings, panel calibration, four chord preset setups and the current chord setup. At risk when you act: chord preset P1: full synth project; chord preset P2: full synth project; chord preset P3: full synth project; chord preset P4: full synth project; uploaded sample USR1 and optional SLICE markers; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers. Kept but not shown: user sounds 1-16 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound); user sounds 17-32 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound). SLOOP Floyd FM reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, synthesized drum kits and DX-bank setup",
      "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds 1–16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)",
     "user sounds 17–32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: working loop; settings, calibration, song order, synthesized drum kits and DX-bank setup (changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options. After Floyd saves settings, DX7 Banks has no saved count of banks already set up when you return. It erases DX banks 1–8 at its first start. Back up your DX banks before switching). At risk when you act: section A; section B; section C; section D; user sample USR1; user sample USR2; user sample USR3. Carried over: user sounds 1–16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); user sounds 17–32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound). SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fumi",
    "name": "FuMi-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jangada",
    "name": "Jangada",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "working music (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, calibration and MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user samples USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user samples USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user samples USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: working music (autosave); preferences, calibration and MIDI LEARN map. At risk when you act: project 1; project 2; project 3; project 4; user sounds U01-U16; user sounds U17-U32; user samples USR1; user samples USR2; user samples USR3. SLOOP Floyd FM reads user samples USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user samples USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user samples USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches and controls for each drum in user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session saved for the next start",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions you set for USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions you set for USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song order and selection",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds 1–16 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)",
     "user sounds 17–32 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)"
    ],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: FM6 patches and controls for each drum in user sounds; settings, calibration and favourites. At risk when you act: song 1; song 2; song 3; last session saved for the next start; slice positions you set for USR1; slice positions you set for USR2; song 4; song 5; song 6; song 7; song 8; song 9; song 10; song 11; song 12; song order and selection; user sample USR1; user sample USR2. Kept but not shown: user sounds 1–16 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound); user sounds 17–32 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound). SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "orbit",
    "name": "ORBIT",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences",
      "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       }
      ]
     },
     {
      "object": "USER sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "USER sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: saved section A (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section B (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section C (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section D (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); working music kept by autosave; settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences (changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options). At risk when you act: USER sounds U01-U16 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); USER sounds U17-U32 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); sample slot USR1; sample slot USR2; sample slot USR3. SLOOP Floyd FM reads sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "winampfm",
    "name": "winampFM Synth",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration, song order, SYN kits and MIDI",
      "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options"
       }
      ]
     },
     {
      "object": "section A (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds 1-16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)",
     "user sounds 17-32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: working music kept by autosave; settings, panel calibration, song order, SYN kits and MIDI (changed to the new format: Saving settings keeps only the older colour, display, calibration and song-order choices. The saved copy lacks newer light options, drum kits, MIDI controls and separately saved options). At risk when you act: section A (whole project); section B (whole project); section C (whole project); section D (whole project); sample USR1; sample USR2; sample USR3. Carried over: user sounds 1-16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); user sounds 17-32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound). SLOOP Floyd FM reads sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "sixteen six-track patterns",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "some or all lost"
       },
       {
        "way": "automatically during use",
        "effect": "some or all lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "song order and four scenes",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "some or all lost"
       },
       {
        "way": "automatically during use",
        "effect": "some or all lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "eight saved sampler takes",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "twelve uploaded sounds or DX7 banks",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "screen language pack",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "system preferences and last pattern",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: sixteen six-track patterns (some or all lost); song order and four scenes (some or all lost). At risk when you act: eight saved sampler takes (some or all lost); twelve uploaded sounds or DX7 banks (some or all lost); screen language pack; system preferences and last pattern.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "salt",
    "name": "Felucca [Salt]",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "screen preferences, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save the current music as a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save the current music as a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save the current music as a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       },
       {
        "way": "when you save the current music as a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds U01-U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced)",
     "user sounds U17-U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: screen preferences, calibration and favourites. At risk when you act: project 1 (changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy); project 2 (changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy); project 3 (changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy); project 4 (changed to the new format: Once you save this section, its drum pattern and timing use the new format. SALT cannot open that saved copy); user sample USR1; user sample USR2; user sample USR3. Carried over: user sounds U01-U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced); user sounds U17-U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced). SLOOP Floyd FM reads user sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "pigeon",
    "name": "PIGEON",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "older user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)",
     "older user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)"
    ],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. Kept but not shown: older user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound); older user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound). SLOOP Floyd FM reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1move",
    "name": "FM1 Move",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, SYN kits and stored MIDI mappings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "the working project kept by autosave",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save the song order (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds U01–U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)",
     "user sounds U17–U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: settings, calibration, SYN kits and stored MIDI mappings; project 1 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain); project 2 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain); the working project kept by autosave (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain). At risk when you act: sample slot USR1; sample slot USR2; sample slot USR3. Carried over: user sounds U01–U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound); user sounds U17–U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. A saved FM6 sound in engine 9 becomes a FLOYD sound). SLOOP Floyd FM reads sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel mapping, song order and Quest preferences/progress",
      "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "song section A (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine)",
     "song section B (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine)",
     "song section C (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine)",
     "song section D (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine)",
     "working music (autosave) (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine)",
     "user sounds U01–U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced)",
     "user sounds U17–U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced)"
    ],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: settings, panel mapping, song order and Quest preferences/progress (changed to the new format: Saving settings removes Quest’s light options and changes its game progress and preferences. Song order and calibration still load. This saved copy does not back up Quest’s settings). At risk when you act: sample USR2; sample USR3; Piano Hero P1; Piano Hero P2; Piano Hero P3; Piano Hero P4; Piano Hero P5; Piano Hero P6; FM Hero H1; FM Hero H2; FM Hero H3; FM Hero H4; FM Hero H5; FM Hero H6; sample USR1. Carried over: song section A (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine); song section B (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine); song section C (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine); song section D (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine); working music (autosave) (The saved song format loads. Built-in voices and effects still use the new firmware’s sound engine); user sounds U01–U16 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced); user sounds U17–U32 (Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced). SLOOP Floyd FM reads sample USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "Groove project slot 1",
     "Groove project slot 2",
     "Groove project slot 3",
     "Groove resume autosave",
     "Groove sound bank A",
     "Groove sound bank B",
     "Groove sound bank C",
     "Groove sound bank D",
     "Groove custom drum sounds and kits",
     "Groove device preferences",
     "Groove crash reports"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Groove OS does not publish where or how it stores saved work, so loss is possible even when shared storage cannot be found. Before switching, use export all on its Projects page to save every project and the automatically saved music. Use Save a backup on Your own sounds too. Project exports list the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, automatically saved music and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): Groove project slot 1; Groove project slot 2; Groove project slot 3; Groove resume autosave; Groove sound bank A; Groove sound bank B; Groove sound bank C; Groove sound bank D; Groove custom drum sounds and kits; Groove device preferences; Groove crash reports. Groove OS does not publish where or how it stores saved work, so loss is possible even when shared storage cannot be found. Before switching, use export all on its Projects page to save every project and the automatically saved music. Use Save a backup on Your own sounds too. Project exports list the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, automatically saved music and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "song section A",
     "song section B",
     "song section C",
     "song section D",
     "the working loop kept by autosave",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "user sounds U01–U16",
     "user sounds U17–U32"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; user sample slot USR3; 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": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "song section A",
     "song section B",
     "song section C",
     "song section D",
     "the working loop kept by autosave",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "user sounds U01–U16",
     "user sounds U17–U32"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; user sample slot USR3; 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": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if beta 2ND CORE is on and a sound calculation fails or takes too long",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CC assignments (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Felucca may start with beta 2ND CORE ON or OFF after SLOOP Floyd FM. Do not rely on your earlier choice: SLOOP Floyd FM can replace the saved settings with ones Felucca cannot read. Check MENU > SYSTEM > 2ND CORE when you return. ON (BETA) can turn itself OFF and save settings if a sound calculation fails or takes too long; OFF prevents that second-core save.",
     "Felucca reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Felucca reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Felucca reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. Felucca may start with beta 2ND CORE ON or OFF after SLOOP Floyd FM. Do not rely on your earlier choice: SLOOP Floyd FM can replace the saved settings with ones Felucca cannot read. Check MENU > SYSTEM > 2ND CORE when you return. ON (BETA) can turn itself OFF and save settings if a sound calculation fails or takes too long; OFF prevents that second-core save. Felucca reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Felucca reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Felucca reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start an update or enter UPDATE MODE",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "automatically, only if SLOOP can still read older SLOOP settings with default MIDI controls and older working music whose drum MIDI channel differs from those settings (Floyd’s own settings cannot trigger this update)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (asks first)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save drum kits from the web editor (without asking)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you send or remove a theme from the web editor (without asking)",
        "effect": "kept: SLOOP can read it"
       },
       {
        "way": "when you send the song from the web editor (without asking)",
        "effect": "kept: SLOOP can read it"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a section from the web editor LIVE page (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a section from the web editor LIVE page (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a section from the web editor LIVE page (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save a section from the web editor LIVE page (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP reads user sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved.",
     "SLOOP reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved.",
     "SLOOP reads settings, panel calibration and song order until you write over the saved data."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave; settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. SLOOP reads user sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved. SLOOP reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved. SLOOP reads settings, panel calibration and song order until you write over the saved data.",
    "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",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if X0X crashed while 2ND CORE was on and then restarted without being switched off",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed.",
     "X0X reads user sample slot USR1 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
     "X0X reads user sample slot USR2 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
     "X0X reads user sample slot USR3 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used."
    ],
    "owner_text": "At risk by itself: song section A; song section B; song section C; song section D; user sounds U17–U32; settings, panel calibration and song order. At risk when you act: user sounds U01–U16; user sample slot USR1; user sample slot USR2; user sample slot USR3. After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed. X0X reads user sample slot USR1 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. X0X reads user sample slot USR2 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. X0X reads user sample slot USR3 until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
    "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",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song using MIDI PROGRAM CHANGE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and a compatible old FM6 bank is present",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sample slot USR3; settings, panel calibration and song order. At risk by itself, under a condition: the working loop kept by autosave. At risk when you act: song section A; song section B; song section C; song section D; user sample slot USR1; user sample slot USR2; 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": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting on the panel or in the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; settings, panel calibration and song order. At risk by itself, under a condition: song section A; song section B; song section C; song section D; user sample slot USR3. At risk when you act: user sample slot USR1; user sample slot USR2.",
    "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, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order. 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, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order. 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": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot favourites save is still stored and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot session save is still stored and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot sound collection is still saved and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if the space for its next save still needs clearing after a save or a failed start-up cleanup",
        "effect": "lost"
       },
       {
        "way": "automatically, only if there is no saved sound collection and at least one supported older user sound can be read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Import 0.21 sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and press OCT+ or SAVE (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Place all from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose a voice from a DX7 or CZ bank on the installer page and import it (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion or reset with OCT+ (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer tool (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete all user sounds or reset sounds to factory defaults from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete selected sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you import a Digitone sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound file or one DX7 or CZ voice from the installer page (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you move or swap sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place a sound as new or back in its saved factory position from the device manager (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place several selected sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the device manager and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the installer page and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace a selected user sound from the device manager (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace factory sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore factory order from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore factory presets from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording, editing or clearing this loop (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you place a loop from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode when the current loop is not empty (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you swap loop slots from the device manager (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a processor failure blocked Dual Core while its saved setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "ChoralRoot reads user sounds U01–U16 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
     "ChoralRoot reads user sounds U17–U32 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from."
    ],
    "owner_text": "At risk by itself: user sample slot USR2; user sample slot USR3; settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sounds U01–U16; user sounds U17–U32. ChoralRoot reads user sounds U01–U16 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from. ChoralRoot reads user sounds U17–U32 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
    "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": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds is left and a compatible older FM6 bank is still stored",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "GHOULBOX reads user sample slot USR1 until you write over the saved data.",
     "GHOULBOX reads user sample slot USR2 until you write over the saved data.",
     "GHOULBOX reads user sample slot USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk by itself, under a condition: the working loop kept by autosave. At risk when you act: song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. GHOULBOX reads user sample slot USR1 until you write over the saved data. GHOULBOX reads user sample slot USR2 until you write over the saved data. GHOULBOX reads user sample slot USR3 until you write over the saved data.",
    "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",
      "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 (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "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 (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "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 (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "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 (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by 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 (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Workbench adds Open's built-in samples right after installing it, without asking about samples. This replaces only the items marked 'by itself right after the Workbench installs Open', before you can save anything. This follows Open V12's source code; the downloaded Workbench has not been checked against it."
    ],
    "owner_text": "At risk by itself: song section A; song section B; song section C; song section D; the working loop kept by autosave. At risk when you act: user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32; settings, panel calibration and song order. Workbench adds Open's built-in samples right after installing it, without asking about samples. This replaces only the items marked 'by itself right after the Workbench installs Open', before you can save anything. This follows Open V12's source code; the downloaded Workbench has not been checked against it.",
    "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, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again.",
    "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, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "user sample slot USR2 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "user sample slot USR3 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D. Carried over: user sample slot USR1 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); user sample slot USR2 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); user sample slot USR3 (Hortator uses its own one-shot sound engines, so saved loops and slices play differently).",
    "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": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed."
    ],
    "owner_text": "At risk by itself: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; settings, panel calibration and song order. At risk when you act: user sample slot USR3; user sounds U01–U16; user sounds U17–U32. After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed.",
    "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": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start and has not already cleared the old scene storage",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Skiff reads user sample slot USR1 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
     "Skiff reads user sample slot USR2 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
     "Skiff reads user sample slot USR3 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order; user sample slot USR1; user sample slot USR2; user sample slot USR3. At risk by itself, under a condition: song section A; song section B; song section C; song section D; the working loop kept by autosave. At risk when you act: user sounds U01–U16; user sounds U17–U32. Skiff reads user sample slot USR1 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently. Skiff reads user sample slot USR2 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently. Skiff reads user sample slot USR3 until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopdx",
    "name": "sloopDX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save MY KIT by tapping SAVE twice from KIT or LANE (asks first: press again to confirm)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MY KIT from the web editor (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: sloopDX can read it"
       },
       {
        "way": "automatically, only when the saved input setting selects one MIDI channel rather than NOTES or CLOCK",
        "effect": "kept: sloopDX can read it"
       },
       {
        "way": "when you calibrate the controls at power-on (without asking)",
        "effect": "kept: sloopDX can read it"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "kept: sloopDX can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "kept: sloopDX can read it"
       },
       {
        "way": "when you send settings, MIDI controls or a theme with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you erase a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you erase a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you erase a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you erase a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. Synth parts play as DX7 sounds, with different engine and voice choices"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Older sections change to DX7 parts. Saving a changed section, or the working loop being saved automatically, writes a format Floyd cannot open.",
     "sloopDX reads user sounds U01–U16 until you write over the saved data. Only sounds in the first engine appear. They play as DX7 sounds. Other sounds stay hidden. Saving other slots keeps them.",
     "sloopDX reads user sounds U17–U32 until you write over the saved data. Only sounds in the first engine appear. They play as DX7 sounds. Other sounds stay hidden. Saving other slots keeps them.",
     "sloopDX reads settings, panel calibration and song order until you write over the saved data. New DX7 settings use defaults. Favourite and sound choices use the new firmware’s bank."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave; user sample slot USR2; settings, panel calibration and song order. At risk by itself, under a condition: user sample slot USR1. At risk when you act: song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32. Older sections change to DX7 parts. Saving a changed section, or the working loop being saved automatically, writes a format Floyd cannot open. sloopDX reads user sounds U01–U16 until you write over the saved data. Only sounds in the first engine appear. They play as DX7 sounds. Other sounds stay hidden. Saving other slots keeps them. sloopDX reads user sounds U17–U32 until you write over the saved data. Only sounds in the first engine appear. They play as DX7 sounds. Other sounds stay hidden. Saving other slots keeps them. sloopDX reads settings, panel calibration and song order until you write over the saved data. New DX7 settings use defaults. Favourite and sound choices use the new firmware’s bank.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "rainbow",
    "name": "Rainbow Mode",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. Rainbow Mode reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "duell",
    "name": "DUELL beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change MIDI LEARN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change USB serial settings from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you change preferences from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a user wavetable from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a pattern (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fimba",
    "name": "FiMba-1 beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE briefly (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order. 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": "maku",
    "name": "MAKU",
    "flags": "CS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 bank is still stored and no valid set of FM6 patches for your sounds is stored",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself, under a condition: the working loop kept by autosave. At risk when you act: settings, panel calibration and song order.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate."
    ],
    "owner_text": "At risk when you act: user sounds U01–U16. Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "chord",
    "name": "fm1-chord",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change favourites or their filter (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "fm1-chord reads user sample slot USR1 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample slot USR2 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample slot USR3 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. fm1-chord reads user sample slot USR1 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample slot USR2 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample slot USR3 until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool",
        "effect": "changed to the new format: Once the working loop is saved automatically, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "automatically during use",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save SYN drum kits from the web editor (without asking)",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "kept: SLOOP DX7 Banks can read it"
       },
       {
        "way": "when you send a song order from the web editor (without asking)",
        "effect": "kept: SLOOP DX7 Banks can read it"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (asks first)",
        "effect": "changed to the new format: Once you save this section, its notes and timing use the new format. The previous firmware cannot open that saved copy. FLOYD parts become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample kit to USR3 and USR4 (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP DX7 Banks reads user sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved.",
     "SLOOP DX7 Banks reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved.",
     "SLOOP DX7 Banks reads settings, panel calibration and song order until you write over the saved data. Floyd has no saved count of the DX banks DX7 Banks has set up. At start-up, DX7 Banks erases DX banks 1–8 and saves a new count."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave; settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. SLOOP DX7 Banks reads user sample slot USR1 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample slot USR2 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample slot USR3 until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved. SLOOP DX7 Banks reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. FLOYD sounds become FM6 sounds. Separate live envelope changes (how each note changes over time) were never saved. SLOOP DX7 Banks reads settings, panel calibration and song order until you write over the saved data. Floyd has no saved count of the DX banks DX7 Banks has set up. At start-up, DX7 Banks erases DX banks 1–8 and saves a new count.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fumi",
    "name": "FuMi-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, panel calibration and song order. 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": "jangada",
    "name": "Jangada",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically during use (if the second core fails and playback stops, with AUTO selected by default)",
        "effect": "lost"
       },
       {
        "way": "when you enter power-on hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you learn or clear MIDI CC mappings (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you set screen colours from the USB console (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 1 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 2 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 3 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 4 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. SLOOP Floyd FM cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Jangada reads user sample slot USR1 until you write over the saved data.",
     "Jangada reads user sample slot USR2 until you write over the saved data.",
     "Jangada reads user sample slot USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave; settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. Jangada reads user sample slot USR1 until you write over the saved data. Jangada reads user sample slot USR2 until you write over the saved data. Jangada reads user sample slot USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use, from its second start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at its first start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the buttons and knob at power-on; cancelling also requests a settings save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change a favourite mark or the filter for favourites (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a starred user sound, which also removes its favourite mark (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run MENU calibration, then close MENU (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MENU settings, display preferences or favourite changes from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the song order or selection has unsaved changes and project slot D is empty, holds WaveLoop’s automatically saved session or holds data WaveLoop cannot read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "WaveLoop FM-1 reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Saved samples may have no slice positions set by you.",
     "WaveLoop FM-1 reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Saved samples may have no slice positions set by you."
    ],
    "owner_text": "At risk by itself: song section A; song section D; settings, panel calibration and song order. At risk by itself, under a condition: song section B; song section C; user sample slot USR3. At risk when you act: the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2. WaveLoop FM-1 reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Saved samples may have no slice positions set by you. WaveLoop FM-1 reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Saved samples may have no slice positions set by you.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "orbit",
    "name": "ORBIT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "automatically during use",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "automatically, only when song order has an unsaved change as an update or restart starts",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you hold both OCT buttons as you turn it on to calibrate the controls (without asking)",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you choose SAVE > PROJECT > ERASE and repeat the action (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you choose SAVE > PROJECT > ERASE and repeat the action (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you choose SAVE > PROJECT > ERASE and repeat the action (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you choose SAVE > PROJECT > ERASE and repeat the action (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "ORBIT reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "ORBIT reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "ORBIT reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave (changed to the new format: the next save of this project uses ORBIT's project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different); settings, panel calibration and song order. At risk by itself, under a condition: song section A; song section B; song section C; song section D. At risk when you act: user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. ORBIT reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. ORBIT reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. ORBIT reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "winampfm",
    "name": "winampFM Synth",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a different usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you record the current music into the selected song section (asks first)",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       },
       {
        "way": "when you restore preferences or store SYN drum kits directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "changed to the new format: the next settings save adds this firmware's extra settings; if you switch back, your previous firmware can still read the settings it supports, but some saved choices may have different meanings. Only some settings are changed to the new format. Your saved sections are not stored in these settings; the song order is. Switching back may lose settings"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you erase slot A (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore section A directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you store section A (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you erase slot B (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore section B directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you store section B (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you erase slot C (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore section C directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you store section C (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you erase slot D (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you restore section D directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       },
       {
        "way": "when you store section D (asks first)",
        "effect": "changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR2 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR3 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "winampFM Synth reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth reads user sounds U01–U16 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things.",
     "winampFM Synth reads user sounds U17–U32 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave (changed to the new format: the next save of this project uses winampFM's newer project format; your previous firmware cannot load it if you switch back. Engines and sound controls can mean different things. Saved music can pass the same checks and still sound different); settings, panel calibration and song order. At risk by itself, under a condition: song section A; song section B; song section C; song section D. At risk when you act: user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. winampFM Synth reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth reads user sounds U01–U16 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things. winampFM Synth reads user sounds U17–U32 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; user sounds U01–U16; user sounds U17–U32. At risk by itself, under a condition: user sample slot USR3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "salt",
    "name": "Felucca [Salt]",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you erase a user sound (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send display or favourite changes from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds U01–U16 (Only older sounds this firmware supports can play. Some may use a different instrument here. Newer sounds stay stored but hidden and cannot play in Salt)",
     "user sounds U17–U32 (Only older sounds this firmware supports can play. Some may use a different instrument here. Newer sounds stay stored but hidden and cannot play in Salt)"
    ],
    "kept_unseen": [],
    "notes": [
     "Felucca [Salt] reads user sample slot USR1 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Felucca [Salt] reads user sample slot USR2 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Felucca [Salt] reads user sample slot USR3 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; user sample slot USR1; user sample slot USR2; user sample slot USR3. Carried over: user sounds U01–U16 (Only older sounds this firmware supports can play. Some may use a different instrument here. Newer sounds stay stored but hidden and cannot play in Salt); user sounds U17–U32 (Only older sounds this firmware supports can play. Some may use a different instrument here. Newer sounds stay stored but hidden and cannot play in Salt). Felucca [Salt] reads user sample slot USR1 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Felucca [Salt] reads user sample slot USR2 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Felucca [Salt] reads user sample slot USR3 until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "pigeon",
    "name": "PIGEON",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk by itself, under a condition: user sample slot USR1. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1move",
    "name": "FM1 Move",
    "flags": "SK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "when you finish calibration or let it time out after holding both OCT buttons as you turn it on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you rename or erase a user sound from the device page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you rename or erase a user sound from the device page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "the working loop kept by autosave (Only the working project is imported. It may play differently. Saved SLOOP sections are not imported)"
    ],
    "kept_unseen": [],
    "notes": [
     "FM1 Move reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move reads user sounds U01–U16 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things.",
     "FM1 Move reads user sounds U17–U32 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things."
    ],
    "owner_text": "At risk when you act: settings, panel calibration and song order; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. Carried over: the working loop kept by autosave (Only the working project is imported. It may play differently. Saved SLOOP sections are not imported). FM1 Move reads user sample slot USR1 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move reads user sample slot USR2 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move reads user sample slot USR3 until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move reads user sounds U01–U16 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things. FM1 Move reads user sounds U17–U32 until you write over the saved data. Shared older sounds may play differently because engines or sound controls mean different things.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the working loop kept by autosave",
      "effect": "changed to the new format: When the working loop is saved automatically, its notes stay but FLOYD parts are saved as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: When the working loop is saved automatically, its notes stay but FLOYD parts are saved as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you enter update mode or receive a firmware update",
        "effect": "changed to the new format: When the working loop is saved automatically, its notes stay but FLOYD parts are saved as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       }
      ]
     },
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you enter update mode with settings waiting to be saved",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save section A from SONG (asks first)",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you save section B from SONG (asks first)",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you save section C from SONG (asks first)",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you save section D from SONG (asks first)",
        "effect": "kept: FM1 Quest can read it"
       },
       {
        "way": "when you send settings with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save project A (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save section A from SONG (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save the current music as section A (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save project B (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save section B from SONG (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save the current music as section B (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save project C (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save section C from SONG (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save the current music as section C (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save project D (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save section D from SONG (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you save the current music as section D (asks first)",
        "effect": "changed to the new format: Saving this section keeps its notes but saves FLOYD parts as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR1 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H6 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P6 (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Notes and shared controls load. FLOYD parts become ANALOG in Quest, which uses its saved sync choice. Saving again keeps those changed choices.",
     "Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first.",
     "FM1 Quest reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. Floyd’s FLOYD sounds stay hidden.",
     "FM1 Quest reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. Floyd’s FLOYD sounds stay hidden.",
     "FM1 Quest reads settings, panel calibration and song order until you write over the saved data. Quest uses the old zoom choice for game options. Calibration and song order load. Changing Quest’s game options can change the zoom choice when you return."
    ],
    "owner_text": "At risk by itself: the working loop kept by autosave (changed to the new format: When the working loop is saved automatically, its notes stay but FLOYD parts are saved as ANALOG. Returning to Floyd does not restore the original sound choices. Notes load, but FLOYD parts become ANALOG and Quest uses its own saved sync choice); settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. Notes and shared controls load. FLOYD parts become ANALOG in Quest, which uses its saved sync choice. Saving again keeps those changed choices. Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first. FM1 Quest reads user sounds U01–U16 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. Floyd’s FLOYD sounds stay hidden. FM1 Quest reads user sounds U17–U32 until you write over the saved data. Only version-1 sounds with an engine available here appear. Shared controls load based on the saved control count; missing controls use defaults. Other sounds stay hidden until their slots are replaced. Floyd’s FLOYD sounds stay hidden. FM1 Quest reads settings, panel calibration and song order until you write over the saved data. Quest uses the old zoom choice for game options. Calibration and song order load. Changing Quest’s game options can change the zoom choice when you return.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "settings, panel calibration and song order",
     "song section A",
     "song section B",
     "song section C",
     "song section D",
     "user sounds U01–U16",
     "user sounds U17–U32",
     "the working loop kept by autosave",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): settings, panel calibration and song order; song section A; song section B; song section C; song section D; user sounds U01–U16; user sounds U17–U32; the working loop kept by autosave; user sample slot USR1; user sample slot USR2; user sample slot USR3. The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "editor": [
  {
   "action": "The bundled editor edits sounds, patterns, tracks and three sample slots over USB MIDI, but this installed build has no complete backup or restore command.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/editor.c",
     "lines": "16-22",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L16-L22"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/editor.c",
     "lines": "370-380",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L370-L380"
    }
   ]
  },
  {
   "action": "Sound and sample transfers can replace saved data during playback because their device handlers have no stopped-transport guard.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/editor.c",
     "lines": "477-516",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L477-L516"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/editor.c",
     "lines": "570-623",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L570-L623"
    }
   ]
  }
 ],
 "jack_notes": [
  {
   "part": "jack_usb",
   "action": "USB carries MIDI notes and browser-editor or firmware-install messages, with synth tracks on channels 1–3, drums on their chosen channel and other channels 4–16 following the selected track.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1450-1473",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1450-L1473"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/editor.c",
     "lines": "16-22",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/editor.c#L16-L22"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/main.c",
     "lines": "199-225",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/main.c#L199-L225"
    }
   ]
  },
  {
   "part": "jack_midi_in",
   "action": "TRS MIDI input is disabled in this build.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/felucca.c",
     "lines": "39-44",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/felucca.c#L39-L44"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "tools/build.py",
     "lines": "169-180",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/tools/build.py#L169-L180"
    }
   ]
  },
  {
   "part": "jack_usb",
   "action": "Playing the panel sends USB MIDI note-on and note-off messages for notes, chords and drum hits.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "997-1033",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L997-L1033"
    },
    {
     "kind": "source",
     "repo": "renebohne/sloop-fm1",
     "ref": "v2.4",
     "commit": "aff6ba4a6ba67f7669836540693e70798485e75c",
     "path": "firmware/src/seq.c",
     "lines": "1043-1084",
     "url": "https://github.com/renebohne/sloop-fm1/blob/aff6ba4a6ba67f7669836540693e70798485e75c/firmware/src/seq.c#L1043-L1084"
    }
   ]
  }
 ],
 "delta": {
  "parent": "SLOOP v2.7.1",
  "parent_map": "control-maps/sloop.json",
  "parent_commit": "4ec1ac829fd2bdf2c571ea215fb3d62477d01220",
  "fork_point": "SLOOP 2.2 (aff6ba4's base, before the 2.3 merge)",
  "entries_carried_unchanged": 253,
  "entries_changed": 282,
  "entries_new": 516,
  "entries_dropped": 178,
  "modes_carried": 34,
  "modes_new": 48,
  "modes_dropped": 5
 },
 "delta_counting": "Counts include controls and lights; source-only changes are unchanged; entry identity follows physical part, context and gesture, including the narrowed PRESETS and REC-clear contexts; expanded page-specific controls are new. Carried modes retain parent ids even when descriptions change.",
 "checker_disputes_refresh": [],
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 installed build",
   "fixed": "Re-pinned every retained mode, entry and note to the installed package source, diffed against the later tag tree and rewrote package identity; removed later-only features.",
   "at": "mapped_commit; version_note; version_source; docs; modes; controls; lights; editor; jack_notes; storage fragment"
  },
  {
   "round": 1,
   "error": "16 key or light correction",
   "fixed": "Loads section A immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
   "at": "controls.key_f3[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "16 key or light correction",
   "fixed": "Loads section B immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
   "at": "controls.key_g3[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "16 key or light correction",
   "fixed": "Loads section C immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
   "at": "controls.key_a3[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "16 key or light correction",
   "fixed": "Loads section D immediately over the working loop when stopped without asking or making an undo copy of that loop, or requests it for the next bar while playing, unless the section is empty or the song is running.",
   "at": "controls.key_b3[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "7 key or light correction",
   "fixed": "Plays no note while chord mode is on.",
   "at": "controls.key_as4[2] (previous [2])"
  },
  {
   "round": 1,
   "error": "5 key or light correction",
   "fixed": "Starts no effect.",
   "at": "controls.key_as4[3] (previous [3])"
  },
  {
   "round": 1,
   "error": "11 key or light correction",
   "fixed": "Erases LOW TOM on drums, or this mapped synth note unless WHITE keys or chord mode silences it, immediately from passing steps while playing or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
   "at": "controls.key_as4[4] (previous [4])"
  },
  {
   "round": 1,
   "error": "12 key or light correction",
   "fixed": "Writes this key’s mapped note into the cursor step unless WHITE keys or chord mode makes it silent, without asking; POLY keeps up to four notes and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
   "at": "controls.key_as4[7] (previous [7])"
  },
  {
   "round": 1,
   "error": "13 key or light correction",
   "fixed": "Adds the mapped note to the arpeggiator’s held notes unless WHITE keys or chord mode silences this key, replacing the held set after all keys were released.",
   "at": "controls.key_as4[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "9 key or light correction",
   "fixed": "A#4 is black: it cannot start a step edit, punch effect, or chord.",
   "at": "controls.key_as4[None] (previous [10])"
  },
  {
   "round": 1,
   "error": "18 key or light correction",
   "fixed": "A#4 is black: it cannot start a step edit, punch effect, or chord.",
   "at": "controls.key_as4[None] (previous [11])"
  },
  {
   "round": 1,
   "error": "18 key or light correction",
   "fixed": "A#4 is black: it cannot start a step edit, punch effect, or chord.",
   "at": "controls.key_as4[None] (previous [13])"
  },
  {
   "round": 1,
   "error": "8 key or light correction",
   "fixed": "Plays the scale’s VII chord, counting C4 as I in a seven-note scale.",
   "at": "controls.key_b4[2] (previous [2])"
  },
  {
   "round": 1,
   "error": "6 key or light correction",
   "fixed": "Squeezes the mix into a phone-speaker band while the key is held.",
   "at": "controls.key_b4[3] (previous [3])"
  },
  {
   "round": 1,
   "error": "11 key or light correction",
   "fixed": "Erases this mapped synth note and its chord, or HI TOM on drums, immediately from the playing step and later steps while held, or the whole pattern when stopped, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps the edit later.",
   "at": "controls.key_b4[4] (previous [4])"
  },
  {
   "round": 1,
   "error": "17 key or light correction",
   "fixed": "Controls step 11 on this page: an empty step gets the chosen drum hit or recent synth notes at once, while an occupied step clears on release unless KNOB 1 on synths, KNOB 2 or KNOB 3 kept it; edits ask nothing, can be undone with EDIT + OCT-, and autosave keeps them later.",
   "at": "controls.key_b4[6] (previous [6])"
  },
  {
   "round": 1,
   "error": "12 key or light correction",
   "fixed": "Writes this key’s mapped note, the chord root in chord mode, into the cursor step without asking; up to four notes fit in POLY and other voice modes keep the last note, and EDIT + OCT- can undo the edit before another undo replaces it.",
   "at": "controls.key_b4[9] (previous [9])"
  },
  {
   "round": 1,
   "error": "13 key or light correction",
   "fixed": "Adds this mapped note or chord to the arpeggiator’s held notes, or replaces them if all keys were released before this press.",
   "at": "controls.key_b4[11] (previous [11])"
  },
  {
   "round": 1,
   "error": "17 key or light correction",
   "fixed": "Clears the current drum sound or synth step if this key marked an occupied step on press and a held-step edit has not kept it, without asking; EDIT + OCT- can undo it before another undo replaces it, and autosave keeps it later.",
   "at": "controls.key_b4[19] (previous [None])"
  },
  {
   "round": 1,
   "error": "18 key or light correction",
   "fixed": "Ends this key’s effect if it is still the selected punch effect.",
   "at": "controls.key_b4[20] (previous [None])"
  },
  {
   "round": 1,
   "error": "18 key or light correction",
   "fixed": "Releases the chord started by this key; an active arpeggiator’s HOLD can keep its own held set.",
   "at": "controls.key_b4[21] (previous [None])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "No count-in exists; free takes run while stopped so PLAY remains dark.",
   "at": "lights.button_play_stop[None] (previous [1])"
  },
  {
   "round": 1,
   "error": "14 key or light correction",
   "fixed": "Dark while stopped, including during a free take.",
   "at": "lights.button_play_stop[1] (previous [2])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_play_stop[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "10 key or light correction",
   "fixed": "No count-in exists; free takes run while stopped so PLAY remains dark.",
   "at": "lights.button_play_stop[None] (previous [4])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_rec[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_home[None] (previous [1])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_fx[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_sel[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_env[None] (previous [1])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_lfo[None] (previous [1])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_edit[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_glo[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_arp[None] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_seq[None] (previous [4])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_save[None] (previous [4])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_oct_down[None] (previous [0])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.button_oct_up[None] (previous [0])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
   "at": "lights.key_lights[0] (previous [0])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Held keys light up; SYSTEM NOTES also lights keys matching the synth’s held notes, including sequencer notes.",
   "at": "lights.key_lights[1] (previous [1])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Keys in the scale are lit and root keys blink.",
   "at": "lights.key_lights[3] (previous [3])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "On drums, keys for sounds in the pattern are lit along with held keys; on synths the held keys light up.",
   "at": "lights.key_lights[4] (previous [4])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
   "at": "lights.key_lights[6] (previous [6])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.key_lights[None] (previous [7])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Held keys light up, and every drum hit lights its sound’s white key for a moment.",
   "at": "lights.key_lights[7] (previous [8])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.key_lights[None] (previous [9])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.key_lights[None] (previous [10])"
  },
  {
   "round": 1,
   "error": "1 key or light correction",
   "fixed": "Installed build has no configurable key/button backlight or dim sounding-note overlay.",
   "at": "lights.key_lights[None] (previous [11])"
  },
  {
   "round": 1,
   "error": "1 recording",
   "fixed": "Starts the loop and selected-track recording immediately, including in an empty project.",
   "at": "controls.button_play_stop[2]"
  },
  {
   "round": 1,
   "error": "23 REC hold outside SONG",
   "fixed": "Outside SONG and the HOME menu, holding REC for about 2 seconds clears the selected track’s pattern after the ring, with early release cancelling, one-level undo restoring notes and length, and autosave storing the result later.",
   "at": "controls.button_rec[5]"
  },
  {
   "round": 1,
   "error": "15 PRESETS page",
   "fixed": "Loads factory or stored user sounds only on PRESETS, replacing sound edits and releasing held notes without asking or making an undo copy, while USER, PROJECT and TOOLS ignore this encoder.",
   "at": "controls.encoder_presets[1]"
  },
  {
   "round": 1,
   "error": "1 menu rows",
   "fixed": "Moves through the six menu rows, wrapping at the ends.",
   "at": "controls.encoder_presets[6]"
  },
  {
   "round": 1,
   "error": "1 no recording options",
   "fixed": "Does nothing while REC READY is shown.",
   "at": "controls.encoder_knob1[6]"
  },
  {
   "round": 1,
   "error": "1 no count-in",
   "fixed": "Does nothing during a free take.",
   "at": "controls.encoder_knob1[7]"
  },
  {
   "round": 1,
   "error": "1 no recording options",
   "fixed": "Does nothing while REC READY is shown.",
   "at": "controls.encoder_knob2[6]"
  },
  {
   "round": 1,
   "error": "1 no count-in",
   "fixed": "Does nothing during a free take.",
   "at": "controls.encoder_knob2[7]"
  },
  {
   "round": 1,
   "error": "1 no recording options",
   "fixed": "Does nothing while REC READY is shown.",
   "at": "controls.encoder_knob3[6]"
  },
  {
   "round": 1,
   "error": "1 no count-in",
   "fixed": "Does nothing during a free take.",
   "at": "controls.encoder_knob3[7]"
  },
  {
   "round": 1,
   "error": "1 no recording options",
   "fixed": "Does nothing while REC READY is shown.",
   "at": "controls.encoder_knob4[6]"
  },
  {
   "round": 1,
   "error": "1 no count-in",
   "fixed": "Does nothing during a free take.",
   "at": "controls.encoder_knob4[7]"
  },
  {
   "round": 1,
   "error": "1 six-item menu",
   "fixed": "Changes COLOR, LOWCUT or ZOOM on the selected menu row, with calibration, ABOUT and BACK needing OCT+.",
   "at": "controls.encoder_knob1[16]"
  },
  {
   "round": 1,
   "error": "1 six-item menu",
   "fixed": "Changes the selected colour or LOWCUT or ZOOM choice, opens calibration or ABOUT, or closes the menu at BACK, with changed settings saved on close without another question.",
   "at": "controls.button_oct_up[7]"
  },
  {
   "round": 1,
   "error": "22 conditional calibration save",
   "fixed": "Starts button and knob calibration, retaining the old mapping on a 30-second timeout, then attempts a settings save without asking and writes only if the saved bytes differ.",
   "at": "controls.switch_power[1]"
  },
  {
   "round": 1,
   "error": "1 SYSTEM controls",
   "fixed": "Does nothing in this column.",
   "at": "controls.encoder_knob1[35]"
  },
  {
   "round": 1,
   "error": "1 SYSTEM controls",
   "fixed": "Does nothing in this column.",
   "at": "controls.encoder_knob2[35]"
  },
  {
   "round": 1,
   "error": "1 SYSTEM controls",
   "fixed": "Does nothing in this column.",
   "at": "controls.encoder_knob4[35]"
  },
  {
   "round": 1,
   "error": "1 SYSTEM NOTES",
   "fixed": "Turns the selected synth track’s sounding-note indication on or off, leaving physical key-press lights enabled and saving this choice with the working loop or a section.",
   "at": "controls.encoder_knob3[35]"
  },
  {
   "round": 1,
   "error": "1 no USB audio",
   "fixed": "Sets headphone and line-output volume.",
   "at": "controls.knob_master[0]"
  },
  {
   "round": 1,
   "error": "1 REC screen",
   "fixed": "Shows the armed track and either a free-take prompt for an empty loop or a note-start prompt for existing music, without recording-option dials.",
   "at": "controls.screen[6]"
  },
  {
   "round": 1,
   "error": "1 free-take screen",
   "fixed": "Re-cited the handler in the installed build.",
   "at": "controls.screen[8]"
  },
  {
   "round": 1,
   "error": "1 six-item menu",
   "fixed": "Shows COLOR, LOWCUT, ZOOM, HARDWARE CALIBRATION, ABOUT and BACK in one list.",
   "at": "controls.screen[17]"
  },
  {
   "round": 1,
   "error": "18 no LEARN message",
   "fixed": "Brief messages show the current action or result, such as ERASED, AGAIN: SAVE or NEXT: B.",
   "at": "controls.screen[22]"
  },
  {
   "round": 1,
   "error": "1 SYSTEM screen",
   "fixed": "Shows USB MIDI connection state, an unused SYNC column, NOTES and CPU usage.",
   "at": "controls.screen[39]"
  },
  {
   "round": 1,
   "error": "20 priority evidence",
   "fixed": "Cited note-priority selection and use rather than overload shedding.",
   "at": "controls.encoder_knob4[31].source"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to CLEAR",
   "at": "controls.encoder_knob1[20]"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to LOAD SOUND",
   "at": "controls.encoder_knob1[17]"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to DRUM LANE",
   "at": "controls.encoder_knob1[3]"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to OSC MODE",
   "at": "controls.encoder_knob1[53]"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to SAVE SOUND",
   "at": "controls.encoder_knob4[18]"
  },
  {
   "round": 1,
   "error": "19 distinct labels",
   "fixed": "Changed label to SAVE SECTION",
   "at": "controls.encoder_knob4[19]"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows OSC for ANALOG, with columns WAVE, DTN, MIX, NOIS.",
   "at": "controls.screen[44]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_analog"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows FLT for ANALOG, with columns CUT, RES, DRV, KTR.",
   "at": "controls.screen[45]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_analog"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows OPS for DIGITAL, with columns ALG, R2, R3, R4.",
   "at": "controls.screen[46]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_digital"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows MOD for DIGITAL, with columns IDX, MDEC, FB, blank.",
   "at": "controls.screen[47]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_digital"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows PHS for PHASE, with columns WAVE, WAVE2, DCW, ENV.",
   "at": "controls.screen[48]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_phase"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows LINE for PHASE, with columns DTN, LINE, SUB, blank.",
   "at": "controls.screen[49]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_phase"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows CHIP for LOFI, with columns CHIP, WAVE, DUTY, CRSH.",
   "at": "controls.screen[50]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_lofi"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows MOTN for LOFI, with columns SWP, VIB, ARP, TONE.",
   "at": "controls.screen[51]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_lofi"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows SET for SAMPLE, with columns SET, TUNE, BITS, LOOP.",
   "at": "controls.screen[52]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_sample"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows TONE for SAMPLE, with columns CUT, blank, DRV, blank.",
   "at": "controls.screen[53]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_sample"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows VOWL for VOICE, with columns VOWL, VOWL2, TALK, SHIFT.",
   "at": "controls.screen[54]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_voice"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows TONE for VOICE, with columns BUZZ, BRTH, Q, RAND.",
   "at": "controls.screen[55]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_voice"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows OSC for TRIO, with columns WAVE, INT2, INT3, DTN.",
   "at": "controls.screen[56]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_trio"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows TONE for TRIO, with columns MODE, CUT, RES, PW.",
   "at": "controls.screen[57]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_trio"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows BARS for WHEEL, with columns REG, SUB, BODY, TOP.",
   "at": "controls.screen[58]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_wheel"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows TONE for WHEEL, with columns PERC, CLICK, DRV, ROTR.",
   "at": "controls.screen[59]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_wheel"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows GRAN for GRAIN, with columns SRC, POS, SIZE, DENS.",
   "at": "controls.screen[60]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit1_grain"
  },
  {
   "round": 1,
   "error": "21 engine page names",
   "fixed": "Shows SPRY for GRAIN, with columns PTCH, SPRD, RAND, TONE.",
   "at": "controls.screen[61]"
  },
  {
   "round": 1,
   "error": "21 engine modes",
   "fixed": "Used the displayed engine title and named empty columns.",
   "at": "modes.edit2_grain"
  },
  {
   "round": 1,
   "error": "20 mode evidence",
   "fixed": "Re-cited keyboard mapping, PROJECT values and retained Floyd-page state in their actual handlers.",
   "at": "modes.synth_play; modes.save_project; modes.floyd_*"
  },
  {
   "round": 1,
   "error": "21 mode entry routes",
   "fixed": "Explained remembered page reopening, SEQ entry to SONG and immediate REC refusal during song playback.",
   "at": "modes.pages; modes.step_page; modes.song_screen; modes.song_mode"
  },
  {
   "round": 1,
   "error": "17 update screen",
   "fixed": "Shows UPDATE with stage labels during an install, or FAILED followed by an error number if it stops.",
   "at": "controls.screen[73]"
  },
  {
   "round": 1,
   "error": "27 LOWCUT",
   "fixed": "With LOWCUT selected, right enables and left disables a master high-pass filter around 110 Hz, with the changed setting saved on menu close.",
   "at": "controls.encoder_knob1[65]"
  },
  {
   "round": 1,
   "error": "27 ZOOM",
   "fixed": "With ZOOM selected, right enables and left disables an enlarged view of the last-touched value, with the changed setting saved on menu close.",
   "at": "controls.encoder_knob1[66]"
  },
  {
   "round": 1,
   "error": "17 retained page",
   "fixed": "On ALGO after switching to a non-Floyd synth, changes that engine’s first parameter within Floyd’s 0–7 range, so its algorithm label can misdescribe the sound.",
   "at": "controls.encoder_knob1[67]"
  },
  {
   "round": 1,
   "error": "17 retained page",
   "fixed": "Keeps the Floyd page name after a synth-track change, with its page count showing zero of four because that page is outside the new engine’s normal edit set.",
   "at": "controls.screen[74]"
  },
  {
   "round": 1,
   "error": "17 retained page controls",
   "fixed": "On a retained OP, LEVEL or RATIO page, edits OP1 attack, OP2–OP4 live Floyd attack, LEVEL’s visual-only operator 1 level or RATIO’s feedback value on the newly selected synth, using the still-visible Floyd page’s ranges.",
   "at": "controls.encoder_knob1[68]"
  },
  {
   "round": 1,
   "error": "17 retained page controls",
   "fixed": "On a retained OP, LEVEL or RATIO page, edits OP1 decay, OP2–OP4 live Floyd decay, LEVEL’s fifth engine parameter or RATIO’s second engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
   "at": "controls.encoder_knob2[65]"
  },
  {
   "round": 1,
   "error": "17 retained page controls",
   "fixed": "On a retained OP, LEVEL or RATIO page, edits OP1 sustain, OP2–OP4 live Floyd sustain, LEVEL’s seventh engine parameter or RATIO’s third engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
   "at": "controls.encoder_knob3[65]"
  },
  {
   "round": 1,
   "error": "17 retained page controls",
   "fixed": "On a retained OP, LEVEL or RATIO page, edits OP1 release, OP2–OP4 live Floyd release, LEVEL’s live Floyd operator 4 level or RATIO’s fourth engine parameter on the newly selected synth, using the still-visible Floyd page’s ranges.",
   "at": "controls.encoder_knob4[65]"
  },
  {
   "round": 1,
   "error": "17 drum coverage",
   "fixed": "Plays LOW TOM, matching the white key on its left.",
   "at": "controls.key_as4[18]"
  },
  {
   "round": 1,
   "error": "17 named Floyd sounds",
   "fixed": "Browses FLOYD TINE, DUAL LEAD, STACK BASS, ORGAN 4, CRYSTAL, METALLIC, WARM SINE and VELVET PAD among the factory sounds, loading each selection immediately without an undo copy.",
   "at": "controls.encoder_presets[7]"
  },
  {
   "round": 1,
   "error": "2 check correction",
   "fixed": "Expanded installation loss to Open’s sixteen USER projects, device preferences, save staging and shared sample bank.",
   "at": "switching_note.overwrites_of_other_firmwares; storage.install_and_startup_writes"
  },
  {
   "round": 1,
   "error": "3 check correction",
   "fixed": "Derived settings loss by object and named every current settings trigger, excluding REC options and SYNC absent at aff6ba4.",
   "at": "switching_note; storage.objects[0]; storage reads_foreign"
  },
  {
   "round": 1,
   "error": "4 check correction",
   "fixed": "Included DUELL saved-patch chunks 3 and 4 under whole-bank user-sound writes.",
   "at": "switching_note; storage owner warning coverage"
  },
  {
   "round": 1,
   "error": "5 check correction",
   "fixed": "A#4 is black and starts no punch effect.",
   "at": "controls.key_as4[3]"
  },
  {
   "round": 1,
   "error": "6 check correction",
   "fixed": "B4 selects PHONE.",
   "at": "controls.key_b4[3]"
  },
  {
   "round": 1,
   "error": "7 check correction",
   "fixed": "A#4 has no chord modifier.",
   "at": "controls.key_as4[2]"
  },
  {
   "round": 1,
   "error": "8 check correction",
   "fixed": "B4 plays chord VII.",
   "at": "controls.key_b4[2]"
  },
  {
   "round": 1,
   "error": "9 check correction",
   "fixed": "Removed A#4’s impossible step release and appended B4 step-11 release.",
   "at": "controls.key_as4; controls.key_b4"
  },
  {
   "round": 1,
   "error": "10 check correction",
   "fixed": "Removed the unreachable free-take PLAY-lit state.",
   "at": "lights.button_play_stop"
  },
  {
   "round": 1,
   "error": "11 check correction",
   "fixed": "Corrected A#4/B4 erase silencing and chord behavior.",
   "at": "controls.key_as4[4]; controls.key_b4[4]"
  },
  {
   "round": 1,
   "error": "12 check correction",
   "fixed": "Corrected A#4/B4 step-entry silencing and chord-root wording.",
   "at": "controls.key_as4[7]; controls.key_b4[9]"
  },
  {
   "round": 1,
   "error": "13 check correction",
   "fixed": "Corrected A#4/B4 ARP HOLD silence conditions.",
   "at": "controls.key_as4[9]; controls.key_b4[11]"
  },
  {
   "round": 1,
   "error": "14 check correction",
   "fixed": "PLAY is dark during free takes, with no count-in state in this build.",
   "at": "lights.button_play_stop"
  },
  {
   "round": 1,
   "error": "16 check correction",
   "fixed": "All four stopped section recalls explicitly replace loop edits without asking or making an undo copy.",
   "at": "controls.key_f3[9]; controls.key_g3[9]; controls.key_a3[9]; controls.key_b3[9]"
  },
  {
   "round": 1,
   "error": "18 check correction",
   "fixed": "Removed impossible A#4 FX/chord releases, appended B4 releases and removed LEARN from transient messages.",
   "at": "controls.key_as4; controls.key_b4; controls.screen"
  },
  {
   "round": 1,
   "error": "20 check correction",
   "fixed": "The SYNC save-later claim no longer applies because SYNC is inert in this build; cited priority, keyboard and retained-page handlers.",
   "at": "controls.encoder_knob2.system_page; controls.encoder_knob4.voice_page; modes"
  },
  {
   "round": 1,
   "error": "24 check correction",
   "fixed": "No backup/restore protocol or empty-section restore exists in the installed build, so removed those claims and triggers.",
   "at": "switching_note.restore; editor; storage.backup; storage objects triggers"
  },
  {
   "round": 1,
   "error": "25 check correction",
   "fixed": "Included X0X and Polly pending-restore journals and possible stock/Baud Girl overlap in conditional startup cleanup, and every actual autosave overlap.",
   "at": "switching_note; storage owner warning coverage"
  },
  {
   "round": 1,
   "error": "26 check correction",
   "fixed": "Settings and bank restores do not exist at aff6ba4; removed restore claims while retaining unguarded user-sound and sample writes.",
   "at": "editor; storage write triggers"
  },
  {
   "round": 1,
   "error": "27 check correction",
   "fixed": "Added USB MIDI selected-track routing and panel output, LOWCUT/ZOOM behavior, memory-only level wording and whole-sector loader wording; removed absent KEYS/LIGHTS and backup-read advice.",
   "at": "jack_notes; controls.encoder_knob1; technical_notes; storage.parent_data; storage.backup"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob1[60]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob1[61]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob1[62]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob2[60]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob2[61]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob2[62]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob3[60]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob3[61]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob3[62]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob4[60]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob4[61]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob4[62]"
  },
  {
   "round": 1,
   "error": "1 no complete backup",
   "fixed": "Removed backup wording from memory-only operator controls.",
   "at": "controls.encoder_knob4[63]"
  },
  {
   "round": 1,
   "error": "21 remembered pages and display names",
   "fixed": "A tap reopens the last valid EDIT page, then cycles the selected engine’s two named pages, VOICE and VOICE 2, or Floyd’s ALGO, OP1–OP4, LEVEL and RATIO pages.",
   "at": "controls.button_edit[0]"
  },
  {
   "round": 1,
   "error": "21 remembered pages and display names",
   "fixed": "A tap reopens the last SEQ page used, then later taps cycle STEP, PATTERN and SONG.",
   "at": "controls.button_seq[0]"
  },
  {
   "round": 1,
   "error": "21 remembered pages and display names",
   "fixed": "A tap reopens the last SAVE-family page used, then later taps cycle PRESETS, USER, PROJECT and TOOLS on release.",
   "at": "controls.button_save[4]"
  },
  {
   "round": 1,
   "error": "21 DRUMS entry route",
   "fixed": "Explained that TRACKS reopens the last GRID or KIT page, with another EDIT or SEQ tap toggling to the required page.",
   "at": "modes.drums_grid; modes.drums_kit"
  },
  {
   "round": 1,
   "error": "1, 2, 3, 4, 24, 25, 26, 27 storage warnings",
   "fixed": "Rebuilt all eight trigger paragraphs from the fragment’s destructive foreign-data rows, including install finalization, startup, autosave, settings, sections, banks and samples; removed the nonexistent complete backup route and explained the return trip.",
   "at": "switching_note; refresh/work/floyd.storage.json; control-maps/floyd.md"
  },
  {
   "round": 1,
   "error": "1 delta at installed build",
   "fixed": "Recomputed final parent-entry correspondence and mode counts with SLOOP 2.2 as the pre-merge base.",
   "at": "delta; delta_counting"
  },
  {
   "round": 2,
   "error": "1 installer record sweep",
   "fixed": "Replaced the broad music-loss list with valid-marker/checksum conditions, realistic family/stock update-record cleanup and negligible ordinary-music collision risk; retained and reclassified every existing foreign row in place.",
   "at": "switching_note.overwrites_of_other_firmwares[1]; storage.install_and_startup_writes[1]; storage.reads_foreign[313:586]; storage.parent_data; storage.owner_warning_paragraphs[1]; control-maps/floyd.md"
  },
  {
   "round": 2,
   "error": "2 registry docs pin",
   "fixed": "Pinned the document to the installed build commit instead of latest_release.",
   "at": "refresh/work/floyd.registry.json sources[0]"
  },
  {
   "round": 2,
   "error": "2 registry docs pin",
   "fixed": "Pinned the document to the installed build commit instead of latest_release.",
   "at": "refresh/work/floyd.registry.json sources[1]"
  },
  {
   "round": 2,
   "error": "3 Hortator first settings write",
   "fixed": "Explained that imported older settings retain their old format marker, making the first new-format settings write unavoidable at a settings trigger even without edits.",
   "at": "storage.reads_foreign[150]; storage.objects[0].load_rule; storage.objects[0].written_when[0]; storage.install_and_startup_writes[4]; switching_note.overwrites_of_other_firmwares[4]; control-maps/floyd.md"
  },
  {
   "round": 2,
   "error": "4 NEW global reset",
   "fixed": "Named every global-reset scope and the slot/drum-channel exceptions, clarified NOTES turns off, and kept the later-autosave and limited-undo caveats.",
   "at": "controls.encoder_knob4[20]; controls.encoder_knob3[35]; storage.objects[7].written_when[0]; control-maps/floyd.md"
  },
  {
   "round": 2,
   "error": "5 scale label collision",
   "fixed": "Renamed the SEL-layer job ALL SCALES; the selected-track page retains SCALE.",
   "at": "controls.encoder_knob2[13].short_label; controls.encoder_knob2[29].short_label"
  },
  {
   "round": 3,
   "error": "1 stock VM-backup evidence",
   "fixed": "Graded the stock backup and location reported, identified it as the stock updater’s VM backup containing settings and possibly patterns, and removed temporary/settings-only wording while keeping the source-proven loader behavior separate.",
   "at": "switching_note.overwrites_of_other_firmwares[1]; switching_note.stock_backup_evidence; control-maps/floyd.md; storage.reads_foreign[313]; storage.install_and_startup_writes[1]; storage.owner_warning_paragraphs[1]; storage.parent_data.same_addresses_and_type_ids"
  }
 ]
}