{
 "firmware": "AMB-1",
 "slug": "amb",
 "author": "Charles Vestal",
 "repo": "https://github.com/charlesvestal/fm1-amb",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v1.2",
 "mapped_commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-16",
 "turns_it_into": "A self-playing ambient instrument with four layers, an editable scale, echo and reverb.",
 "docs": [
  {
   "title": "AMB-1 manual",
   "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md",
   "path": "docs/MANUAL.md",
   "ref": "v1.2",
   "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
   "read_at": "2026-10-16"
  },
  {
   "title": "README",
   "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/README.md",
   "path": "README.md",
   "ref": "v1.2",
   "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
   "read_at": "2026-10-16"
  }
 ],
 "install": {
  "official": "https://github.com/charlesvestal/fm1-amb/releases/tag/v1.2",
  "hub": "https://thefirmwarehub.com/",
  "web": "https://charlesvestal.github.io/fm1-amb/install/"
 },
 "part_id_notes": "SEL is B_SEL and has no normal action or help card; ALGORITHM is EN_ALGO and PRESETS is EN_PRESET. Keys use the shared F3–G5 ids but act on pitch classes, so octaves share one scale switch. In entries, any means normal app operation across all seven pages, including growing, resting and frozen states; startup, calibration, safe mode and updating have their own entries and take priority. A normal press on any button except PLAY acts on release unless its help or reset hold consumed it. Only HOME + SELECT changes an encoder assignment; other held buttons leave turns and keys assigned normally. Button LEDs are under button ids; PLAY uses its green LED, with the other LED unused.",
 "modes": [
  {
   "id": "garden",
   "name": "Garden page",
   "how_to_get_there": "Tap HOME, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Tempo, Evolve, Motion and Drift; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "pad",
   "name": "Pad page",
   "how_to_get_there": "Tap ENV, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Level, Swell, Bright and Colour; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "bells",
   "name": "Bells page",
   "how_to_get_there": "Tap ARP, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Level, Density, Tone and Octave; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "bass",
   "name": "Bass page",
   "how_to_get_there": "Tap LFO, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Level, Octave, Glide and Fifth; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "pulse",
   "name": "Pulse page",
   "how_to_get_there": "Tap SEQ, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Level, Hits, Swing and Hats; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "space",
   "name": "Space page",
   "how_to_get_there": "Tap FX, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Echo, Echo time, Reverb and Size; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "setup",
   "name": "Setup page",
   "how_to_get_there": "Tap GLO, or turn SELECT to this page.",
   "what_it_is": "The four knobs set Root, Tune, MIDI out and Lights; changing page leaves playback running.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "17-38",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-307",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    }
   ]
  },
  {
   "id": "growing",
   "name": "Growing",
   "how_to_get_there": "Starts at power-on; press PLAY to resume from rest.",
   "what_it_is": "The layers run and chords advance automatically; every parameter page remains available.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "1398-1407",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1340-1365",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1340-L1365"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1714-1743",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1714-L1743"
    }
   ]
  },
  {
   "id": "resting",
   "name": "Resting",
   "how_to_get_there": "Press PLAY while growing.",
   "what_it_is": "The sequence stops and sounds fade; page controls remain active and quiet autosave becomes possible.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "313-324",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L313-L324"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1367-1377",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1367-L1377"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "958-969",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L958-L969"
    }
   ]
  },
  {
   "id": "frozen",
   "name": "Frozen",
   "how_to_get_there": "Tap REC; tap it again to thaw.",
   "what_it_is": "Automatic chord changes wait and the reverb decay lengthens; running bell and pulse sequences continue.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "325-328",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L325-L328"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "914-917",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L914-L917"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1730-1742",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1730-L1742"
    }
   ]
  },
  {
   "id": "help",
   "name": "Help card",
   "how_to_get_there": "Hold one eligible button for 900 ms with no other button or key down and no encoder turn since its press; PLAY and SEL are excluded.",
   "what_it_is": "A card replaces the central display; releasing the held button closes it without its normal action.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "363-385",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "829-855",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L829-L855"
    }
   ]
  },
  {
   "id": "power_on",
   "name": "Power-on",
   "how_to_get_there": "Switch the FM-1 on.",
   "what_it_is": "The splash leads to Garden and the saved piece starts growing; hold both octave buttons at startup for calibration.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "231-243",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L231-L243"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "280-301",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L280-L301"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "1398-1407",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Hardware calibration",
   "how_to_get_there": "Power up with both octave buttons held, then release them.",
   "what_it_is": "Teach each named button and clockwise encoder turn in order; a 30-second idle timeout restores the previous RAM map without saving.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "298-299",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L298-L299"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/panel.c",
     "lines": "46-108",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L46-L108"
    }
   ]
  },
  {
   "id": "safe_mode",
   "name": "Safe mode",
   "how_to_get_there": "Starts after two failed starts.",
   "what_it_is": "Audio and the normal UI are absent; USB updating works and PLAY retries startup after the first half second.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "177-228",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L177-L228"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "382-390",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L382-L390"
    }
   ]
  },
  {
   "id": "update_countdown",
   "name": "Update countdown",
   "how_to_get_there": "Hold OCT- and OCT+ together during normal use.",
   "what_it_is": "A countdown starts after two seconds and enters the chip updater after five; releasing either button cancels it.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "319-337",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L319-L337"
    }
   ]
  },
  {
   "id": "update_mode",
   "name": "Chip update mode",
   "how_to_get_there": "Hold both octave buttons for more than five seconds, send USB SysEx F0 22 24 35 7D F7 in normal use or safe mode, or reach the boot-failure limit.",
   "what_it_is": "The chip updater takes over; this is separate from the USB web-installer session and may need the rescue tool. Entering it never saves pending edits.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "165-175",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "319-337",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L319-L337"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "382-390",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L382-L390"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "165-175",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/usb.c",
     "lines": "580",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/usb.c#L580"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/usb.c",
     "lines": "600-606",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/usb.c#L600-L606"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "226-227",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L226-L227"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "353-354",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L353-L354"
    }
   ]
  },
  {
   "id": "firmware_update",
   "name": "USB firmware update",
   "how_to_get_there": "Start an installation from a compatible USB installer.",
   "what_it_is": "A normal-mode USB install pauses the UI without saving edits; success restarts, while a failed or refused attempt that returns clears the unsaved flag, resumes growing on Garden and leaves edited settings in RAM; safe-mode failures return to safe mode.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "344-351",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L344-L351"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/main.c",
     "lines": "104-122",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/main.c#L104-L122"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "345-352",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L345-L352"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "1398-1407",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "647-650",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "961-969",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L961-L969"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "220-225",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L220-L225"
    }
   ]
  },
  {
   "id": "crash",
   "name": "Crash screen",
   "how_to_get_there": "Appears on a firmware fault.",
   "what_it_is": "A red diagnostic screen shows fault values and the firmware restarts after about four seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "142-162",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L142-L162"
    }
   ]
  },
  {
   "id": "restart_notice",
   "name": "Crash restart notice",
   "how_to_get_there": "Appears on startup after a newly recorded crash.",
   "what_it_is": "The splash shows a restart notice and the recorded PC address for 2.5 seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "265-276",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L265-L276"
    }
   ]
  }
 ],
 "controls": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Garden page when a short press is released.",
    "short_label": "GARDEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "While HOME is held, SELECT sets tempo without changing the page.",
    "short_label": "TEMPO SHIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "417-433",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Pad page when a short press is released.",
    "short_label": "PAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Bells page when a short press is released.",
    "short_label": "BELLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Bass page when a short press is released.",
    "short_label": "BASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Pulse page when a short press is released.",
    "short_label": "PULSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Space page when a short press is released.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Setup page when a short press is released.",
    "short_label": "SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-307",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L307"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Has no assigned action.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "300-346",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L346"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding SEL has no action or help card.",
    "short_label": "NO HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "378-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L378-L385"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Requests another chord on release, at the next bar while growing or immediately while resting.",
    "short_label": "NEXT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "309-312",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L309-L312"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1398-1403",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1398-L1403"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "914-917",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L914-L917"
     }
    ]
   },
   {
    "mode": "frozen",
    "gesture": "press",
    "action": "Queues a chord while growing until thaw allows a bar change, but changes it immediately while resting.",
    "short_label": "CHORD QUEUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1398-1403",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1398-L1403"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "914-917",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L914-L917"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Switches between growing and resting as soon as PLAY is pressed.",
    "short_label": "GROW / REST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "313-324",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L313-L324"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "398-406",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L398-L406"
     }
    ]
   },
   {
    "mode": "resting",
    "gesture": "press",
    "action": "Restarts the bell and pulse positions from the beginning while keeping the current piece settings.",
    "short_label": "START AGAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "319-322",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L319-L322"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1392-1396",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1392-L1396"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1340-1364",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1340-L1364"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Restarts AMB-1 normally once safe mode has been up for half a second.",
    "short_label": "RETRY BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "205-218",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L205-L218"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles the chord freeze and long reverb decay when a short press is released.",
    "short_label": "FREEZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "325-328",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L325-L328"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1730-1742",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1730-L1742"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Moves the bells one octave down on release within the −2 to +2 range.",
    "short_label": "BELLS DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "329-336",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L329-L336"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29-31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_up",
    "action": "Holding both octave buttons for more than five seconds enters the chip updater after a countdown without saving pending edits.",
    "short_label": "UPDATE HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L319-L337"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "165-175",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Starts the guided panel calibration when both octave buttons are held at power-on.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "298-299",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L298-L299"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "46-58",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L46-L58"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Moves the bells one octave up on release within the −2 to +2 range.",
    "short_label": "BELLS UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "329-336",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L329-L336"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29-31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_down",
    "action": "Holding both octave buttons for more than five seconds enters the chip updater after a countdown without saving pending edits.",
    "short_label": "UPDATE HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L319-L337"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "165-175",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Starts the guided panel calibration when both octave buttons are held at power-on.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "298-299",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L298-L299"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "46-58",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L46-L58"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Writes all eight pieces and global settings to flash on a short release without asking first.",
    "short_label": "SAVE ALL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "337-343",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L337-L343"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "394-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "133-136",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L133-L136"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/app.h",
      "lines": "22-31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/app.h#L22-L31"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding SAVE past 1.5 seconds discards this piece’s edits in RAM and loads its recipe while retaining Tune, MIDI out and Lights.",
    "short_label": "RESET PIECE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "444-452",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L444-L452"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "11-21",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L11-L21"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "146-150",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L146-L150"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding this button for 900 ms with no other button or key down and no encoder turn since its press opens help and consumes its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "363-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "release",
    "action": "Releasing the button whose card is open closes help without its usual short-press action.",
    "short_label": "CLOSE HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-385",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L385"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "405-407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L405-L407"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Press this button when its printed name is requested to bind that label to the physical switch.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "6-7",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "60-75",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L60-L75"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Moves one page forward clockwise or back anticlockwise through Garden, Pad, Bells, Bass, Pulse, Space and Setup, stopping at either end.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "17-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L19"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "417-433",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_home",
    "action": "Adjusts tempo from 30 to 120 while retaining the current page and suppressing HOME’s release action.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "417-433",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29-31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29-L31"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Cycles the eight scale modes in either direction and replaces any custom scale with the selected mode’s notes.",
    "short_label": "MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "271-279",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L271-L279"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "436-439",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L436-L439"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "14-19",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L14-L19"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Cycles the eight pieces, retaining the one being left in RAM and loading the next piece’s settings with fresh generated loops.",
    "short_label": "PIECE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "282-290",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L282-L290"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "440-443",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L440-L443"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1242-1258",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1242-L1258"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "garden",
    "gesture": "turn",
    "action": "Sets the internal tempo from 30 to 120 BPM.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "23",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29-31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1212-1215",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1212-L1215"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "action": "Sets the pad’s level from 0 to 100.",
    "short_label": "PAD LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1165",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1165"
     }
    ]
   },
   {
    "mode": "bells",
    "gesture": "turn",
    "action": "Sets the bells’ level from 0 to 100.",
    "short_label": "BELL LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1166",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1166"
     }
    ]
   },
   {
    "mode": "bass",
    "gesture": "turn",
    "action": "Sets the bass level from 0 to 100.",
    "short_label": "BASS LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1167",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1167"
     }
    ]
   },
   {
    "mode": "pulse",
    "gesture": "turn",
    "action": "Sets the percussion level from 0 to 100.",
    "short_label": "PULSE LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1168",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1168"
     }
    ]
   },
   {
    "mode": "space",
    "gesture": "turn",
    "action": "Sets the send to the echoes from 0 to 100.",
    "short_label": "ECHO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1187",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1187"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1692-1704",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1692-L1704"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Transposes the scale’s root from C through B while retaining its relative note choices.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "147-150",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L147-L150"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1216-1221",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1216-L1221"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "garden",
    "gesture": "turn",
    "action": "Sets how often notes, rhythms and layer rests change, from 0 to 100, with Motion still able to vary bell density and rests at zero.",
    "short_label": "EVOLVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "23",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "709-729",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L709-L729"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "886-893",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L886-L893"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "640-641",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L640-L641"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "action": "Sets the length of the pad voices’ individual breathing cycles from 0 to 100.",
    "short_label": "SWELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "423-435",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L423-L435"
     }
    ]
   },
   {
    "mode": "bells",
    "gesture": "turn",
    "action": "Sets bell density from 0 to 100, aiming for up to five notes per loop with changes applied as each loop completes.",
    "short_label": "DENSITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "663-666",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L663-L666"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "709-715",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L709-L715"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "908-910",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L908-L910"
     }
    ]
   },
   {
    "mode": "bass",
    "gesture": "turn",
    "action": "Sets the bass octave to −1, 0 or +1.",
    "short_label": "BASS OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1170-1173",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1170-L1173"
     }
    ]
   },
   {
    "mode": "pulse",
    "gesture": "turn",
    "action": "Sets pulse density from 0 to 100 and resets the three Euclidean patterns, with zero making them silent.",
    "short_label": "HITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "794-801",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L794-L801"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1169",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1169"
     }
    ]
   },
   {
    "mode": "space",
    "gesture": "turn",
    "action": "Selects a dotted quarter, half, dotted half, one bar, two bars or four bars, shortened when needed to fit the tape buffer.",
    "short_label": "ECHO TIME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "64-65",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L64-L65"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1065-1079",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1065-L1079"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Sets global tuning from −50 to +50 cents.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1211",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1211"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "11-21",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L11-L21"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "garden",
    "gesture": "turn",
    "action": "Sets the depth of slow changes in density, tone, pitch, pan and echo movement from 0 to 100.",
    "short_label": "MOTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "23",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "497-504",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L497-L504"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "663-666",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L663-L666"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1083-1106",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1083-L1106"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1714-1729",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1714-L1729"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "action": "Sets pad brightness from 0 to 100 and moves the sung sound through its vowels.",
    "short_label": "BRIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "497-506",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L497-L506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1442-1445",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1442-L1445"
     }
    ]
   },
   {
    "mode": "bells",
    "gesture": "turn",
    "action": "Sets bell tone from a soft round sound toward metallic overtones, from 0 to 100.",
    "short_label": "BELL TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "756-765",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L756-L765"
     }
    ]
   },
   {
    "mode": "bass",
    "gesture": "turn",
    "action": "Sets bass glide from 0 to 100, corresponding to about 20 ms through 1.22 seconds.",
    "short_label": "GLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1174",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1174"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1556-1557",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1556-L1557"
     }
    ]
   },
   {
    "mode": "pulse",
    "gesture": "turn",
    "action": "Delays alternate sixteenth-note hits, shown as 50% through 75%.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "125-129",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L125-L129"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "849-857",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L849-L857"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1175",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1175"
     }
    ]
   },
   {
    "mode": "space",
    "gesture": "turn",
    "action": "Sets the reverb send from 0 to 100.",
    "short_label": "REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1189",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1189"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1692-1704",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1692-L1704"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Sets global MIDI output on or off, with disabling sending All Notes Off only on channel 1 and possibly leaving external bell or bass notes sounding.",
    "short_label": "MIDI OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "333-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L333-L337"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1223-1226",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1223-L1226"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "333-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L333-L337"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "garden",
    "gesture": "turn",
    "action": "Sets the nominal chord interval from 20 seconds to five minutes, with each new interval varied around that value.",
    "short_label": "DRIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "23",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "85",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L85"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "612-616",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L612-L616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1180-1185",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "action": "Chooses Rhodes or Voices for this piece’s pad.",
    "short_label": "COLOUR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "95-96",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L95-L96"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1198",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1198"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "15-21",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L15-L21"
     }
    ]
   },
   {
    "mode": "bells",
    "gesture": "turn",
    "action": "Sets the bells’ octave from −2 to +2 and previews an available loop note while growing.",
    "short_label": "BELL OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "30",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L30"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1200-1209",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1200-L1209"
     }
    ]
   },
   {
    "mode": "bass",
    "gesture": "turn",
    "action": "Sets the chance, from 0 to 100, of the bass moving to the chord’s fifth halfway through a chord.",
    "short_label": "FIFTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "31",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L31"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1733-1739",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1733-L1739"
     }
    ]
   },
   {
    "mode": "pulse",
    "gesture": "turn",
    "action": "Sets hat brightness and shortens the open hat as the value rises from 0 to 100.",
    "short_label": "HATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "32",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L32"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1176-1179",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1176-L1179"
     }
    ]
   },
   {
    "mode": "space",
    "gesture": "turn",
    "action": "Sets reverb decay and echo feedback together from 0 to 100.",
    "short_label": "SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1190-1193",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1190-L1193"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Chooses Off, On or Keys for scale lights and inactive-button glow while page and transport indicators remain active.",
    "short_label": "LIGHTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "204-219",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L204-L219"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "454-460",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L454-L460"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "189-192",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "Turn this encoder clockwise when its name is requested to teach its position and direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "8-9",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-103",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L103"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Adjusts the final output level.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "310-317",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L310-L317"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1750-1752",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1750-L1752"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1703-1706",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1703-L1706"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F scale toggle with its root and minimum-note limits.",
    "short_label": "F AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F# in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F# SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F# scale toggle with its root and minimum-note limits.",
    "short_label": "F# AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles G in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "G SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal G scale toggle with its root and minimum-note limits.",
    "short_label": "G AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Ab in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Ab SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Ab scale toggle with its root and minimum-note limits.",
    "short_label": "Ab AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles A in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "A SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal A scale toggle with its root and minimum-note limits.",
    "short_label": "A AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Bb in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Bb SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Bb scale toggle with its root and minimum-note limits.",
    "short_label": "Bb AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles B in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "B SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal B scale toggle with its root and minimum-note limits.",
    "short_label": "B AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles C in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "C SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal C scale toggle with its root and minimum-note limits.",
    "short_label": "C AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles C# in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "C# SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal C# scale toggle with its root and minimum-note limits.",
    "short_label": "C# AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles D in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "D SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal D scale toggle with its root and minimum-note limits.",
    "short_label": "D AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Eb in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Eb SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Eb scale toggle with its root and minimum-note limits.",
    "short_label": "Eb AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles E in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "E SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal E scale toggle with its root and minimum-note limits.",
    "short_label": "E AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F scale toggle with its root and minimum-note limits.",
    "short_label": "F AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F# in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F# SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F# scale toggle with its root and minimum-note limits.",
    "short_label": "F# AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles G in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "G SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal G scale toggle with its root and minimum-note limits.",
    "short_label": "G AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Ab in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Ab SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Ab scale toggle with its root and minimum-note limits.",
    "short_label": "Ab AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles A in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "A SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal A scale toggle with its root and minimum-note limits.",
    "short_label": "A AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Bb in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Bb SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Bb scale toggle with its root and minimum-note limits.",
    "short_label": "Bb AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles B in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "B SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal B scale toggle with its root and minimum-note limits.",
    "short_label": "B AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles C in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "C SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal C scale toggle with its root and minimum-note limits.",
    "short_label": "C AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles C# in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "C# SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal C# scale toggle with its root and minimum-note limits.",
    "short_label": "C# AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles D in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "D SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal D scale toggle with its root and minimum-note limits.",
    "short_label": "D AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles Eb in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "Eb SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal Eb scale toggle with its root and minimum-note limits.",
    "short_label": "Eb AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles E in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "E SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal E scale toggle with its root and minimum-note limits.",
    "short_label": "E AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F scale toggle with its root and minimum-note limits.",
    "short_label": "F AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles F# in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "F# SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal F# scale toggle with its root and minimum-note limits.",
    "short_label": "F# AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Toggles G in the scale across all octaves unless it is the root or removing it would leave fewer than three notes.",
    "short_label": "G SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "press",
    "action": "Closes the help card and applies the normal G scale toggle with its root and minimum-note limits.",
    "short_label": "G AND CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "253-268",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "372-379",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L372-L379"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "409-413",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L413"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Shows the piece, root, mode, tempo or EXT, unsaved dot, chord and scale, four bell loops, layer meters, pulse rings and chord progress.",
    "short_label": "GARDEN VIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "627-682",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L627-L682"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "710-798",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L710-L798"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "874-884",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L874-L884"
     }
    ]
   },
   {
    "mode": "garden",
    "gesture": "shows",
    "action": "Shows the shared garden display above Tempo, Evolve, Motion and Drift, with the last turned knob highlighted.",
    "short_label": "GARDEN PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "23",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "shows",
    "action": "Shows the shared garden display above Level, Swell, Bright and Colour, with the last turned knob highlighted.",
    "short_label": "PAD PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "bells",
    "gesture": "shows",
    "action": "Shows the shared garden display above Level, Density, Tone and Octave, with the last turned knob highlighted.",
    "short_label": "BELLS PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "25",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L25"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "bass",
    "gesture": "shows",
    "action": "Shows the shared garden display above Level, Octave, Glide and Fifth, with the last turned knob highlighted.",
    "short_label": "BASS PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "pulse",
    "gesture": "shows",
    "action": "Shows the shared garden display above Level, Hits, Swing and Hats, with the last turned knob highlighted.",
    "short_label": "PULSE PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "27",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L27"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "space",
    "gesture": "shows",
    "action": "Shows the shared garden display above Echo, Echo time, Reverb and Size, with the last turned knob highlighted.",
    "short_label": "SPACE PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "28",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "shows",
    "action": "Shows the shared garden display above Root, Tune, MIDI out and Lights, with the last turned knob highlighted and CPU load in the header.",
    "short_label": "SETUP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "29",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L29"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "31-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L31-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "892-939",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L892-L939"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "659-665",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L659-L665"
     }
    ]
   },
   {
    "mode": "growing",
    "gesture": "shows",
    "action": "The header’s slow indicator alternates each beat while the bell and pulse playheads move.",
    "short_label": "RUNNING VIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "636-637",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L636-L637"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "669-675",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L669-L675"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "716-730",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L716-L730"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "776-798",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L776-L798"
     }
    ]
   },
   {
    "mode": "resting",
    "gesture": "shows",
    "action": "Shows a play triangle beside the tempo while the sequence rests.",
    "short_label": "REST VIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "666-675",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L666-L675"
     }
    ]
   },
   {
    "mode": "frozen",
    "gesture": "shows",
    "action": "Shows held in place of chord progress and changes the chord-name colour.",
    "short_label": "HELD VIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "745-751",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L745-L751"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "874-880",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L874-L880"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "shows",
    "action": "Shows the held button’s name and a short explanation in place of the central garden picture.",
    "short_label": "HELP CARD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "804-838",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L804-L838"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "847-855",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L847-L855"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "action": "Requests each button and clockwise encoder turn in sequence.",
    "short_label": "CALIBRATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "51-63",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L51-L63"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/panel.c",
      "lines": "78-82",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L78-L82"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "shows",
    "action": "Shows AMB-1 before normal startup.",
    "short_label": "SPLASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "231-243",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L231-L243"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "shows",
    "action": "Shows a USB recovery notice, a PLAY retry prompt and a recorded PC address when one exists.",
    "short_label": "SAFE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "184-198",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L184-L198"
     }
    ]
   },
   {
    "mode": "update_countdown",
    "gesture": "shows",
    "action": "Shows the remaining update delay after two seconds, or a cancellation message when either octave button is released.",
    "short_label": "COUNTDOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-335",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L319-L335"
     }
    ]
   },
   {
    "mode": "update_mode",
    "gesture": "shows",
    "action": "Briefly shows UBOOT for the octave-button route or UBOOT (USB) for the USB request before entering the chip updater.",
    "short_label": "UBOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "165-174",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L174"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "334-335",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L334-L335"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "226-227",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L226-L227"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "353-354",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L353-L354"
     }
    ]
   },
   {
    "mode": "firmware_update",
    "gesture": "shows",
    "action": "Shows the USB update stage or failure result, then returns to Garden with the unsaved dot cleared if an install started in normal operation returns without committing.",
    "short_label": "USB UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/main.c",
      "lines": "104-114",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/main.c#L104-L114"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "345-352",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L345-L352"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "1398-1407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "647-650",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
     }
    ]
   },
   {
    "mode": "crash",
    "gesture": "shows",
    "action": "Shows a red fault display with diagnostic addresses for about four seconds before restarting.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "142-162",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L142-L162"
     }
    ]
   },
   {
    "mode": "restart_notice",
    "gesture": "shows",
    "action": "Shows the crash restart notice and PC address for 2.5 seconds.",
    "short_label": "RESTART",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "265-276",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L265-L276"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "SAVE ERROR",
    "action": "A failed SAVE shows NOT SAVED and FLASH ERROR while existing unsaved edits remain pending.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "337-343",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L337-L343"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "647-650",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
     }
    ]
   },
   {
    "mode": "resting",
    "gesture": "shows",
    "short_label": "SAVE RETRY",
    "action": "With pending edits and unrecognized flash, the unsaved dot remains and eligible resting autosaves keep failing and retrying.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "249-255",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L249-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "87-88",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L87-L88"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "647-650",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "961-969",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L961-L969"
     }
    ]
   }
  ],
  "jack_midi_in": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Receives channel 1 note-ons as scale toggles and MIDI clock, start, continue and stop as transport commands.",
    "short_label": "SCALE MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "349-359",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L349-L359"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "289-291",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L289-L291"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "108-113",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L108-L113"
     }
    ]
   }
  ],
  "jack_usb_c": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Receives scale and clock commands and sends generated MIDI when MIDI out is enabled.",
    "short_label": "USB MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "349-359",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L349-L359"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "333-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L333-L337"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "74-85",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L74-L85"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "action": "With MIDI out on, sends pad notes on channel 1, bells on 2, bass on 3 and percussion on 10, plus clock and transport when internally timed.",
    "short_label": "LAYER MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "428-434",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L428-L434"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "771",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L771"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "845-846",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L845-L846"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1330-1337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1330-L1337"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "1362-1376",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1362-L1376"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/dsp/amb.c",
      "lines": "333-337",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L333-L337"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Carries the master audio output to a computer in the default USB-audio-enabled build.",
    "short_label": "USB AUDIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/main.c",
      "lines": "35-38",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/main.c#L35-L38"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "32-41",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L32-L41"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Supplies page, knob, help and chord descriptions over USB once the compatible screen reader connects.",
    "short_label": "READER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "1202-1225",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1202-L1225"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "1246-1279",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1246-L1279"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/announce.c",
      "lines": "142-164",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/announce.c#L142-L164"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "STOCK V15",
    "action": "The author’s web installer can install the selected, fingerprint-checked stock V15 package over USB from AMB-1 or safe mode.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "web/amb_installer.html",
      "lines": "175-190",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L175-L190"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "web/amb_installer.html",
      "lines": "193-230",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L193-L230"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "220-225",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L220-L225"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "STOCK RISK",
    "action": "The author warns that installing stock V15 can lose the pieces saved by AMB-1.",
    "evidence": "vendor-doc",
    "source": [
     {
      "kind": "doc",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "web/amb_installer.html",
      "lines": "117",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L117"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "CLI INSTALL",
    "action": "The release’s tools/fm1_install.py installs a supplied .fwsc package over USB MIDI and normally asks before starting.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "tools/fm1_install.py",
      "lines": "410-436",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_install.py#L410-L436"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "tools/fm1_install.py",
      "lines": "446-455",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_install.py#L446-L455"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "UPDATE SAVE",
    "action": "A USB firmware install never saves pending edits, so use SAVE and wait for SAVED before starting it.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "345-352",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L345-L352"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/main.c",
      "lines": "116-123",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/main.c#L116-L123"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "337-343",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L337-L343"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "UPDATE EXIT",
    "action": "A failed or refused USB install started in normal operation clears the unsaved flag and restarts Garden on return while leaving edited values only in RAM until saved or powered off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "345-352",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L345-L352"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "1398-1407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "961-969",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L961-L969"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "CHIP UPDATE",
    "action": "USB SysEx F0 22 24 35 7D F7 enters chip update mode from normal use or safe mode without saving edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/usb.c",
      "lines": "580",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/usb.c#L580"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/usb.c",
      "lines": "600-606",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/usb.c#L600-L606"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "165-175",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "226-227",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L226-L227"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "353-354",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L353-L354"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "power_on",
    "gesture": "press",
    "action": "Loads the saved setup or defaults and starts the current piece growing on the Garden page.",
    "short_label": "AUTO GROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "280-301",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L280-L301"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "1398-1407",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/project.c",
      "lines": "114-130",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L114-L130"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Garden page is selected, even with Lights set to Off.",
    "short_label": "GARDEN PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Pad page is selected, even with Lights set to Off.",
    "short_label": "PAD PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Bells page is selected, even with Lights set to Off.",
    "short_label": "BELLS PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Bass page is selected, even with Lights set to Off.",
    "short_label": "BASS PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Pulse page is selected, even with Lights set to Off.",
    "short_label": "PULSE PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Space page is selected, even with Lights set to Off.",
    "short_label": "SPACE PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights when the Setup page is selected, even with Lights set to Off.",
    "short_label": "SETUP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "growing",
    "gesture": "lit",
    "action": "The green LED stays lit while growing.",
    "short_label": "GREEN RUN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-947",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L947"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-65",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L46-L65"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "The other PLAY LED is unused by the normal app.",
    "short_label": "RED UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-65",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L46-L65"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "942-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L942-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "frozen",
    "gesture": "lit",
    "action": "Lights while the chord and reverb are frozen, even with Lights set to Off.",
    "short_label": "FROZEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "948-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L948-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "When inactive, glows dimly only with Setup Lights set to On.",
    "short_label": "LABEL GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "When inactive, stays dark with Setup Lights set to Off or Keys.",
    "short_label": "NO GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "50-71",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L50-L71"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "With Lights set to On or Keys, every key whose pitch class is in the scale stays lit.",
    "short_label": "SCALE NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "147-150",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L147-L150"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Keys outside the scale stay dark, and Lights Off extinguishes all key LEDs.",
    "short_label": "SCALE DARK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-amb",
      "ref": "v1.2",
      "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
      "path": "firmware/src/app/ui.c",
      "lines": "950-955",
      "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L950-L955"
     }
    ]
   }
  ]
 },
 "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"
  ]
 },
 "disagreements": [
  {
   "topic": "SEL has no help card",
   "docs_say": "The controls section excludes PLAY from the general help gesture but gives no SEL exception.",
   "source_says": "PLAY and SEL are both excluded; eligible buttons show help after 900 ms.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "docs/MANUAL.md",
    "lines": "106-107",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L106-L107"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "363-385",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "363-385",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L363-L385"
    }
   ]
  },
  {
   "topic": "Evolve at zero",
   "docs_say": "The Garden page description presents zero Evolve as exact loop repetition.",
   "source_says": "Bell target counts still use the Motion arc and random rounding, and sparse-arc bell rests do not require Evolve; zero is not a guarantee of identical repetitions.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "docs/MANUAL.md",
    "lines": "202-207",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L202-L207"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/dsp/amb.c",
    "lines": "663-666",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L663-L666"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "663-666",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L663-L666"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "709-729",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L709-L729"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1714-1729",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1714-L1729"
    }
   ]
  },
  {
   "topic": "Bells and pulse during freeze",
   "docs_say": "The REC control description calls the continuing bells and pulse dry while frozen.",
   "source_says": "Freeze reduces the direct reverb feed but does not remove bell or hat echo sends, and the echo return still feeds the plate.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "docs/MANUAL.md",
    "lines": "93",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L93"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/dsp/amb.c",
    "lines": "1595-1599",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1595-L1599"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1595-1599",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1595-L1599"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1644-1648",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1644-L1648"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1692-1704",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1692-L1704"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1730-1732",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1730-L1732"
    }
   ]
  },
  {
   "topic": "Autosave timing after some edits",
   "docs_say": "The guide places automatic saving shortly after an edit, during rest.",
   "source_says": "The four-second gate measures ui.act_t, refreshed by button/key handling and KNOB 1–4 turns; ALGORITHM, PRESETS and incoming MIDI-note edits do not refresh it, so an eligible resting frame may save those edits immediately.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "docs/MANUAL.md",
    "lines": "305-310",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L305-L310"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "409-459",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L459"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "409-459",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L459"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "958-969",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L958-L969"
    }
   ]
  },
  {
   "topic": "MIDI output off only clears channel 1",
   "docs_say": "The MIDI section describes disabling MIDI out as sending all notes off.",
   "source_says": "Disabling MIDI out sends CC123 on channel 1 only; generated note-offs on channels 2 and 3 are then gated, so external bell or bass notes may remain sounding.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "docs/MANUAL.md",
    "lines": "282-284",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L282-L284"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/dsp/amb.c",
    "lines": "1223-1226",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1223-L1226"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "333-337",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L333-L337"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1223-1226",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1223-L1226"
    }
   ]
  },
  {
   "topic": "Stale emulator hover tips",
   "docs_say": "The recommended emulator’s hover tips assign SEL to Tone, EDIT to page selection, ENV to pad colour, ARP to next chord, SEQ to Motion, HOME to Layers and SELECT to tempo.",
   "source_says": "At v1.2 SEL is unused; EDIT requests a chord, ENV opens Pad, ARP opens Bells, SEQ opens Pulse, HOME opens Garden and SELECT changes pages unless HOME is held for tempo.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "web/emu/index.html",
    "lines": "266-270",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/emu/index.html#L266-L270"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "17-38",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L17-L38"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "300-328",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L300-L328"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-433",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L433"
    },
    {
     "kind": "doc",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "docs/MANUAL.md",
     "lines": "32-33",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/docs/MANUAL.md#L32-L33"
    }
   ]
  }
 ],
 "not_mapped": [
  "No hardware was used: timing, sound, physical LED colours and recovery behavior are read from source, not measured on a unit.",
  "No supported piece export/import or rescue-dump restore was found in this release; the recovery helper captures flash but can only write stock V15 program sectors.",
  "The supplied tree is v1.2 only; the exact behavior of older AMB binaries when reading a format-4 save is not verified here.",
  "Chip-ROM updater screens and controls after entering UBOOT are outside this firmware source; only the entry path is mapped."
 ],
 "saving_note": {
  "action": "SAVE writes all eight pieces at once; autosave waits for rest, released buttons and keys, a faded pad and four quiet seconds after button/key use or KNOB 1–4 turns, while ALGORITHM, PRESETS and MIDI-note edits do not restart that wait.",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "337-343",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L337-L343"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "409-459",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L409-L459"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "958-969",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L958-L969"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/project.c",
    "lines": "133-136",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L133-L136"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "444-453",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L444-L453"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/project.c",
    "lines": "146-151",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L146-L151"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/dsp/amb.c",
    "lines": "1537-1541",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1537-L1541"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "249-255",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L249-L255"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/plat_fm1.c",
    "lines": "87-88",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/plat_fm1.c#L87-L88"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "647-650",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
   }
  ],
  "recipe_reset": "Holding SAVE loads the current piece’s recipe in RAM; while resting, autosave can commit it after you release the controls and the quiet conditions pass.",
  "reset_undo": "Switching off before any further successful save discards the reset and returns to the last saved version, also losing any other unsaved edits.",
  "fade_check": "The source tests en_pad_level <= 0.01, an internal voice-envelope fade meter independent of ENV Level; turning down ENV Level does not satisfy this check.",
  "failures": "A failed SAVE displays NOT SAVED / FLASH ERROR; without the expected flash chip every save fails, and pending edits keep the unsaved dot and eligible autosave retries."
 },
 "input_notes": [
  {
   "note": "Only SELECT + HOME has a modifier branch; other turns retain their page assignments while buttons are held, cancel help eligibility, and normally leave the held button’s release action intact.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "394-461",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L394-L461"
    }
   ]
  },
  {
   "note": "SELECT, ALGORITHM and PRESETS use the sign of an encoder batch rather than its full magnitude; SELECT clamps at the first and last page, while scale modes and pieces wrap.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "271-279",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L271-L279"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "417-443",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L417-L443"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/project.c",
     "lines": "139-143",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L139-L143"
    }
   ]
  },
  {
   "note": "Continuous knob ranges accelerate after the first few quick detents; ranges of 24 or fewer do not accelerate.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "222-250",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L222-L250"
    }
   ]
  },
  {
   "note": "SAVE reset is checked independently of help and other held controls; keeping SAVE down past 1.5 seconds still resets the current piece after help has appeared.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "444-452",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L444-L452"
    }
   ]
  },
  {
   "note": "Freeze prevents timed chord advances but does not lock manual scale, root, piece or reset edits.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "914-917",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L914-L917"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/dsp/amb.c",
     "lines": "1231-1258",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/dsp/amb.c#L1231-L1258"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/ui.c",
     "lines": "253-290",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L253-L290"
    }
   ]
  }
 ],
 "status": "Independently checked: zero errors in round 4 (2026-10-16), after the round-1 to round-3 fixes. No device testing.",
 "switching_note": {
  "kept_on_unit": "All eight pieces and the active selection, custom scales, parameter values, Tune, MIDI out and Lights share one A/B project object at 0xFC000/0xFD000; calibration uses 0xDC000/0xDD000. From the flash atlas (generated): install (packaged update loader): Replaces changed program sectors after checking the package and verifies each write. The flash head below 0x4000 is preserved (each install using this release's loader). install: clear update records: Erases a scanned sector only when its tail passes the update-record checks. It does not exempt saved-data areas from that scan (only when a valid update record is found in a scanned sector). start-up, including first start: Cleans the five update-staging sectors if their checked areas show earlier use. It does not inspect every byte before deciding (when the expected flash chip is present and the checked staging areas are not blank). ordinary first start and subsequent starts: No project or calibration write: reads the panel and project, applies loaded/default values and starts playing; ui_init clears the dirty flag. Loading format 3 migrates in RAM only (no completed calibration or later save action). update staged while AMB-1 runs: Stages and verifies an incoming update loader, then commits its update record after the host confirms. A rejected or failed attempt also clears these staging sectors. Entering update does not save pending project edits (when an installer requests an upgrade on the expected flash chip; a failed or refused attempt also clears staging). recovery (pinned rescue helper returning to stock V15): The supplied helper first writes a whole-flash .bin snapshot to the host, checks the stock package fingerprint and device chip/flash identity, and refuses if the flash head differs. With --write or an affirmative --ask reply it replaces differing V15 program sectors only, high to low, verifies the complete resulting image against preserved data and restarts. It does not restore its .bin snapshots (Only the pinned tools/fm1_rescue.py implementation is covered; the shell wrapper downloads its helper from X0X main and passes --ask, so later downloaded code is unpinned). What AMB-1 writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over AMB-1's is in when_you_leave.",
  "lost": "The evolving loop contents, current chord progression, playback phase, freeze state and echo/reverb audio are not project fields; older project formats other than format 3 fall back to recipes in RAM, and reading format 3 converts its saved settings with new parameters filled from recipes. From the flash atlas (generated): Other firmwares reading AMB-1's data: FoMni reads and uses AMB-1's AMB-1 panel calibration; Polly reads and uses AMB-1's AMB-1 panel calibration. What AMB-1 reads of other firmwares' data: AMB-1 reads and uses FoMni's FoMni button calibration; AMB-1 reads and uses Polly's Polly button and encoder calibration. Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "SAVE keeps settings on the unit only; record valued settings externally before switching because this release has no supported piece export/import or supplied command to restore its rescue .bin dump.",
  "going_back": "v1.2 reads ENO1 format 4 and converts format 3; this tree does not establish that an older binary can read the format-4 object written by v1.2, so do not assume downgrade compatibility.",
  "writes_and_when": "SAVE or an eligible resting autosave alternates the project sectors without a prompt; only completed startup calibration writes its own pair, ordinary startup does not save either object, and used update staging at 0xE0000–0xE4FFF is cleaned at boot. Save with SAVE and wait for SAVED before a firmware update or chip update mode; neither entry path saves edits, and a successful update restarts without preserving unsaved edits. If a USB update fails or is refused and returns to the normal app, ui_init clears the dirty flag and unsaved dot, restarts growing on Garden and leaves edited values only in RAM; those edits no longer await autosave until another edit marks the project dirty.",
  "cross_firmware": "See the switching advice in this section. Back up what you can and record AMB-1 settings externally: writes in either firmware, including startup and automatic writes, can overwrite the other’s data; completing AMB-1 calibration can also overwrite other firmwares’ user presets at 0xDC000/0xDD000.",
  "backup_caution": "The tagged rescue helper can capture a whole-flash .bin in chip update mode, but has no option to write that dump back; its write path installs stock V15 program sectors only. The documented shell wrapper always uses --ask to offer that stock install and downloads its helper from X0X main, whose future contents are not pinned here.",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/storage.c",
    "lines": "15-28",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/storage.c#L15-L28"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/storage.c",
    "lines": "49-52",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/storage.c#L49-L52"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/app.h",
    "lines": "12-31",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/app.h#L12-L31"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/project.c",
    "lines": "78-136",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/project.c#L78-L136"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "337-343",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L337-L343"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "958-969",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L958-L969"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/panel.c",
    "lines": "102-108",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/panel.c#L102-L108"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "249-255",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L249-L255"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/ota.c",
    "lines": "381-395",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/ota.c#L381-L395"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/loader/ldr_core.c",
    "lines": "25-28",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/loader/ldr_core.c#L25-L28"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/loader/ldr_core.c",
    "lines": "99-135",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/loader/ldr_core.c#L99-L135"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "web/amb_installer.html",
    "lines": "193-230",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L193-L230"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.py",
    "lines": "236-264",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.py#L236-L264"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.py",
    "lines": "381-411",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.py#L381-L411"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.sh",
    "lines": "5-6",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.sh#L5-L6"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.sh",
    "lines": "24",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.sh#L24"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.sh",
    "lines": "47",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.sh#L47"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "345-354",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L345-L354"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "165-175",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L165-L175"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "1398-1407",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L1398-L1407"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/app/ui.c",
    "lines": "647-650",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/ui.c#L647-L650"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "firmware/src/main.c",
    "lines": "116-123",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/main.c#L116-L123"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.py",
    "lines": "265-286",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.py#L265-L286"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.py",
    "lines": "381-411",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.py#L381-L411"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-amb",
    "ref": "v1.2",
    "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
    "path": "tools/fm1_rescue.sh",
    "lines": "47",
    "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/tools/fm1_rescue.sh#L47"
   }
  ],
  "stock_return": {
   "route": "Use the author’s web installer and its stock-return section, choose the linked V15 file and start installation; the page checks its SHA-256 and can work from AMB-1 safe mode.",
   "url": "https://charlesvestal.github.io/fm1-amb/install/",
   "route_evidence": "read-in-source",
   "warning": "The author warns that AMB-1 piece saves can be lost; the closed stock loader’s actual treatment of those saves is not established here.",
   "warning_evidence": "vendor-doc",
   "source": [
    {
     "kind": "doc",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "web/amb_installer.html",
     "lines": "117",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L117"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "web/amb_installer.html",
     "lines": "175-190",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L175-L190"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "web/amb_installer.html",
     "lines": "229-230",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/web/amb_installer.html#L229-L230"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-amb",
     "ref": "v1.2",
     "commit": "72d3bda42c03542c1c2651b11e87fcb8c19622ca",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "220-225",
     "url": "https://github.com/charlesvestal/fm1-amb/blob/72d3bda42c03542c1c2651b11e87fcb8c19622ca/firmware/src/app/main_fm1.c#L220-L225"
    }
   ]
  },
  "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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, button calibration, favourites, MIDI LEARN map. At risk when you act: user presets 1-16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk when you act: X0X button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, favourites, MENU options. 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)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U001-U018.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FoMni button calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). Carried over: FoMni button 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": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1 (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration.",
    "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": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 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": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "Polly button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. Carried over: 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk when you act: user sound bank 1.",
    "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": [
     "AMB-1 panel calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): AMB-1 panel calibration.",
    "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": [
     "AMB-1 panel calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if its 2ND CORE is on and a render job fails or times out",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CCs (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 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)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk by itself, under a condition: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "AMB-1 panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. Carried over: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (no question)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 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)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "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)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: AMB-1 panel calibration; AMB-1 pieces and setup.",
    "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": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup.",
    "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": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "AMB-1 panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. Carried over: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1: Stock-return route and warning",
   "fixed": "Added the author’s installer link, stock route, vendor-doc loss warning and command-line install coverage; distinguished the closed loader’s unknown effects.",
   "at": "install.web; controls.jack_usb_c[4], [5], [6]; switching_note.stock_return; amb.md Recover or update / Before you switch firmware; amb.storage.json firmware_notes"
  },
  {
   "round": 1,
   "error": "2: Updates do not save and returned failures clear dirty",
   "fixed": "Added pre-update SAVE guidance and the RAM-only/cleared-dot behavior after a returned failure to modes, controls, switching prose and the storage fragment.",
   "at": "modes[15-16]; controls.button_oct_down[1], button_oct_up[1], screen[17], jack_usb_c[7], [8]; switching_note.writes_and_when; amb.storage.json install_and_startup_writes[4], firmware_notes; amb.md Recover or update"
  },
  {
   "round": 1,
   "error": "3: Atlas integration handoff",
   "fixed": "Added an empty switching block inside Before you switch firmware and kept the maker’s switching sentences; atlas merging remains assigned to the lead.",
   "at": "amb.md Before you switch firmware"
  },
  {
   "round": 1,
   "error": "4: Rescue dump is not a restorable setup backup",
   "fixed": "Removed the implication of a supported backup round trip and stated that the helper cannot restore its dump and the wrapper offers stock installation.",
   "at": "switching_note.back_up_first / backup_caution; not_mapped[1]; amb.md Before you switch firmware; amb.storage.json firmware_notes[0], unknowns[0]"
  },
  {
   "round": 1,
   "error": "5: Help tests current key state",
   "fixed": "Corrected help eligibility to distinguish a released key tap from a turn since the button press.",
   "at": "modes[10].how_to_get_there; controls button HELP entries in place; amb.md Save, reset and get help"
  },
  {
   "round": 1,
   "error": "6: Recipe reset direction and undo window",
   "fixed": "Clarified discarded edits, resting autosave after release, and returning to the last saved version by powering off before a save.",
   "at": "controls.button_save[1]; saving_note.recipe_reset / reset_undo; amb.md Save, reset and get help"
  },
  {
   "round": 1,
   "error": "7: Internal pad fade and plain save wording",
   "fixed": "Separated the internal fade meter from ENV Level and replaced owner-facing timestamp jargon with the four-second wait.",
   "at": "saving_note; amb.md save row / autosave explanation; amb.storage.json objects[0].written_when[0]"
  },
  {
   "round": 1,
   "error": "8: MIDI out gate",
   "fixed": "Added the MIDI out enabled condition to the generated-layer MIDI entry.",
   "at": "controls.jack_usb_c[1]"
  },
  {
   "round": 1,
   "error": "9: Freeze documentation line",
   "fixed": "Corrected the citation to the REC row that actually says dry and removed the inaccurate Getting Started attribution.",
   "at": "disagreements[2].docs_ref / docs_say"
  },
  {
   "round": 1,
   "error": "10: MIDI all-notes-off disagreement",
   "fixed": "Added the channel-1-only disagreement and possible hanging external notes.",
   "at": "disagreements[4]; amb.md Setup MIDI row / Where the docs and the firmware disagree; controls.encoder_knob3[6]"
  },
  {
   "round": 1,
   "error": "11: Emulator hover tips disagreement",
   "fixed": "Recorded the seven stale hover assignments and their v1.2 replacements.",
   "at": "disagreements[5]; amb.md Where the docs and the firmware disagree"
  },
  {
   "round": 1,
   "error": "12: USB entry into chip update mode",
   "fixed": "Added the exact SysEx route in normal use and safe mode, its display and no-save behavior. ",
   "at": "modes[15]; controls.screen[16], jack_usb_c[9]; amb.md Recover or update; amb.storage.json firmware_notes"
  },
  {
   "round": 1,
   "error": "13: Save failures and retry state",
   "fixed": "Added explicit save-error and retry screen entries, the absent-flash failure condition and owner guidance to wait for SAVED. ",
   "at": "controls.screen[20], [21]; saving_note.failures; amb.md Save, reset and get help; amb.storage.json objects[0].written_when"
  },
  {
   "round": 1,
   "error": "14: Release date versus mapping date",
   "fixed": "Named the release and mapping dates separately.",
   "at": "amb.md opening version line"
  },
  {
   "round": 2,
   "error": "1: Switching table lacks AMB-1",
   "fixed": "Replaced all three unconditional atlas referrals with an explicit pending-coverage warning and interim save-overlap precautions, without changing the generated block.",
   "at": "switching_note.cross_firmware; amb.md Before you switch firmware; amb.storage.json firmware_notes[0]"
  },
  {
   "round": 2,
   "error": "2: Copied autosave wording",
   "fixed": "Rephrased the saving description in original words after rereading the guide and source comment.",
   "at": "disagreements[3].docs_say"
  },
  {
   "round": 3,
   "error": "1: Automatic writes and calibration also threaten stored work",
   "fixed": "Expanded the interim caution in all three places to include startup and automatic writes in either firmware, plus completed AMB-1 calibration overwriting other firmwares’ preset storage at 0xDC000/0xDD000.",
   "at": "switching_note.cross_firmware; amb.md Before you switch firmware; amb.storage.json firmware_notes[0]"
  }
 ]
}