{
 "firmware": "FM-106",
 "slug": "fm106",
 "author": "PatttF; platform and DSP contributors credited in the README",
 "repo": "https://github.com/PatttF/fm-106",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "Beta4",
 "mapped_commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-16",
 "version_note": "Beta release; Beta4 was the hub package checked on 2026-10-16, while Beta5 had no installable package in that check.",
 "turns_it_into": "A six-voice Juno-style synth with chorus, tape colour and one step sequence.",
 "docs": [
  {
   "title": "FM-106 README",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/README.md",
   "read_at": "Beta4"
  },
  {
   "title": "FM-106 guide",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html",
   "read_at": "Beta4"
  },
  {
   "title": "FM-106 librarian",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html",
   "read_at": "Beta4",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "manual.html",
     "lines": "455",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L455"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "index.html",
     "lines": "86",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/index.html#L86"
    }
   ]
  }
 ],
 "install": {
  "official": "https://github.com/PatttF/fm-106/releases/tag/Beta4",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "SEL is BTN_SEL; PLAY/STOP is BTN_PLAY; the keys run F3–G5 at octave zero; ALGORITHM is an encoder without a push switch; key LEDs are grouped as lights.key_lights.",
 "scope_note": "Mapped the Beta4 application and boot-stage source under firmware/, including the boot stub; the older root src/ copy is not used, and the root librarian is the one linked by the guide and installer; no unit was tested.",
 "scope_source": [
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/crt0.S",
   "lines": "3-6",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/crt0.S#L3-L6"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/app.ld",
   "lines": "4-6",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/app.ld#L4-L6"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/app.ld",
   "lines": "17",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/app.ld#L17"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/stub/stub.c",
   "lines": "264-312",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L264-L312"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/stub/stub_core.h",
   "lines": "248-276",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "tools/build.py",
   "lines": "35-36",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/tools/build.py#L35-L36"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "tools/build.py",
   "lines": "199-205",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/tools/build.py#L199-L205"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "manual.html",
   "lines": "455",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L455"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "index.html",
   "lines": "86",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/index.html#L86"
  }
 ],
 "mode_rules": "any means the running instrument, excluding rescue, update transfer, ROM entry and crash; normal includes the ten pages and sequence menus; sound_pages means the nine pages other than SEQ; seq means the SEQ page including its menus; narrower modes refine their parent.",
 "modifier_note": {
  "text": "There is no shifted encoder layer; holding a button keeps the current encoder job until that button changes the page or opens a menu.",
  "source": [
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2184-2285",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2184-L2285"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2288-2423",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2288-L2423"
   }
  ]
 },
 "modes": [
  {
   "id": "normal",
   "name": "Instrument pages and sequence menus",
   "how_to_get_there": "Start FM-106 or leave GLO and SAVE.",
   "what_it_is": "Keys and transport keep working while you edit.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1873-1893",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1873-L1893"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2102-2104",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2102-L2104"
    }
   ]
  },
  {
   "id": "factory_sound",
   "name": "Factory sound selected",
   "how_to_get_there": "Choose bank A or B with ALGORITHM.",
   "what_it_is": "A short SAVE copies to the first blank user destination.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1616-1646",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1616-L1646"
    }
   ],
   "parent": "normal"
  },
  {
   "id": "user_sound",
   "name": "User sound selected",
   "how_to_get_there": "Choose bank UA or UB with ALGORITHM.",
   "what_it_is": "A short SAVE replaces the selected user sound.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1647-1658",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1647-L1658"
    }
   ],
   "parent": "normal"
  },
  {
   "id": "sound_pages",
   "name": "Sound pages",
   "how_to_get_there": "Use SELECT, HOME, ENV, LFO, ARP or FX.",
   "what_it_is": "The nine sound pages share preset browsing and four page knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1922-1993",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1993"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2184-2224",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2184-L2224"
    }
   ],
   "parent": "normal"
  },
  {
   "id": "vcf",
   "name": "VCF",
   "how_to_get_there": "Press HOME.",
   "what_it_is": "Filter cutoff, resonance and modulation.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "77-78",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L77-L78"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2297-2302",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2297-L2302"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "vcf2",
   "name": "VCF 2",
   "how_to_get_there": "Turn SELECT one page after VCF.",
   "what_it_is": "Keyboard tracking, envelope direction and bend amounts.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "80-81",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L80-L81"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2303-2308",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2303-L2308"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "dco",
   "name": "DCO",
   "how_to_get_there": "Turn SELECT to DCO.",
   "what_it_is": "Oscillator range and waveform switches.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "83-84",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L83-L84"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2309-2340",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2309-L2340"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "dco2",
   "name": "DCO 2",
   "how_to_get_there": "Turn SELECT to DCO 2.",
   "what_it_is": "Sub, noise, pulse width and pitch modulation.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "86-87",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L86-L87"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2341-2357",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2341-L2357"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "envelope",
   "name": "ENV (ADSR)",
   "how_to_get_there": "Press ENV outside SEQ.",
   "what_it_is": "Attack, decay, sustain and release.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "89-90",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L89-L90"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2358-2365",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2358-L2365"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "lfo",
   "name": "LFO",
   "how_to_get_there": "Press LFO outside SEQ.",
   "what_it_is": "Modulation speed, onset delay and pulse-width source.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "92-93",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L92-L93"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2366-2370",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2366-L2370"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "arp",
   "name": "ARPEGGIATOR",
   "how_to_get_there": "Press ARP.",
   "what_it_is": "Arpeggio enable, direction, speed and octave span.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "95-96",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L95-L96"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2371-2381",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2371-L2381"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "fx",
   "name": "FX (CHORUS)",
   "how_to_get_there": "Press FX from any page except FX (CHORUS).",
   "what_it_is": "Chorus, high-pass filter and amplifier.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "98-99",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L98-L99"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2382-2397",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2382-L2397"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "tape",
   "name": "FX (TAPE)",
   "how_to_get_there": "Press FX while FX (CHORUS) is open.",
   "what_it_is": "Tape enable, blend, movement and saturation.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "101-102",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L101-L102"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2398-2410",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2398-L2410"
    }
   ],
   "parent": "sound_pages"
  },
  {
   "id": "seq",
   "name": "SEQ page and menus",
   "how_to_get_there": "Press SEQ.",
   "what_it_is": "One RAM sequence, with recording and note or pattern options.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2096-2100",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2096-L2100"
    }
   ],
   "parent": "normal"
  },
  {
   "id": "seq_roll",
   "name": "Sequence grid",
   "how_to_get_there": "Press SEQ and close its menus with HOME.",
   "what_it_is": "A 16-step window with 14 pitch rows, edit cell and playhead.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1358-1446",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1358-L1446"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "seq_stopped",
   "name": "Stopped entry, REC off",
   "how_to_get_there": "Stop playback and turn REC off on SEQ.",
   "what_it_is": "Each note toggles its pitch at the cursor and advances one step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "672-675",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "seq_record",
   "name": "Armed note entry",
   "how_to_get_there": "Press REC on SEQ or enable REC in its options.",
   "what_it_is": "Keys record on SEQ, including its menus; stopped presses advance the cursor individually, and each press replaces that step’s existing sound locks with the current sound.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "618-671",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1879-1893",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1893"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2441-2446",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2441-L2446"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "seq_running",
   "name": "Playing, REC off",
   "how_to_get_there": "Start PLAY with REC off.",
   "what_it_is": "Panel keys play over the pattern without recording.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "618-675",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L675"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1879-1893",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1893"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "seq_options",
   "name": "SEQ OPTIONS",
   "how_to_get_there": "Hold EDIT for 0.5 seconds on SEQ.",
   "what_it_is": "SELECT chooses a row and ALGORITHM changes its value; HOME closes it.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1997-2018",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2187-2192",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2187-L2192"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2230-2232",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "note_options",
   "name": "NOTE OPTIONS",
   "how_to_get_there": "Release EDIT before 0.5 seconds on the SEQ grid.",
   "what_it_is": "Ratchet, tie, accent and slide apply to the edit step, or the playing step with REC armed.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "565-586",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L565-L586"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2006-2018",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2006-L2018"
    }
   ],
   "parent": "seq"
  },
  {
   "id": "seq_steps",
   "name": "SEQ OPTIONS: STEPS",
   "how_to_get_there": "Select STEPS with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1143-1147",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1143-L1147"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "seq_bpm",
   "name": "SEQ OPTIONS: BPM",
   "how_to_get_there": "Select BPM with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1148-1151",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1148-L1151"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "seq_division",
   "name": "SEQ OPTIONS: DIV",
   "how_to_get_there": "Select DIV with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1152-1155",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1152-L1155"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "seq_default_gate",
   "name": "SEQ OPTIONS: GATE",
   "how_to_get_there": "Select GATE with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1156-1159",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1156-L1159"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "seq_swing",
   "name": "SEQ OPTIONS: SWING",
   "how_to_get_there": "Select SWING with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1160-1163",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1160-L1163"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "seq_rec",
   "name": "SEQ OPTIONS: REC",
   "how_to_get_there": "Select REC with SELECT.",
   "what_it_is": "ALGORITHM edits this row.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1164-1166",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1164-L1166"
    }
   ],
   "parent": "seq_options"
  },
  {
   "id": "note_ratchet",
   "name": "NOTE OPTIONS: RATCHET",
   "how_to_get_there": "Select RATCHET with SELECT.",
   "what_it_is": "ALGORITHM edits the playing step when REC and PLAY are on, otherwise the cursor step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "286-292",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "571-574",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L571-L574"
    }
   ],
   "parent": "note_options"
  },
  {
   "id": "note_tie",
   "name": "NOTE OPTIONS: TIE",
   "how_to_get_there": "Select TIE with SELECT.",
   "what_it_is": "ALGORITHM edits the playing step when REC and PLAY are on, otherwise the cursor step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "286-292",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "575-577",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L575-L577"
    }
   ],
   "parent": "note_options"
  },
  {
   "id": "note_accent",
   "name": "NOTE OPTIONS: ACCENT",
   "how_to_get_there": "Select ACCENT with SELECT.",
   "what_it_is": "ALGORITHM edits the playing step when REC and PLAY are on, otherwise the cursor step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "286-292",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "578-580",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L578-L580"
    }
   ],
   "parent": "note_options"
  },
  {
   "id": "note_slide",
   "name": "NOTE OPTIONS: SLIDE",
   "how_to_get_there": "Select SLIDE with SELECT.",
   "what_it_is": "ALGORITHM edits the playing step when REC and PLAY are on, otherwise the cursor step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "286-292",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "581-583",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L581-L583"
    }
   ],
   "parent": "note_options"
  },
  {
   "id": "options",
   "name": "OPTIONS",
   "how_to_get_there": "Press GLO.",
   "what_it_is": "MIDI SETUP opens with SEL; ABOUT is listed but has no opening handler.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1449-1467",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1449-L1467"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2076-2084",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2076-L2084"
    }
   ]
  },
  {
   "id": "midi",
   "name": "MIDI SETUP",
   "how_to_get_there": "Press GLO, choose MIDI SETUP with SELECT, then press SEL.",
   "what_it_is": "Five settings, with SELECT for the row and ALGORITHM for the value.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1469-1507",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    }
   ]
  },
  {
   "id": "midi_in",
   "name": "MIDI SETUP: MIDI IN",
   "how_to_get_there": "Select MIDI IN with SELECT.",
   "what_it_is": "Settings save automatically without a confirmation or panel undo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ],
   "parent": "midi"
  },
  {
   "id": "midi_out",
   "name": "MIDI SETUP: MIDI OUT",
   "how_to_get_there": "Select MIDI OUT with SELECT.",
   "what_it_is": "Settings save automatically without a confirmation or panel undo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ],
   "parent": "midi"
  },
  {
   "id": "midi_sync",
   "name": "MIDI SETUP: SYNC",
   "how_to_get_there": "Select SYNC with SELECT.",
   "what_it_is": "Settings save automatically without a confirmation or panel undo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ],
   "parent": "midi"
  },
  {
   "id": "midi_local",
   "name": "MIDI SETUP: LOCAL",
   "how_to_get_there": "Select LOCAL with SELECT.",
   "what_it_is": "Settings save automatically without a confirmation or panel undo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ],
   "parent": "midi"
  },
  {
   "id": "midi_pc",
   "name": "MIDI SETUP: PC IN",
   "how_to_get_there": "Select PC IN with SELECT.",
   "what_it_is": "Settings save automatically without a confirmation or panel undo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2285",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2285"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ],
   "parent": "midi"
  },
  {
   "id": "save",
   "name": "SAVE PRESET",
   "how_to_get_there": "Hold SAVE for at least 0.5 seconds.",
   "what_it_is": "Choose a user slot and edit a 15-character name before committing.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1574-1614",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1574-L1614"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2138-2153",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2153"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1661-1785",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1661-L1785"
    }
   ]
  },
  {
   "id": "delete_confirm",
   "name": "Delete confirmation",
   "how_to_get_there": "Press SEL on an occupied destination in SAVE PRESET.",
   "what_it_is": "A second SEL empties that slot in memory; HOME cancels.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2053-2074",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2053-L2074"
    }
   ],
   "parent": "save"
  },
  {
   "id": "update",
   "name": "Update entry",
   "how_to_get_there": "Hold OCT-, OCT+ and HOME together for more than five seconds.",
   "what_it_is": "Audio stops and the unit resets to a dark-screen ROM USB updater, or a valid waiting staged loader; this does not open the application’s USB RESCUE screen.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "354-377",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L354-L377"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/hal/fm1_sys.h",
     "lines": "191-200",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/hal/fm1_sys.h#L191-L200"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub_core.h",
     "lines": "248-276",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub.c",
     "lines": "302-312",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L302-L312"
    }
   ]
  },
  {
   "id": "rescue",
   "name": "USB rescue",
   "how_to_get_there": "The application opens this rescue screen after two failed starts; the power-on OCT- shortcut instead enters the boot updater before the application.",
   "what_it_is": "The application’s USB rescue runs without sound or settings saves and is separate from the dark-screen boot updater.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/bootguard.h",
     "lines": "15-25",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/bootguard.h#L15-L25"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "440-444",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L440-L444"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/recovery.c",
     "lines": "56-74",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/recovery.c#L56-L74"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub_core.h",
     "lines": "248-276",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
    }
   ]
  },
  {
   "id": "install_progress",
   "name": "Update transfer",
   "how_to_get_there": "Start a firmware update from the connected installer.",
   "what_it_is": "The application shows transfer stages while the installer controls the update.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "130-146",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L130-L146"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "340-343",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L340-L343"
    }
   ]
  },
  {
   "id": "rom_entry",
   "name": "ROM updater entry",
   "how_to_get_there": "The installer can request the ROM updater over USB.",
   "what_it_is": "Audio stops before USB disconnects and the ROM updater starts.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "345-353",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L345-L353"
    }
   ]
  },
  {
   "id": "crash",
   "name": "Crash display",
   "how_to_get_there": "An application fault opens this screen automatically.",
   "what_it_is": "The application stops audio, displays diagnostic values and reboots after about eight seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "395-411",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L395-L411"
    }
   ]
  },
  {
   "id": "boot_rescue",
   "name": "Boot updater",
   "how_to_get_there": "Hold OCT- with OCT+ released while powering on, or complete the running update gesture.",
   "what_it_is": "The boot stage bypasses the instrument without drawing its rescue page, powers the shared display rail while sampling and blinking, then switches that rail off before entering the ROM updater or a valid staged loader.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub_core.h",
     "lines": "248-276",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub.c",
     "lines": "264-312",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L264-L312"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "369-377",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L369-L377"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/stub/stub.c",
     "lines": "92-100",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L92-L100"
    }
   ]
  }
 ],
 "controls": {
  "screen": [
   {
    "mode": "vcf",
    "gesture": "shows",
    "action": "Shows FREQ, RES, ENV and LFO beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "VCF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "77-78",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L77-L78"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "vcf2",
    "gesture": "shows",
    "action": "Shows KBD, INV, B.DCO and B.VCF beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "VCF 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "80-81",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L80-L81"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "dco",
    "gesture": "shows",
    "action": "Shows RNG, PULSE, SAW and SUBSW beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "DCO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "83-84",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L83-L84"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "dco2",
    "gesture": "shows",
    "action": "Shows SUB, NOISE, PWM and DCOLFO beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "DCO 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "86-87",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L86-L87"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "shows",
    "action": "Shows ATK, DEC, SUS and REL beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "ENV (ADSR)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "89-90",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L89-L90"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "shows",
    "action": "Shows RATE, DELAY and PWM MD, with an empty fourth slot beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "92-93",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L92-L93"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "shows",
    "action": "Shows ARP, MODE, ARAT and ARNG beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "ARPEGGIATOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "95-96",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L95-L96"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "shows",
    "action": "Shows CHO, HPF, VCA and LEVEL beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "FX (CHORUS)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "98-99",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L98-L99"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "shows",
    "action": "Shows TAPE, MIX, RATE and CHAR beneath the patch, bank, battery and six voice indicators, with a live waveform below.",
    "short_label": "FX (TAPE)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "101-102",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L101-L102"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "857-990",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L857-L990"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "992-1073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L992-L1073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1075-1134",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1075-L1134"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "shows",
    "action": "Show SEQ OPTIONS with STEPS selected, displaying lengths 1,000–1,024 incorrectly as :00 through :24.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1177-1183",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1177-L1183"
     }
    ]
   },
   {
    "mode": "seq_bpm",
    "gesture": "shows",
    "action": "Shows SEQ OPTIONS with BPM selected and its current value.",
    "short_label": "BPM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "seq_division",
    "gesture": "shows",
    "action": "Shows SEQ OPTIONS with DIV selected and its current value.",
    "short_label": "DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "seq_default_gate",
    "gesture": "shows",
    "action": "Shows SEQ OPTIONS with GATE selected and its current value.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "seq_swing",
    "gesture": "shows",
    "action": "Shows SEQ OPTIONS with SWING selected and its current value.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "seq_rec",
    "gesture": "shows",
    "action": "Shows SEQ OPTIONS with REC selected and its current value.",
    "short_label": "REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1173-1223",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1173-L1223"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "note_ratchet",
    "gesture": "shows",
    "action": "Shows NOTE OPTIONS with RATCHET selected and the edit step’s value.",
    "short_label": "RATCHET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1261-1295",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1261-L1295"
     }
    ]
   },
   {
    "mode": "note_tie",
    "gesture": "shows",
    "action": "Shows NOTE OPTIONS with TIE selected and the edit step’s value.",
    "short_label": "TIE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1261-1295",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1261-L1295"
     }
    ]
   },
   {
    "mode": "note_accent",
    "gesture": "shows",
    "action": "Shows NOTE OPTIONS with ACCENT selected and the edit step’s value.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1261-1295",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1261-L1295"
     }
    ]
   },
   {
    "mode": "note_slide",
    "gesture": "shows",
    "action": "Shows NOTE OPTIONS with SLIDE selected and the edit step’s value.",
    "short_label": "SLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1261-1295",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1261-L1295"
     }
    ]
   },
   {
    "mode": "midi_in",
    "gesture": "shows",
    "action": "Shows MIDI SETUP with MIDI IN highlighted.",
    "short_label": "MIDI IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "midi_out",
    "gesture": "shows",
    "action": "Shows MIDI SETUP with MIDI OUT highlighted.",
    "short_label": "MIDI OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "midi_sync",
    "gesture": "shows",
    "action": "Shows MIDI SETUP with SYNC highlighted.",
    "short_label": "SYNC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "midi_local",
    "gesture": "shows",
    "action": "Shows MIDI SETUP with LOCAL highlighted.",
    "short_label": "LOCAL KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "midi_pc",
    "gesture": "shows",
    "action": "Shows MIDI SETUP with PC IN highlighted.",
    "short_label": "PROGRAM IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "shows",
    "action": "Show PLAY or STOP, tempo, swing, the pitch grid, red cursor, white edit cell, cyan playhead and STEP, NOTE, GATE and VEL guides.",
    "short_label": "PIANO ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1298-1355",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1298-L1355"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1358-1446",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1358-L1446"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "shows",
    "action": "Show pattern length, tempo, division, default gate, swing and record arm.",
    "short_label": "SEQ OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1239-1258",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1239-L1258"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "shows",
    "action": "Show ratchet count, tie, accent and slide for the edit step.",
    "short_label": "NOTE OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1261-1295",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1261-L1295"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "shows",
    "action": "Show MIDI SETUP and ABOUT, with the selected row highlighted.",
    "short_label": "OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1449-1467",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1449-L1467"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "shows",
    "action": "Show MIDI IN, MIDI OUT, SYNC, LOCAL and PC IN with the current values.",
    "short_label": "MIDI SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1469-1507",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "shows",
    "action": "Show the destination, its existing name or blank status, the proposed name and cursor, with SAVE, HOME and SEL hints.",
    "short_label": "SAVE PRESET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1661-1785",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1661-L1785"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "shows",
    "action": "Ask whether to empty the selected occupied user slot, with SEL to confirm and HOME to cancel.",
    "short_label": "DELETE?",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1757-1781",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1757-L1781"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "action": "Show the countdown after two seconds and UPDATE MODE after more than five seconds, then go dark as the unit resets to the ROM USB updater or a valid staged loader.",
    "short_label": "UPDATE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "354-377",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L354-L377"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/hal/fm1_sys.h",
      "lines": "191-200",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/hal/fm1_sys.h#L191-L200"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub_core.h",
      "lines": "248-276",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub.c",
      "lines": "302-312",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L302-L312"
     }
    ]
   },
   {
    "mode": "rescue",
    "gesture": "shows",
    "action": "Show FM-106 USB RESCUE, flash status and AUDIO OFF after two failed application starts, rather than for the power-on OCT- shortcut.",
    "short_label": "USB RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/bootguard.h",
      "lines": "15-25",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/bootguard.h#L15-L25"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "440-444",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L440-L444"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/recovery.c",
      "lines": "56-74",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/recovery.c#L56-L74"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub_core.h",
      "lines": "248-276",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
     }
    ]
   },
   {
    "mode": "install_progress",
    "gesture": "shows",
    "action": "Show UPDATE with the current package-check, loader, confirmation or restart stage, or FAILED if the update aborts.",
    "short_label": "UPDATING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "130-140",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L130-L140"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/ota.c",
      "lines": "347-388",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/ota.c#L347-L388"
     }
    ]
   },
   {
    "mode": "rom_entry",
    "gesture": "shows",
    "action": "Show UBOOT (USB) before entering the ROM updater.",
    "short_label": "ROM UPDATER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "345-353",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L345-L353"
     }
    ]
   },
   {
    "mode": "crash",
    "gesture": "shows",
    "action": "Show FM-106 CRASH and three diagnostic values on red, then reboot after about eight seconds.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "395-411",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L395-L411"
     }
    ]
   },
   {
    "mode": "sound_pages",
    "gesture": "shows",
    "action": "Show saved or full-bank notices in the sound-page header for the remainder of their two-second lifetime, with DELETED or SEQ CLEARED visible only if that header is reached before expiry and no banner on SEQ or SAVE PRESET.",
    "short_label": "NOTICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "959-961",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L959-L961"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1543-1555",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1543-L1555"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2037",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2037"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2071-2073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2071-L2073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2685-2702",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2685-L2702"
     }
    ]
   },
   {
    "mode": "boot_rescue",
    "gesture": "shows",
    "action": "Draw no application rescue screen while keys are sampled and blinks signal ROM USB boot or a valid staged loader, with the shared display rail powered during sampling and switched off before handover.",
    "short_label": "BOOT DISPLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub.c",
      "lines": "92-100",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L92-L100"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub.c",
      "lines": "281-312",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L281-L312"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "action": "Change the pattern length by one step, from 1 to 1,024, keeping the hidden steps in memory.",
    "short_label": "STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1143-1147",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1143-L1147"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "seq_bpm",
    "gesture": "turn",
    "action": "Change the tempo by one beat per minute, from 40 to 240.",
    "short_label": "BPM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1148-1151",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1148-L1151"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "seq_division",
    "gesture": "turn",
    "action": "Cycle the step duration through 1, 1/2, 1/4, 1/8, 1/3, 1/6, 2X, 4X, 8X and 16X.",
    "short_label": "DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1152-1155",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1152-L1155"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "seq_default_gate",
    "gesture": "turn",
    "action": "Change the default gate by four, within 8–127.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1156-1159",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1156-L1159"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "seq_swing",
    "gesture": "turn",
    "action": "Change swing by four, within 0–100.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1160-1163",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1160-L1163"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "seq_rec",
    "gesture": "turn",
    "action": "Toggle recording for notes and sound changes without writing flash.",
    "short_label": "REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1164-1166",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1164-L1166"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2230-2232",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2230-L2232"
     }
    ]
   },
   {
    "mode": "note_ratchet",
    "gesture": "turn",
    "action": "Set repeats from 0 to 8, with 0 and 1 both meaning one hit and larger values repeating the step unless slide or a following tie holds it.",
    "short_label": "RATCHET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "571-574",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L571-L574"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "754-791",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
     }
    ]
   },
   {
    "mode": "note_tie",
    "gesture": "turn",
    "action": "Toggle this step between normal notes and sustaining the preceding notes.",
    "short_label": "TIE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "575-577",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L575-L577"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "754-791",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
     }
    ]
   },
   {
    "mode": "note_accent",
    "gesture": "turn",
    "action": "Toggle the whole step’s accent, making playback velocity 127 when enabled.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "578-580",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L578-L580"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "754-791",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
     }
    ]
   },
   {
    "mode": "note_slide",
    "gesture": "turn",
    "action": "Toggle the step’s slide flag, which holds its notes into the following step without a pitch glide.",
    "short_label": "SLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "581-583",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L581-L583"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "754-791",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
     }
    ]
   },
   {
    "mode": "midi_in",
    "gesture": "turn",
    "action": "Choose ALL or input channel 1–16, scheduling settings to save automatically after more than one second without a MIDI-menu edit once all keys and synth voices are quiet, without a confirmation or undo.",
    "short_label": "MIDI IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2255-2259",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2255-L2259"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "174-185",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L185"
     }
    ]
   },
   {
    "mode": "midi_out",
    "gesture": "turn",
    "action": "Choose output channel 1–16, scheduling settings to save automatically after more than one second without a MIDI-menu edit once all keys and synth voices are quiet, without a confirmation or undo.",
    "short_label": "MIDI OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2260-2264",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2260-L2264"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "174-185",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L185"
     }
    ]
   },
   {
    "mode": "midi_sync",
    "gesture": "turn",
    "action": "Cycle OFF, MASTER and SLAVE, scheduling settings to save automatically after more than one second without a MIDI-menu edit once all keys and synth voices are quiet, without a confirmation or undo.",
    "short_label": "SYNC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2265-2270",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2265-L2270"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "174-185",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L185"
     }
    ]
   },
   {
    "mode": "midi_local",
    "gesture": "turn_cw",
    "action": "Toggle whether the panel keys sound the synth, releasing local voices when switched off and scheduling a quiet settings save after more than one second, without a confirmation or undo.",
    "short_label": "LOCAL KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2271-2278",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2271-L2278"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "174-185",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L185"
     }
    ]
   },
   {
    "mode": "midi_local",
    "gesture": "turn_ccw",
    "action": "Leaves LOCAL unchanged but still schedules the quiet settings save without asking or providing undo.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2271-2278",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2271-L2278"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     }
    ]
   },
   {
    "mode": "midi_pc",
    "gesture": "turn_cw",
    "action": "Toggle incoming program changes and schedule a quiet settings save after more than one second, without a confirmation or undo.",
    "short_label": "PROGRAM IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2279-2284",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2279-L2284"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "174-185",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L185"
     }
    ]
   },
   {
    "mode": "midi_pc",
    "gesture": "turn_ccw",
    "action": "Leaves PC IN unchanged but still schedules the quiet settings save without asking or providing undo.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2279-2284",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2279-L2284"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     }
    ]
   },
   {
    "mode": "normal",
    "gesture": "turn",
    "action": "Load the same slot from another bank and send bank/program messages without asking when no SEQ menu is retained, or do nothing after FX or ARP leaves a SEQ menu until SEQ then HOME closes it.",
    "short_label": "BANK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2242-2253",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2242-L2253"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1569-1572",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1569-L1572"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "96-194",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L96-L194"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1924-1927",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1924-L1927"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2094",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2094"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1931-1935",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Move through the 15 character positions without wrapping.",
    "short_label": "NAME CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2236-2241",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2236-L2241"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "turn",
    "action": "Move through the 15 character positions without wrapping.",
    "short_label": "NAME CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2236-2241",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2236-L2241"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing on OPTIONS.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2227-2285",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2227-L2285"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Open the chorus page, or switch to TAPE when the chorus page is already open.",
    "short_label": "FX PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Close an open SEQ menu, or return to VCF if no SEQ menu is open.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1930-1951",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1930-L1951"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Return to the instrument pages.",
    "short_label": "LEAVE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1944-1947",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1944-L1947"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Return to OPTIONS.",
    "short_label": "OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1944-1947",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1944-L1947"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Leave the name and destination screen without committing them.",
    "short_label": "CANCEL SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1936-1943",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1936-L1943"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "press",
    "action": "Cancel the deletion question and stay in SAVE PRESET.",
    "short_label": "KEEP SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1936-1943",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1936-L1943"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_oct_down+button_oct_up",
    "action": "Hold all three for more than five seconds to stop audio and reset to the dark-screen ROM USB updater or a valid staged loader, with a countdown after two seconds and cancellation by releasing early.",
    "short_label": "UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "354-383",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L354-L383"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/hal/fm1_sys.h",
      "lines": "191-200",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/hal/fm1_sys.h#L191-L200"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub_core.h",
      "lines": "248-276",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub.c",
      "lines": "302-312",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L302-L312"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "sound_pages",
    "gesture": "press",
    "action": "Advance through VCF, VCF 2, DCO, DCO 2, ENV, LFO, ARP, FX, TAPE and SEQ.",
    "short_label": "NEXT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1977-1982",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1977-L1982"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "36-47",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L36-L47"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "press",
    "action": "Start timing the press for NOTE OPTIONS or SEQ OPTIONS.",
    "short_label": "TIME EDIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1961",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1961"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "release",
    "action": "Open NOTE OPTIONS when released before 0.5 seconds.",
    "short_label": "NOTE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1997-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "long_press",
    "action": "Open SEQ OPTIONS after 0.5 seconds and keep it open on release.",
    "short_label": "SEQ MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1997-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "press",
    "action": "Attempt to close the menu, although the retained press timer can reopen SEQ OPTIONS immediately.",
    "short_label": "MENU RETRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1961",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1961"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1997-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "release",
    "action": "Open NOTE OPTIONS if neither menu remains open and the held flag is clear.",
    "short_label": "NOTE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2006-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2006-L2018"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "press",
    "action": "Attempt to close the menu, although the retained press timer can reopen SEQ OPTIONS immediately.",
    "short_label": "MENU RETRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1961",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1961"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1997-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "release",
    "action": "Open NOTE OPTIONS if neither menu remains open and the held flag is clear.",
    "short_label": "NOTE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2006-2018",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2006-L2018"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "sound_pages",
    "gesture": "press",
    "action": "Open the ADSR page.",
    "short_label": "ENVELOPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1983-1988",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1983-L1988"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "press",
    "action": "Toggle slide on the cursor step, or the playing step when REC is armed.",
    "short_label": "SLIDE FLAG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1970-1974",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1970-L1974"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "555-562",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L555-L562"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "286-292",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "press",
    "action": "Select the next menu row.",
    "short_label": "NEXT ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1970-1974",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1970-L1974"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "press",
    "action": "Select the next menu row.",
    "short_label": "NEXT ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1970-1974",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1970-L1974"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "sound_pages",
    "gesture": "press",
    "action": "Open the LFO page.",
    "short_label": "LFO PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1989-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1989-L1994"
     }
    ]
   },
   {
    "mode": "seq",
    "gesture": "press",
    "action": "Does nothing on SEQ, including its menus.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1989-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1989-L1994"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Open OPTIONS with MIDI SETUP selected.",
    "short_label": "OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1911-1920",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1911-L1920"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Return to the instrument without committing an unfinished SAVE PRESET edit.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1911-1920",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1911-L1920"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Return to the instrument without committing an unfinished SAVE PRESET edit.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1911-1920",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1911-L1920"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Return to the instrument without committing an unfinished SAVE PRESET edit.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1911-1920",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1911-L1920"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "sound_pages",
    "gesture": "press",
    "action": "Toggle the amplifier between envelope and gate response.",
    "short_label": "VCA MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2049-2052",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2049-L2052"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "press",
    "action": "Toggle VCA mode and start timing a note deletion or pattern clear.",
    "short_label": "CLEAR TIMER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1964-1968",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1964-L1968"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2049-2088",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2049-L2088"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "release",
    "action": "On release before 0.5 seconds remove the cursor pitch, or clear that step’s notes, flags and locks if the pitch is absent, immediately in memory without confirmation or undo.",
    "short_label": "DELETE CELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2041-2046",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2041-L2046"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "475-496",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L475-L496"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "long_press",
    "action": "After 0.5 seconds clear all 1,024 steps and their locks immediately in memory without asking or providing undo, while keeping pattern length, tempo and other track settings.",
    "short_label": "CLEAR SEQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2019-2039",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2019-L2039"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "16-54",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L16-L54"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "press",
    "action": "Select the previous row and toggle VCA mode.",
    "short_label": "ROW AND VCA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1964-1968",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1964-L1968"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2049-2088",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2049-L2088"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "press",
    "action": "Select the previous row and toggle VCA mode.",
    "short_label": "ROW AND VCA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1964-1968",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1964-L1968"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2049-2088",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2049-L2088"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Open MIDI SETUP when selected, leaving ABOUT on the same screen.",
    "short_label": "OPEN MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2076-2081",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2076-L2081"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Return to OPTIONS.",
    "short_label": "BACK MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2082-2084",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2082-L2084"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Ask to delete the selected occupied user slot, leaving an empty slot alone.",
    "short_label": "ASK DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2053-2058",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2053-L2058"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "press",
    "action": "Empty the selected user slot immediately in memory with no undo, keeping its old flash copy because Beta4 rejects the bank write and writing settings immediately only if that slot is current.",
    "short_label": "DELETE SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2060-2073",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2060-L2073"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "105-127",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L105-L127"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Open ARPEGGIATOR without toggling the arpeggio.",
    "short_label": "ARP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2095",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2095"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Open the sequence page.",
    "short_label": "SEQUENCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2096-2100",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2096-L2100"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Start the sequence from its beginning or stop it immediately, releasing sequence notes and sending MIDI transport when SYNC is MASTER.",
    "short_label": "PLAY STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2102-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2102-L2104"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "352-387",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L352-L387"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "seq",
    "gesture": "press",
    "action": "Toggle note recording on SEQ and sound-change recording across the instrument without writing flash.",
    "short_label": "RECORD ARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1963",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1963"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "408-429",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L408-L429"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1893"
     }
    ]
   },
   {
    "mode": "sound_pages",
    "gesture": "press",
    "action": "Does nothing here, leaving an existing record arm unchanged.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1963",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1963"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1922-1928",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1928"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1954-1994",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1954-L1994"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2090-2104",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2104"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Shift future panel notes one octave down, stopping at two octaves from the centre without saving that change by itself.",
    "short_label": "OCTAVE DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1900-1904",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1900-L1904"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Shift future panel notes one octave up, stopping at two octaves from the centre without saving that change by itself.",
    "short_label": "OCTAVE UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1905-1909",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1905-L1909"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2747-2757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "boot_rescue",
    "gesture": "power_on_holding:button_oct_down",
    "action": "With OCT- held and OCT+ released, skip the instrument and enter the ROM USB updater after one long blink, or run a valid staged loader after three short blinks, without saving or resetting the stored settings or user bank.",
    "short_label": "BOOT UPDATER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub_core.h",
      "lines": "227-229",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L227-L229"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub_core.h",
      "lines": "248-276",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/stub/stub.c",
      "lines": "264-312",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L264-L312"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "normal",
    "gesture": "press",
    "action": "Start timing SAVE without writing anything yet.",
    "short_label": "TIME SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2132-2135",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2132-L2135"
     }
    ]
   },
   {
    "mode": "normal",
    "gesture": "release",
    "action": "Released before 0.5 seconds, copy a factory sound into the first blank user slot or replace the current user sound in memory and write settings at once without asking or offering undo, except that a full user bank blocks the factory copy, while Beta4 never stores the user bank in flash so the edited sound is lost at power-off unless exported.",
    "short_label": "COPY/UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2148-2153",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2148-L2153"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1616-1646",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1616-L1646"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "197-254",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1647-1658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1647-L1658"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2138-2146",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2146"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "81-82",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L81-L82"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "6-7",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L6-L7"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "11-16",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L11-L16"
     }
    ]
   },
   {
    "mode": "normal",
    "gesture": "long_press",
    "action": "After 0.5 seconds open SAVE PRESET at the current user slot or the first blank slot, falling back to UA11 when a factory sound is selected and the user bank is full.",
    "short_label": "NAME SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2138-2146",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2146"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1574-1614",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1574-L1614"
     }
    ]
   },
   {
    "mode": "factory_sound",
    "gesture": "release",
    "action": "On release before 0.5 seconds copy the sound into the first blank user slot and write settings immediately without confirmation or undo, while Beta4 refuses the bank write despite its saved message and changes nothing if all user slots are full.",
    "short_label": "COPY FACTORY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2148-2153",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2148-L2153"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1616-1646",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1616-L1646"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "197-254",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2138-2146",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2146"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "81-82",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L81-L82"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "6-7",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L6-L7"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "11-16",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L11-L16"
     }
    ]
   },
   {
    "mode": "user_sound",
    "gesture": "release",
    "action": "On release before 0.5 seconds replace the current user sound in memory and write settings immediately without confirmation or undo, while Beta4 refuses the bank write despite its saved message.",
    "short_label": "UPDATE USER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2148-2153",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2148-L2153"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1647-1658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1647-L1658"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "197-254",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2138-2146",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2146"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "81-82",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L81-L82"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "6-7",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L6-L7"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "11-16",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L11-L16"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "press",
    "action": "Replace the chosen user sound and name in memory and write settings immediately without another question or undo, while Beta4 refuses the bank write despite its saved message.",
    "short_label": "COMMIT NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2105-2131",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2105-L2131"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "197-254",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "press",
    "action": "Commit the named sound to the selected user slot instead of deleting it and write settings immediately without another question or undo, while Beta4 refuses the bank write.",
    "short_label": "SAVE INSTEAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2105-2131",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2105-L2131"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "78-92",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_presets.h",
      "lines": "6-12",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "193-203",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2105-2153",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2105-L2153"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "press",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2105-2153",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2105-L2153"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "normal",
    "gesture": "turn",
    "action": "Choose among the ten instrument pages when no SEQ menu is open.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2218-2224",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2218-L2224"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "36-47",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L36-L47"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "turn",
    "action": "Choose one of the six pattern option rows.",
    "short_label": "PATTERN ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2187-2192",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2187-L2192"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "turn",
    "action": "Choose ratchet, tie, accent or slide.",
    "short_label": "NOTE ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2193-2198",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2193-L2198"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Choose any of the 128 user destinations and cancel a pending deletion question without writing anything.",
    "short_label": "SAVE SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2199-2205",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2199-L2205"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Choose MIDI SETUP or ABOUT.",
    "short_label": "MENU ITEM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2206-2211",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2206-L2211"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Choose MIDI IN, MIDI OUT, SYNC, LOCAL or PC IN.",
    "short_label": "MIDI ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2212-2217",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2212-L2217"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "normal",
    "gesture": "turn",
    "action": "Load a sound within the current 64-slot bank and send its program change, wrapping through empty user slots as well and replacing unsaved sound edits without asking.",
    "short_label": "PATCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1558-1567",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1558-L1567"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2173-2180",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2173-L2180"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_sysex.h",
      "lines": "96-127",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L96-L127"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Cycle the selected name character through spaces, letters, digits and punctuation without committing it.",
    "short_label": "NAME LETTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2158-2172",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2158-L2172"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "756-757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L756-L757"
     }
    ]
   },
   {
    "mode": "delete_confirm",
    "gesture": "turn",
    "action": "Cycle the selected name character through spaces, letters, digits and punctuation without committing it.",
    "short_label": "NAME LETTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2158-2172",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2158-L2172"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "756-757",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L756-L757"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2158-2182",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2158-L2182"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2158-2182",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2158-L2182"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "vcf",
    "gesture": "turn",
    "action": "Change filter cutoff, within 0–127.",
    "short_label": "CUTOFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2298",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2298"
     }
    ]
   },
   {
    "mode": "vcf2",
    "gesture": "turn",
    "action": "Change how strongly note pitch moves the filter, within 0–127.",
    "short_label": "KEY TRACKING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2304",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2304"
     }
    ]
   },
   {
    "mode": "dco",
    "gesture": "turn",
    "action": "Cycle the oscillator through 16-foot, 8-foot and 4-foot ranges.",
    "short_label": "RANGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2310-2319",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2310-L2319"
     }
    ]
   },
   {
    "mode": "dco2",
    "gesture": "turn",
    "action": "Change sub level within 0–127, disabling it at zero and enabling it above zero.",
    "short_label": "SUB LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2342-2349",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2342-L2349"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "action": "Change envelope attack, within 0–127.",
    "short_label": "ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2359",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2359"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Change LFO speed, within 0–127.",
    "short_label": "LFO RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2367",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2367"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Enable the arpeggio clockwise or disable it counterclockwise.",
    "short_label": "ARP ENABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2372",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2372"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Cycle chorus OFF, I, II and I+II.",
    "short_label": "CHORUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2383-2388",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2383-L2388"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Switch tape colour on or off.",
    "short_label": "TAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2400-2405",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2400-L2405"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "turn",
    "action": "Move the edit cursor one step and scroll the grid to follow, wrapping at the pattern ends.",
    "short_label": "STEP CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "589-613",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L589-L613"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2418",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2418"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "286-292",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "vcf",
    "gesture": "turn",
    "action": "Change filter resonance, within 0–127.",
    "short_label": "RESONANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2299",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2299"
     }
    ]
   },
   {
    "mode": "vcf2",
    "gesture": "turn",
    "action": "Set inverted filter-envelope modulation clockwise or normal modulation counterclockwise.",
    "short_label": "ENV POLARITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2305",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2305"
     }
    ]
   },
   {
    "mode": "dco",
    "gesture": "turn",
    "action": "Set the pulse wave on clockwise or off counterclockwise.",
    "short_label": "PULSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2320-2324",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2320-L2324"
     }
    ]
   },
   {
    "mode": "dco2",
    "gesture": "turn",
    "action": "Change noise level, within 0–127.",
    "short_label": "NOISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2350-2354",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2350-L2354"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "action": "Change envelope decay, within 0–127.",
    "short_label": "DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2360",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2360"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Change the LFO onset delay, within 0–127.",
    "short_label": "LFO DELAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2368",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2368"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Cycle ascending, up-and-down and descending arpeggios.",
    "short_label": "DIRECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2373-2378",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2373-L2378"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Cycle high-pass modes BST, FLT, 236 and 754.",
    "short_label": "HIGH PASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2389-2394",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2389-L2394"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Change the tape effect blend, within 0–127.",
    "short_label": "TAPE MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2406",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2406"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "turn",
    "action": "Move the edit row one semitone within MIDI notes 1–127 and scroll vertically to follow.",
    "short_label": "PITCH ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "499-510",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L499-L510"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2418",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2418"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "286-292",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "vcf",
    "gesture": "turn",
    "action": "Change envelope modulation of the filter, within 0–127.",
    "short_label": "FILTER ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2300",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2300"
     }
    ]
   },
   {
    "mode": "vcf2",
    "gesture": "turn",
    "action": "Change pitch-wheel depth for oscillator pitch, within 0–127.",
    "short_label": "PITCH BEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2306",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2306"
     }
    ]
   },
   {
    "mode": "dco",
    "gesture": "turn",
    "action": "Set the saw wave on clockwise or off counterclockwise.",
    "short_label": "SAW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2325-2329",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2325-L2329"
     }
    ]
   },
   {
    "mode": "dco2",
    "gesture": "turn",
    "action": "Change pulse width or its LFO modulation depth according to PWM MD, within 0–127.",
    "short_label": "PULSE WIDTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2355",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2355"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "action": "Change envelope sustain, within 0–127.",
    "short_label": "SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2361",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2361"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Set fixed pulse width clockwise or LFO-driven pulse width counterclockwise.",
    "short_label": "PWM SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2369",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2369"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Change the arpeggio’s own speed, within 0–127.",
    "short_label": "ARP RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2379",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2379"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Set gate response clockwise or envelope response counterclockwise.",
    "short_label": "VCA RESPONSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2395",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2395"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Change tape movement, within 0–127.",
    "short_label": "TAPE RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2407",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2407"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "turn",
    "action": "Change the whole edit step’s gate by eight within 1–255, targeting the playing step when REC is armed and playback runs.",
    "short_label": "STEP GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "512-523",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L512-L523"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2418",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2418"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "286-292",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "vcf",
    "gesture": "turn",
    "action": "Change LFO modulation of the filter, within 0–127.",
    "short_label": "FILTER LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2301",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2301"
     }
    ]
   },
   {
    "mode": "vcf2",
    "gesture": "turn",
    "action": "Change pitch-wheel depth for the filter, within 0–127.",
    "short_label": "FILTER BEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2307",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2307"
     }
    ]
   },
   {
    "mode": "dco",
    "gesture": "turn",
    "action": "Set the sub oscillator on clockwise or off counterclockwise, raising a zero sub level to 64 when enabled.",
    "short_label": "SUB SWITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2330-2339",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2330-L2339"
     }
    ]
   },
   {
    "mode": "dco2",
    "gesture": "turn",
    "action": "Change LFO depth for oscillator pitch, within 0–127.",
    "short_label": "PITCH LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2356",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2356"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "action": "Change envelope release, within 0–127.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2362",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2362"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Does nothing on the LFO page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2366-2370",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2366-L2370"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Change the arpeggio span from one to three octaves without wrapping.",
    "short_label": "OCTAVE SPAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2380",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2380"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Change patch volume, within 0–127.",
    "short_label": "SOUND LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2396",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2396"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Change tape character and saturation, within 0–127.",
    "short_label": "TAPE COLOUR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2408",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2408"
     }
    ]
   },
   {
    "mode": "seq_roll",
    "gesture": "turn",
    "action": "Change the whole edit step’s velocity by four or add the selected pitch at velocity 68 clockwise or 92 counterclockwise, removing that pitch at zero and targeting the playing step during armed playback.",
    "short_label": "VELOCITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "525-553",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L525-L553"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2418",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2418"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "286-292",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
     }
    ]
   },
   {
    "mode": "seq_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "note_options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "options",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "midi",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   },
   {
    "mode": "save",
    "gesture": "turn",
    "action": "Does nothing while this menu is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2294-2296",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2294-L2296"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2411-2423",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2411-L2423"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Change the audio jack’s volume without saving a setting or changing the USB recording level.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "301-310",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L301-L310"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/platform.c",
      "lines": "387-392",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L387-L392"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 53 plus the octave shift at velocity 100.",
    "short_label": "F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F#3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 54 plus the octave shift at velocity 100.",
    "short_label": "F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F#3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F#3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F#3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F#3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound G3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 55 plus the octave shift at velocity 100.",
    "short_label": "G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this G3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this G3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this G3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked G3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound G#3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 56 plus the octave shift at velocity 100.",
    "short_label": "G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this G#3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this G#3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this G#3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked G#3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound A3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 57 plus the octave shift at velocity 100.",
    "short_label": "A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this A3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this A3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this A3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked A3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound A#3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 58 plus the octave shift at velocity 100.",
    "short_label": "A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this A#3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this A#3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this A#3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked A#3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound B3 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 59 plus the octave shift at velocity 100.",
    "short_label": "B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this B3 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this B3 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this B3 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked B3 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound C4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 60 plus the octave shift at velocity 100.",
    "short_label": "C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this C4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this C4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this C4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked C4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound C#4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 61 plus the octave shift at velocity 100.",
    "short_label": "C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this C#4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this C#4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this C#4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked C#4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound D4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 62 plus the octave shift at velocity 100.",
    "short_label": "D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this D4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this D4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this D4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked D4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound D#4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 63 plus the octave shift at velocity 100.",
    "short_label": "D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this D#4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this D#4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this D#4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked D#4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound E4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 64 plus the octave shift at velocity 100.",
    "short_label": "E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this E4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this E4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this E4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked E4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 65 plus the octave shift at velocity 100.",
    "short_label": "F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F#4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 66 plus the octave shift at velocity 100.",
    "short_label": "F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F#4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F#4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F#4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F#4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound G4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 67 plus the octave shift at velocity 100.",
    "short_label": "G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this G4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this G4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this G4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked G4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound G#4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 68 plus the octave shift at velocity 100.",
    "short_label": "G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this G#4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this G#4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this G#4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked G#4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound A4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 69 plus the octave shift at velocity 100.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this A4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this A4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this A4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked A4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound A#4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 70 plus the octave shift at velocity 100.",
    "short_label": "A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this A#4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this A#4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this A#4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked A#4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound B4 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 71 plus the octave shift at velocity 100.",
    "short_label": "B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this B4 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this B4 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this B4 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked B4 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound C5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 72 plus the octave shift at velocity 100.",
    "short_label": "C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this C5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this C5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this C5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked C5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound C#5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 73 plus the octave shift at velocity 100.",
    "short_label": "C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this C#5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this C#5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this C#5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked C#5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound D5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 74 plus the octave shift at velocity 100.",
    "short_label": "D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this D5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this D5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this D5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked D5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound D#5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 75 plus the octave shift at velocity 100.",
    "short_label": "D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this D#5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this D#5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this D#5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked D#5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound E5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 76 plus the octave shift at velocity 100.",
    "short_label": "E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this E5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this E5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this E5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked E5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 77 plus the octave shift at velocity 100.",
    "short_label": "F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound F#5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 78 plus the octave shift at velocity 100.",
    "short_label": "F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this F#5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this F#5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this F#5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked F#5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sound G5 at the selected octave or feed the enabled arpeggio when LOCAL is on, and send MIDI note 79 plus the octave shift at velocity 100.",
    "short_label": "G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1842",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1842"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "797-823",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L797-L823"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Send the note-off for this G5 key’s remembered pitch and release it locally if LOCAL is on, allowing release tails or sustain to continue.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_engine.h",
      "lines": "825-846",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L825-L846"
     }
    ]
   },
   {
    "mode": "seq_stopped",
    "gesture": "press",
    "action": "Also toggle this G5 key’s shifted pitch in the cursor step’s four-note chord and advance one step, without a question, flash write or undo.",
    "short_label": "STEP PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "672-675",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L672-L675"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "448-473",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L448-L473"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "press",
    "action": "Also record this G5 key’s shifted pitch and stamp the whole current sound over that step’s existing sound locks without a question, flash write or undo, advancing after each press when stopped so a chord spreads across steps, or targeting the playing step while running and rounding its final quarter forward.",
    "short_label": "RECORD PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "618-671",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L618-L671"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1879-1887",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1879-L1887"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106_seq.h",
      "lines": "203-218",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L203-L218"
     }
    ]
   },
   {
    "mode": "seq_record",
    "gesture": "release",
    "action": "Also stamp the tracked G5 note’s held duration into its recorded step’s shared gate and add ties through following empty steps while REC remains armed, without confirmation, flash writing or undo.",
    "short_label": "RECORD GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "683-733",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L733"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1889-1893",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1889-L1893"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_fx": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light when chorus or tape is enabled, regardless of the page and tape mix.",
    "short_label": "EFFECTS ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2652-2653",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2652-L2653"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Have no brighter page or function indicator beyond the faint backlight.",
    "short_label": "NO STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650-2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light while SAVE PRESET or its delete question is open.",
    "short_label": "SAVE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2657",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2657"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light while the arpeggio is enabled.",
    "short_label": "ARP ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2654",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2654"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light while the sequence runs, rather than when its page is open.",
    "short_label": "SEQ PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2655",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2655"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light while the sequence runs.",
    "short_label": "RUNNING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2656",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2656"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light while note and sound-change recording is armed.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2658",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2658"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light below the centre octave.",
    "short_label": "LOWER OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2650",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glow faintly so the panel labels remain visible when this button has no brighter status.",
    "short_label": "BACKLIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1833-1838",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1833-L1838"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light above the centre octave.",
    "short_label": "UPPER OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2651",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2651"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Light pitches within the current keyboard octave window while their synth voices have a gate or release tail, including sequence and MIDI voices.",
    "short_label": "VOICE NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2634-2649",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2634-L2649"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "Stay dark for pitches without an active synth voice, even if a LOCAL-off key is physically held.",
    "short_label": "NO VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "1881-1883",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1881-L1883"
     },
     {
      "kind": "source",
      "repo": "PatttF/fm-106",
      "ref": "Beta4",
      "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
      "path": "firmware/src/fm106.c",
      "lines": "2634-2649",
      "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2634-L2649"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_f3",
   "led_fs3",
   "led_g3",
   "led_gs3",
   "led_a3",
   "led_as3",
   "led_b3",
   "led_c4",
   "led_cs4",
   "led_d4",
   "led_ds4",
   "led_e4",
   "led_f4",
   "led_fs4",
   "led_g4",
   "led_gs4",
   "led_a4",
   "led_as4",
   "led_b4",
   "led_c5",
   "led_cs5",
   "led_d5",
   "led_ds5",
   "led_e5",
   "led_f5",
   "led_fs5",
   "led_g5"
  ]
 },
 "switching_note": {
  "kept_on_unit": "One settings record keeps the last written octave, preset selection and MIDI preferences; 128 factory sounds are part of the firmware, and Beta4 can read valid older user-bank records or convert its legacy bank in memory. From the flash atlas: install using the package’s own loader: After checking the chip key and whole package CRC, erase/program unequal app sectors and verify them. Flash head is not written; no settings or preset initialization here (Valid package and normal loader completion). installation loader completion: Scan the final 256-byte position of each sector (read 80 bytes) for an update-record signature 0x5441 and nonzero CRC-16 matching bytes 2..79; erase only each sector that passes. Explicitly skip 0x97000-0xDFFFF (Record signature and CRC both pass; completion follows app write). normal startup, including first startup: Read 4 bytes at staging start and 8 bytes at 0xE4F00; if any differ from erased 0xFF, erase all five staging sectors. This can destroy a foreign record such as the X0X restore journal. No question or magic check (Any inspected staging byte is not 0xFF. Rescue startup branches before cleanup and does not run it). normal startup settings and user-bank load: Read settings and user presets; invalid records produce RAM defaults. No settings or bank initialization save occurs at boot, and legacy bank conversion stays in RAM (Every normal boot after staging cleanup). deliberately accept an incoming update package while FM-106 runs: Recognize official or own loader, require exact existing head match for official loader, erase five staging sectors, stage/verify loader and write its head, then write/verify a 112-byte update record at 0xE4F00 after host confirmation and restart. Failure/dry run unstages by erasing the five sectors. This is update staging, not preset backup (Updater invoked, recognized package, host confirmation; own firmware loader later writes app only. Official loader whole-image behavior is stated in comments but official source is not present). boot updater entry by OCT- at power-on or runtime rescue request: The boot stub writes only retained RAM while choosing the ROM USB updater or an already valid staged loader; it does not write settings or user data. A handed-off loader may subsequently install firmware; ROM write ranges are not established here (Rescue key or RAM rescue request; valid staged loader is tried first unless an earlier rescue attempt already failed). What FM-106 writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over FM-106's is in when_you_leave.",
  "lost": "Beta4’s panel save, delete and librarian bank commit change user presets in memory but fail to store the bank, even when they report success; sequences and sound locks have no complete save or export here. From the flash atlas: No other firmware reads FM-106's data, and FM-106 reads none of theirs.",
  "back_up_first": "Before powering off or switching, open the librarian linked by the guide, use Read All to fetch both user banks into its browser library, check the replies and export User A and User B as separate bank .syx files; these preserve names and classic sound controls only, so record extended values, MIDI settings and the sequence separately.",
  "backup_limits": "Exports use the browser library without reading the unit and omit sequence notes, locks, MIDI preferences, octave, bend depths, arpeggio settings and tape controls, reduce chorus I+II to I and can assign names to empty slots; full-library JSON imports start at a user-bank offset, and Read All excludes unsaved live sound edits.",
  "restore": "A bank .syx import immediately replaces the supplied browser slots without a question or undo, although the old editor can put back the previously selected user slot; Send Bank and Send All ask before replacing 64 or 128 unit slots in memory, while the Burn dialog’s bank and all choices send those slots without another question before attempting the rejected flash commit, including browser slots absent from the imported file.",
  "own_writes": "MIDI-menu edits save settings automatically once more than one second has passed and all keys and synth voices are quiet; incoming MIDI sync changes can also trigger that save, while panel save writes settings immediately and deleting the current user slot does too; these replace the settings record without undo, and normal startup may erase leftover update staging by itself. Every settings save erases the shared settings sector. Back up before switching; see the switching advice in this section for the affected saved work.",
  "going_back": "Beta4’s failed bank writes leave any pre-existing legacy bank untouched, so returning to a version that reads it can recover that older bank, not recent memory edits; each older version’s reader has not been checked here, and another firmware can overwrite it, so export first.",
  "atlas_status": "Back up in the firmware you are leaving first; see the switching advice in this section for risks at installation, startup and during use.",
  "source": [
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "42-92",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L42-L92"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "197-254",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "256-280",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L256-L280"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "353-410",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L353-L410"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "413-485",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L413-L485"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/platform.c",
    "lines": "80-85",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L80-L85"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/platform.c",
    "lines": "163-203",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L163-L203"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "1616-1658",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1616-L1658"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2053-2073",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2053-L2073"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2105-2131",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2105-L2131"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2254-2284",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2284"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2590-2594",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2590-L2594"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2747-2757",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/ota.c",
    "lines": "391-405",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/ota.c#L391-L405"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "1781-1792",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1781-L1792"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "1943-1982",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1943-L1982"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2293-2379",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2293-L2379"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2710-2786",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2710-L2786"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2823-2860",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2823-L2860"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2103-2248",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2103-L2248"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2383-2421",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2383-L2421"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2901-2912",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2901-L2912"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "1746-1779",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1746-L1779"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/platform.c",
    "lines": "80",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L80"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/platform.c",
    "lines": "174-186",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L186"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "42-92",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L42-L92"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/platform.c",
    "lines": "193-203",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
   }
  ],
  "shared_settings_overlap": {
   "evidence": "inferred",
   "why": "The Beta4 erase address is read in source; the overlapping writer locations come from flash-atlas/atlas.json, not hardware testing.",
   "writer_objects": [
    "felucca.settings",
    "sloop.settings",
    "x0x.settings",
    "jiant.settings",
    "melodee.settings",
    "fomni.project"
   ],
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "80",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L80"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "174-186",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L174-L186"
    }
   ]
  },
  "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, button calibration, favourites, MIDI LEARN map.",
    "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "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 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: the whole X0X project (settings, sound, all 32 patterns, song, knob motion).",
    "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, favourites, MENU options.",
    "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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: FoMni setup (pages, chord buttons, lights).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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)"
   },
   {
    "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 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: 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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if the update staging probes contain a nonblank byte",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you start a firmware update from FM-106 (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106 (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings 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 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"
       }
      ]
     },
     {
      "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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you release a short 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": "AS",
    "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 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: Polly setup and channel sounds.",
    "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 confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration and favourites.",
    "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": [
     "older stored user bank, if present (Beta4 does not store new edits)"
    ],
    "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": "Possibly at risk (layout reported or inferred): older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "older stored user bank, if present (Beta4 does not store new edits)"
    ],
    "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": "Possibly at risk (layout reported or inferred): older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "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": "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": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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"
       }
      ]
     }
    ],
    "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: older stored user bank, if present (Beta4 does not store new edits); 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)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": "older stored user bank, if present (Beta4 does not store new edits)",
      "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": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk by itself, under a condition: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "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)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "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)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "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": "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": "older stored user bank, if present (Beta4 does not store new edits)",
      "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": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "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 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": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": [
     "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: older stored user bank, if present (Beta4 does not store new edits). At risk when you act: 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)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "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 calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "obervave",
    "name": "OberVave",
    "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 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": [
     "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)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": [],
    "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: older stored user bank, if present (Beta4 does not store new edits); 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)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk by itself, under a condition: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "README page and button list",
   "docs_say": "The README lists four edit pages, says HOME cycles pages, FX cycles chorus and ARP toggles the arpeggio.",
   "source_says": "Beta4 has ten pages; HOME returns to VCF, FX opens chorus or tape, and ARP opens its page without toggling it.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "README.md",
    "lines": "38-50",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/README.md#L38-L50"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "36-47",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L36-L47"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "36-47",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L36-L47"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1922-1951",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1922-L1951"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2090-2095",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2095"
    }
   ]
  },
  {
   "topic": "SAVE timing",
   "docs_say": "The guide calls SAVE a save-menu button.",
   "source_says": "A release before 0.5 seconds performs quick save; a 0.5-second hold opens the destination and name screen.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "169",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L169"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2138-2153",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2153"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2138-2153",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2138-L2153"
    }
   ]
  },
  {
   "topic": "User-bank persistence",
   "docs_say": "The librarian offers a flash-bank commit and the panel displays a saved result.",
   "source_says": "The 128 records occupy 10,496 bytes, plus a 16-byte header, but the bank writer rejects anything over 8,192 bytes before erasing; callers ignore the error, so saves, deletes and bank commits change RAM only.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2103-2248",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2103-L2248"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_presets.h",
    "lines": "6-12",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_presets.h",
     "lines": "6-12",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "78-92",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "193-203",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1638-1646",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1638-L1646"
    }
   ]
  },
  {
   "topic": "Saving a sequence",
   "docs_say": "The guide says patch saves retain notes and parameter locks.",
   "source_says": "The save record holds sound and some track settings but has no notes or locks; user-preset loading also leaves the current sequence and track settings in RAM.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "434-435",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L434-L435"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_sysex.h",
    "lines": "197-254",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "197-254",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "130-193",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L130-L193"
    }
   ]
  },
  {
   "topic": "SEL has an extra effect on SEQ",
   "docs_say": "The guide describes SEL as note deletion or a whole-pattern wipe.",
   "source_says": "Every SEL press on SEQ also toggles VCA mode, including presses to navigate a SEQ menu.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "164",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L164"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "1964-1968",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1964-L1968"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1964-1968",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1964-L1968"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2049-2088",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2049-L2088"
    }
   ]
  },
  {
   "topic": "ENV and LFO on SEQ",
   "docs_say": "The guide groups ENV and LFO with page-jump buttons.",
   "source_says": "On the SEQ grid ENV toggles slide, in its menus ENV advances a row, and LFO does nothing.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "165",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L165"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "1970-1993",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1970-L1993"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1970-1993",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1970-L1993"
    }
   ]
  },
  {
   "topic": "Record scope",
   "docs_say": "The guide describes armed panel recording like armed incoming MIDI on any page.",
   "source_says": "Panel note recording is called only on SEQ; incoming MIDI note recording can run on every page, while armed sound-change locks work throughout the instrument.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "278-279",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L278-L279"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "1880-1886",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1880-L1886"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1880-1886",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1880-L1886"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2441-2446",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2441-L2446"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "408-429",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L408-L429"
    }
   ]
  },
  {
   "topic": "Lock pool",
   "docs_say": "The guide describes a 256-lock pool that replaces old entries.",
   "source_says": "The source allocates 1,024 locks and ignores a new distinct lock when all slots are occupied, while existing locks can still change.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "247-249",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L247-L249"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_seq.h",
    "lines": "36-36",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L36"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "36-36",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L36"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "196-217",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L196-L217"
    }
   ]
  },
  {
   "topic": "Step gate and velocity",
   "docs_say": "The guide calls K3 and K4 selected-note gate and velocity.",
   "source_says": "Gate and velocity are shared by all notes in a step; K4 selects which pitch to add or remove.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "219-220",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L219-L220"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "512-553",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L512-L553"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "512-553",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L512-L553"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "45-54",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L45-L54"
    }
   ]
  },
  {
   "topic": "K4 on an empty cell",
   "docs_say": "The guide says either direction starts from velocity 64.",
   "source_says": "A clockwise fill starts at 68 and a counterclockwise fill at 92.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "203-205",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L203-L205"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "526-550",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L526-L550"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "526-550",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L526-L550"
    }
   ]
  },
  {
   "topic": "Slide sound",
   "docs_say": "The guide calls SLIDE a pitch glide into the next step.",
   "source_says": "Playback keeps the old notes gated while starting the next notes; it has no gradual pitch movement.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "226",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L226"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_engine.h",
    "lines": "754-791",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_engine.h",
     "lines": "754-791",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L754-L791"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_engine.h",
     "lines": "279-365",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L279-L365"
    }
   ]
  },
  {
   "topic": "SYNC OFF",
   "docs_say": "The guide recommends SYNC OFF to prevent a DAW from controlling transport.",
   "source_says": "Incoming Start, Continue and Stop still act in every sync mode, and incoming clock can still update the displayed tempo; OFF selects internal sequence timing.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "431",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L431"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2429-2433",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2429-L2433"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2429-2433",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2429-L2433"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "248-288",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L248-L288"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_engine.h",
     "lines": "690-699",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L690-L699"
    }
   ]
  },
  {
   "topic": "Bank Select",
   "docs_say": "The guide says bank selection loads a bank’s first patch.",
   "source_says": "Bank Select keeps the current slot number inside the new bank.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "350-355",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L350-L355"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106.c",
    "lines": "2458-2464",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2458-L2464"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2458-2464",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2458-L2464"
    }
   ]
  },
  {
   "topic": "Full-library JSON import",
   "docs_say": "The browser labels its 256-record JSON export as a full-library backup.",
   "source_says": "Its importer starts the exported array at the chosen user bank instead of restoring original slots, so the exported factory records replace browser user records and exported user records are dropped.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2850-2860",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2850-L2860"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "Librarian.html",
    "lines": "2710-2745",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2710-L2745"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2710-2745",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2710-L2745"
    }
   ]
  },
  {
   "topic": "Unison claim",
   "docs_say": "The README advertises unison as a voice mode.",
   "source_says": "Beta4 allocates one voice for each note and exposes no unison setting or control.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "README.md",
    "lines": "24",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/README.md#L24"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_engine.h",
    "lines": "279-365",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L279-L365"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_engine.h",
     "lines": "279-365",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L279-L365"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "75-105",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L75-L105"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1469-1507",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1469-L1507"
    }
   ]
  },
  {
   "topic": "Triplet division names",
   "docs_say": "The guide names the two triplet divisions as quarter-note and eighth-note triplets.",
   "source_says": "The 1/3 and 1/6 beat durations are eighth-note and sixteenth-note triplets, respectively.",
   "docs_ref": {
    "kind": "doc",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "manual.html",
    "lines": "233",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L233"
   },
   "source_ref": {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/src/fm106_seq.h",
    "lines": "146-152",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L146-L152"
   },
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "108",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L108"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "142-152",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L142-L152"
    }
   ]
  }
 ],
 "not_mapped": [
  "No unit was tested or full application rebuild compared; a static decode of the local Beta4 package confirms its locked boot stub and commit marker, so this map includes the boot-stage source as well as the application.",
  "Exact held-note gate timing under external MIDI clock is not established: the release handler treats the slave clock’s division units as audio samples, so its durations should not be relied on.",
  "The separate green PLAY emitter is not individually addressed by the active application or the shared LED helper; only the mapped PLAY button status is established.",
  "ABOUT has a menu row but no screen-opening handler at Beta4; no separate ABOUT screen is claimed.",
  "Compatibility on returning to every older FM-106 release is not established without those release trees; the Beta4 loader checks and the legacy conversion are mapped."
 ],
 "owner_notes": [
  {
   "topic": "Beta4 saves",
   "text": "A saved banner is not proof that the user bank reached storage: Beta4 rejects every bank write before erasing, so export useful sounds before turning the unit off.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "78-92",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_presets.h",
     "lines": "6-12",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "193-203",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1616-1658",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1616-L1658"
    }
   ]
  },
  {
   "topic": "Sequence memory",
   "text": "The sequence’s notes, ties and sound locks stay in memory only; patch records contain some track values but the user-preset loader does not restore even those track values. Patch saving also leaves out the arpeggio’s on/off state.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "197-254",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "130-193",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L130-L193"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "197-254",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L197-L254"
    }
   ]
  },
  {
   "topic": "Patch changes",
   "text": "Choosing another preset replaces sound edits without asking, keeps the running sequence in memory and does not save the selected slot by itself.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2173-2180",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2173-L2180"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2242-2253",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2242-L2253"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "96-194",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L96-L194"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ]
  },
  {
   "topic": "Sound locks",
   "text": "With REC armed and PLAY running, changed sound controls on any page become locks on the playing step; there are 1,024 lock slots, and a new distinct lock is ignored when the pool is full.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "408-429",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L408-L429"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "36",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L36"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "196-217",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L196-L217"
    }
   ]
  },
  {
   "topic": "Edit target",
   "text": "During armed playback K3, K4, ENV and NOTE OPTIONS edit the playing step, while SEL deletion and the bottom value guides still use the cursor step.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "286-292",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L286-L292"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "475-553",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L475-L553"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "555-586",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L555-L586"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1300-1309",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1300-L1309"
    }
   ]
  },
  {
   "topic": "Close sequence menus",
   "text": "Use HOME to close a sequence menu; EDIT can reopen a menu because its old hold timer is reused.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1931-1935",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1931-L1935"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1955-1961",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1955-L1961"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1997-2018",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1997-L2018"
    }
   ]
  },
  {
   "topic": "MIDI sync",
   "text": "OFF runs the sequence on its internal clock, MASTER also sends clock and transport, and SLAVE follows incoming pulses; incoming transport still works in all three modes, and clock messages can still alter the displayed tempo.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "346-400",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L346-L400"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1858-1871",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1858-L1871"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2429-2433",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2429-L2433"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_seq.h",
     "lines": "248-288",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L248-L288"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_engine.h",
     "lines": "690-699",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_engine.h#L690-L699"
    }
   ]
  },
  {
   "topic": "Settings timing",
   "text": "Octave and preset changes alone do not schedule a save; a MIDI preference edit can save them later, while an immediate SAVE before that delayed write can still use older MIDI preferences.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1900-1909",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1900-L1909"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2173-2180",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2173-L2180"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2242-2284",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2242-L2284"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1638-1655",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1638-L1655"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2747-2757",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2747-L2757"
    }
   ]
  },
  {
   "topic": "Browser library",
   "text": "The guide and installer link to the root librarian, which keeps a separate browser library; exports use that copy, Read All fetches the unit’s user records after asking, and Send Bank or Send All asks before replacing 64 or 128 unit slots in memory without undo or a flash save.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "manual.html",
     "lines": "455",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/manual.html#L455"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "index.html",
     "lines": "86",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/index.html#L86"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "1943-1982",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1943-L1982"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2250-2379",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2250-L2379"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2823-2860",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2823-L2860"
    }
   ]
  },
  {
   "topic": "Reset browser sounds",
   "text": "Restore Defaults asks before replacing all 128 browser user slots with factory copies, without undo or sending them to the unit; Load template instead replaces the chosen 64-slot browser bank without asking, with the old selected editor able to put one slot back, while Clear Bank asks before choosing the blank template and none of these actions saves flash.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2383-2421",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2383-L2421"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "1781-1792",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1781-L1792"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2901-2912",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2901-L2912"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "3041-3056",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L3041-L3056"
    }
   ]
  },
  {
   "topic": "Reset the unit remotely",
   "text": "The hardware reset command immediately blanks all 128 user slots in memory without asking or providing undo, reloads the selected sound and attempts the same rejected bank write, leaving stored settings and sequence notes alone.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "35-38",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L35-L38"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "659-667",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L659-L667"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "96-194",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L96-L194"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "78-92",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L78-L92"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_presets.h",
     "lines": "6-12",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_presets.h#L6-L12"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "193-203",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
    }
   ]
  },
  {
   "topic": "USB and MIDI connections",
   "text": "USB carries MIDI and stereo audio to a computer; the MIDI input also accepts notes and control messages, with separate input and output channels in GLO’s MIDI settings.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "67-77",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L67-L77"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "221-237",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L221-L237"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2435-2446",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2435-L2446"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2254-2264",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2254-L2264"
    }
   ]
  },
  {
   "topic": "Recovery after failed starts",
   "text": "Two failed application starts lead to USB rescue, and a failure in rescue falls back to the ROM updater; the instrument does not run or save settings in rescue.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/bootguard.h",
     "lines": "15-30",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/bootguard.h#L15-L30"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/recovery.c",
     "lines": "56-74",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/recovery.c#L56-L74"
    }
   ]
  },
  {
   "topic": "Librarian Burn choices",
   "text": "In the Burn dialog, bank and all send 64 or 128 browser user sounds to unit memory without a further confirmation or undo, then attempt the flash commit that Beta4 rejects; Commit Synth RAM Only sends no sounds and attempts that same rejected write.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "2103-2248",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L2103-L2248"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "650-656",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L650-L656"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "193-203",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
    }
   ]
  },
  {
   "topic": "Delete a sound in the librarian",
   "text": "Delete Patch asks before blanking the selected browser user slot and, when connected, immediately sends that blank sound to the same unit slot in memory, without undo or writing flash.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "Librarian.html",
     "lines": "1746-1779",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/Librarian.html#L1746-L1779"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106_sysex.h",
     "lines": "580-600",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L580-L600"
    }
   ]
  },
  {
   "topic": "Notice limits",
   "text": "DELETED is normally invisible because deletion leaves SAVE PRESET open, and SEQ CLEARED is set on a page that does not draw banners; a saved notice also says nothing about whether Beta4 stored the user bank.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2037",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2037"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2071-2073",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2071-L2073"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "959-961",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L959-L961"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2685-2702",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2685-L2702"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/platform.c",
     "lines": "193-203",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/platform.c#L193-L203"
    }
   ]
  },
  {
   "topic": "Hidden SEQ menu",
   "text": "Leaving an open SEQ menu with FX or ARP keeps that menu active but hidden, so ALGORITHM cannot change banks on the sound page; press SEQ and then HOME to clear it before trying ALGORITHM again.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1924-1927",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1924-L1927"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2090-2094",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2090-L2094"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "2242-2253",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2242-L2253"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1931-1935",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1931-L1935"
    }
   ]
  },
  {
   "topic": "Large step-count display",
   "text": "STEPS still reaches 1,024, but its value displays as :00 through :24 for lengths 1,000–1,024; this display defect does not shorten the pattern.",
   "source": [
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1143-1147",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1143-L1147"
    },
    {
     "kind": "source",
     "repo": "PatttF/fm-106",
     "ref": "Beta4",
     "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
     "path": "firmware/src/fm106.c",
     "lines": "1177-1183",
     "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1177-L1183"
    }
   ]
  }
 ],
 "not_mapped_source": [
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/crt0.S",
   "lines": "3-6",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/crt0.S#L3-L6"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106.c",
   "lines": "683-725",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L683-L725"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106_seq.h",
   "lines": "142-151",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_seq.h#L142-L151"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106.c",
   "lines": "1449-1467",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L1449-L1467"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106.c",
   "lines": "2076-2084",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2076-L2084"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106_sysex.h",
   "lines": "42-75",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106_sysex.h#L42-L75"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/hal/fm1_input.h",
   "lines": "362-375",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/hal/fm1_input.h#L362-L375"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/src/fm106.c",
   "lines": "2650-2658",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/src/fm106.c#L2650-L2658"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/stub/stub.c",
   "lines": "264-312",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.c#L264-L312"
  },
  {
   "kind": "source",
   "repo": "PatttF/fm-106",
   "ref": "Beta4",
   "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
   "path": "firmware/stub/stub_core.h",
   "lines": "248-276",
   "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L248-L276"
  }
 ],
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "2 Stopped armed recording",
   "fixed": "Added per-press cursor advance, chord spreading and replacement of existing sound locks.",
   "at": "controls.key_*[3]; modes.seq_record; owner guide recording table"
  },
  {
   "round": 1,
   "error": "3 Linked librarian",
   "fixed": "Repointed all librarian evidence to the linked root copy and documented template loading, Burn variants, delete, imports, exports and their confirmation/write scopes.",
   "at": "docs[2]; switching_note; owner_notes[8:9] and appended librarian notes; disagreements[2,13]; storage backup and write-attempt notes; registry sources"
  },
  {
   "round": 1,
   "error": "4 Shared settings sector",
   "fixed": "Named the whole-sector erase and the six affected firmware settings/setup records, with an explicit switching-table gap and backup precaution outside the generated block.",
   "at": "switching_note.own_writes; switching_note.shared_settings_overlap; owner guide Before you switch firmware"
  },
  {
   "round": 1,
   "error": "5 Update gesture destination",
   "fixed": "Separated the runtime reset into stub/ROM or staged-loader entry from the application rescue screen.",
   "at": "modes[39]; controls.screen[31]; controls.button_home[5]; storage boot dispatch"
  },
  {
   "round": 1,
   "error": "6 Notice visibility",
   "fixed": "Limited banner drawing to sound pages, explained hidden DELETED and SEQ CLEARED notices and retained the persistence warning.",
   "at": "controls.screen[36]; appended owner note Notice limits"
  },
  {
   "round": 1,
   "error": "7 MASTER and USB audio",
   "fixed": "Clarified that MASTER scales the audio jack after the USB audio tap.",
   "at": "controls.knob_master[0]; owner guide MASTER row"
  },
  {
   "round": 1,
   "error": "1 Power-on rescue gesture",
   "fixed": "Mapped the boot stub’s OCT- interception, dark display, blink codes and conditional staged-loader route; retained application rescue only for failed starts and appended boot display context without moving entries.",
   "at": "modes[40] and appended boot_rescue; controls.switch_power[0]; controls.screen[32] and appended display entry; storage boot dispatch"
  },
  {
   "round": 1,
   "error": "8 SYNC OFF guide citation",
   "fixed": "Repointed the disputed recommendation to guide line 431.",
   "at": "disagreements[11].docs_ref"
  },
  {
   "round": 1,
   "error": "9 Unison and triplet claims",
   "fixed": "Appended disagreements for the absent unison mode and the guide’s shifted triplet labels.",
   "at": "disagreements[14:16]; owner guide disagreements"
  },
  {
   "round": 1,
   "error": "10 Missing owner notes",
   "fixed": "Added the existing USB/MIDI connection and failed-start rescue notes to the owner guide.",
   "at": "owner guide before Full panel reference; owner_notes[11:12]"
  },
  {
   "round": 1,
   "error": "11 PRESETS MIDI output",
   "fixed": "Added the outgoing program change when PRESETS loads another slot.",
   "at": "controls.encoder_presets[0]"
  },
  {
   "round": 1,
   "error": "12 EDIT release label",
   "fixed": "Renamed Menu return to Note menu to name the screen opened on release.",
   "at": "controls.button_edit[5,7].short_label"
  },
  {
   "round": 1,
   "error": "13 Hidden sequence menu state",
   "fixed": "Explained the invisible bank-switching block and the SEQ then HOME recovery gesture.",
   "at": "controls.encoder_algorithm[17]; appended owner note Hidden SEQ menu"
  },
  {
   "round": 1,
   "error": "14 Four-digit step display",
   "fixed": "Documented the incorrect :00–:24 readout for valid pattern lengths 1,000–1,024.",
   "at": "controls.screen[9]; appended owner note Large step-count display"
  },
  {
   "round": 1,
   "error": "15 Boot-stage scope",
   "fixed": "Replaced the build-selected premise with application-plus-stub coverage and recorded the independently repeated static local-package decode and its limits.",
   "at": "scope_note; scope_source; package_observation; not_mapped[0]; storage.scope/build_evidence/unknowns; owner guide footer"
  },
  {
   "round": 1,
   "error": "Coverage: arpeggio enable persistence",
   "fixed": "Added that patch records omit arpeggio enable, as well as sequence notes and locks.",
   "at": "owner_notes[1]; storage user-presets holds/short"
  },
  {
   "round": 2,
   "error": "MINOR: power-on gesture context",
   "fixed": "Moved the existing power-on gesture to boot_rescue and removed the doubled Power and running-instrument context from its guide row.",
   "at": "controls.switch_power[0].mode; owner guide power-on row"
  },
  {
   "round": 2,
   "error": "Optional: boot display qualification",
   "fixed": "Replaced the continuous-darkness claim with the source-proven rail timing and absence of the application rescue image; sampling visibility remains untested.",
   "at": "modes[44].what_it_is; controls.screen[37]; controls.switch_power[0].action; owner guide boot paragraph"
  },
  {
   "round": "overlay-1",
   "error": "FM-106 overlay error 2: timer press used as SAVE label",
   "fixed": "Inserted one normal-mode quick-tap release entry after button_save[0], labelled COPY/UPDATE, covering both memory-edit cases, immediate unasked settings writes, full-bank refusal and loss at power-off because Beta4 does not store the user bank.",
   "at": "controls.button_save[1]; matching owner-guide SAVE release row"
  },
  {
   "round": "overlay-2",
   "error": "FM-106 MINOR 1: quick SAVE citation gaps",
   "fixed": "Appended direct Beta4 evidence for the 500 ms hold threshold, both 8 KiB bank-cap definitions and the four-word 16-byte bank header; existing citations establish record count, record size and rejection before erase, overriding the stale 7,680-byte comment.",
   "at": "controls.button_save[1,3,4].source"
  }
 ],
 "package_observation": {
  "path": "fm106.fwsc",
  "sha256": "2339bd6438ed23fa95bb1f60b1ff888c9fe2861e28608ce5de904aad1e288baf",
  "method": "Static in-memory decode of the local package, using its format as read from tools/fm1pkg_make.py; no firmware or source tool was executed.",
  "stub_bytes": 3808,
  "stub_sha256": "baee55ed142fe1cc336099902fa544d8844ba72182abf669f15cc78fc6bee87c",
  "stub_lock_match": true,
  "commit_marker": "CRBM at decoded flash 0x91FE0",
  "limits": "This confirms the local package’s locked boot stub and marker, not a full rebuilt application comparison or what the hub serves.",
  "source": [
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/stub/stub.lock",
    "lines": "1",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub.lock#L1"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "tools/fm1pkg_make.py",
    "lines": "53-71",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/tools/fm1pkg_make.py#L53-L71"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "tools/fm1pkg_make.py",
    "lines": "101-189",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/tools/fm1pkg_make.py#L101-L189"
   },
   {
    "kind": "source",
    "repo": "PatttF/fm-106",
    "ref": "Beta4",
    "commit": "d129b4372cf944101f3e7ba8169267c936ca0620",
    "path": "firmware/stub/stub_core.h",
    "lines": "42-49",
    "url": "https://github.com/PatttF/fm-106/blob/d129b4372cf944101f3e7ba8169267c936ca0620/firmware/stub/stub_core.h#L42-L49"
   }
  ]
 },
 "checker_disputes_refresh": []
}