{
 "firmware": "FoMni",
 "slug": "fomni",
 "author": "Charles Vestal",
 "repo": "https://github.com/charlesvestal/fm1-fomni",
 "licence": "GPL-3.0-only (rhythms and sounds from Chordian, CC0)",
 "closed_source": false,
 "mapped_release": "v0.4",
 "mapped_commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-16",
 "turns_it_into": "An Omnichord-style chord harp: the white keys are a strum plate, the black keys chord buttons, with ten rhythms and auto bass. Optional USB text output supports a computer screen reader.",
 "docs": [
  {
   "title": "FoMni for the M-VAVE FM-1",
   "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/README.md",
   "words": 849,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated tokens in the Markdown source."
  },
  {
   "title": "FoMni-1 in the browser",
   "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/emu/index.html",
   "words": 307,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated HTML text, including the title; scripts and styles excluded.",
   "live_url": "https://charlesvestal.github.io/fm1-fomni/emu/"
  },
  {
   "title": "Building FoMni",
   "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/BUILDING.md",
   "words": 465,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated tokens in the Markdown source."
  }
 ],
 "install": {
  "hub": "https://thefirmwarehub.com/",
  "official": "https://github.com/charlesvestal/fm1-fomni/releases/tag/v0.4",
  "official_installer": "https://charlesvestal.github.io/fm1-fomni/install/"
 },
 "part_id_notes": "FoMni names the button between FX and ENV SEL, as printed. Buttons act when let go, except PLAY (on the press). Reconciled to the drawing's part ids (output/tutorials/_panels/m-vave-fm1, branch fm1/panel 4027d71) on 2026-10-13 by the lead session: the drawing has no separate button lamps, so what a button's light shows moved from led_<button> to lights.button_<button> (led_play_stop_green to lights.button_play_stop with light='green'); led_key_<note> became lights.led_<note>; led_keys_all became lights.key_lights, with groups.key_lights listing the 27 key-light parts; jack_usb_c became jack_usb. Originals: _before-reconcile/. In v0.4, jack_usb also carries the screen-reader text; this adds no page or panel mode.",
 "modes": [
  {
   "id": "play",
   "name": "Play page",
   "how_to_get_there": "Press HOME.",
   "what_it_is": "The chord (big), its notes, the strings ringing; KNOB 1-4 voice 1, voice 2, sustain, chord level.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "13",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "17-23",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "292",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L292"
    }
   ]
  },
  {
   "id": "rhythm",
   "name": "Rhythm page",
   "how_to_get_there": "Press SEQ.",
   "what_it_is": "The rhythm pattern; KNOB 1-4 rhythm, tempo, drums level, auto bass.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "13",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "17-23",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "293",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L293"
    }
   ]
  },
  {
   "id": "sound",
   "name": "Sound page",
   "how_to_get_there": "Press FX.",
   "what_it_is": "KNOB 1-4 reverb send of the strings, space (plate size), width, chord reverb send.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "13",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "17-23",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "294",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L294"
    }
   ]
  },
  {
   "id": "chords",
   "name": "Chords page",
   "how_to_get_there": "Press SEL.",
   "what_it_is": "Edit a chord button: press it, then KNOB 1 root, KNOB 2 type; KNOB 3 transpose, KNOB 4 octave.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "13",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "17-23",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "295",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L295"
    }
   ]
  },
  {
   "id": "setup",
   "name": "Setup page",
   "how_to_get_there": "Press GLO.",
   "what_it_is": "KNOB 1-3 tune, MIDI out, lights.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "13",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "17-23",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "296",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L296"
    }
   ]
  },
  {
   "id": "power_on",
   "name": "Power-on",
   "how_to_get_there": "Hold buttons while switching on.",
   "what_it_is": "Start-up gestures.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "299",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L299"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/panel.c",
     "lines": "3-5",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/panel.c#L3-L5"
    }
   ]
  },
  {
   "id": "safe_mode",
   "name": "Safe mode",
   "how_to_get_there": "Starts by itself after FoMni fails to start twice.",
   "what_it_is": "No sound; USB stays on so you can reinstall. PLAY tries FoMni again.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "177-179",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L177-L179"
    }
   ]
  }
 ],
 "controls": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Play page (acts when you let go).",
    "short_label": "PLAY PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "292",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L292"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Rhythm page (acts when you let go).",
    "short_label": "RHYTHM PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "293",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L293"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Sound page (acts when you let go).",
    "short_label": "SOUND PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "294",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L294"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Chords page (acts when you let go).",
    "short_label": "CHORDS PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "295",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L295"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the Setup page (acts when you let go).",
    "short_label": "SETUP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "296",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L296"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Steps to the next page: Play, Rhythm, Sound, Chords, Setup, round.",
    "short_label": "NEXT PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "297",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L297"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Alone: nothing. It's a modifier for the chord buttons.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: a chord button pressed now plays its root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "243-245",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L243-L245"
     }
    ],
    "note": "added 2026-10-13 (bead production-draft-9ajv.9, overlay re-check): the button side of the chord-key entries"
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Held together with LFO: a chord button pressed now plays its root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "243-245",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L243-L245"
     }
    ],
    "note": "added 2026-10-13 (bead production-draft-9ajv.9, overlay re-check): the button side of the chord-key entries"
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Alone: nothing. It's a modifier for the chord buttons.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held: a chord button pressed now plays its root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "243-245",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L243-L245"
     }
    ],
    "note": "added 2026-10-13 (bead production-draft-9ajv.9, overlay re-check): the button side of the chord-key entries"
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Held together with ENV: a chord button pressed now plays its root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "243-245",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L243-L245"
     }
    ],
    "note": "added 2026-10-13 (bead production-draft-9ajv.9, overlay re-check): the button side of the chord-key entries"
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Starts or stops the rhythm (acts on the press). With SYNC START on and no chord held: waits for your first chord; press again to cancel.",
    "short_label": "RHYTHM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "298-311",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L298-L311"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Tries starting FoMni again.",
    "short_label": "RETRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "177-179",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L177-L179"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "SYNC START on or off: the rhythm starts with your first chord.",
    "short_label": "SYNC START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "312-318",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L312-L318"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "CHORD HOLD on or off. With it on, a chord rings on once you lift your hand, until you tap that chord's button a second time.",
    "short_label": "CHORD HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "319-327",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L319-L327"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Saves now. Autosave needs unsaved edits, a stopped rhythm, released keys/buttons, silent strings, chord and bass, and four elapsed seconds on the activity timer. SELECT, ALGORITHM and PRESETS do not reset it; their edits can save immediately only when every other condition holds. A connected reader receives the result; flash errors are marked to be heard in full.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "336-343",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L336-L343"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "771-784",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L771-L784"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "76-95",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L76-L95"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/announce.c",
      "lines": "43-44",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/announce.c#L43-L44"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "472-486",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L472-L486"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-210",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L210"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate an octave down (to -1).",
    "short_label": "OCT -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "328-335",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L328-L335"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_up",
    "action": "Held together for 5 s: update mode for installing firmware (a countdown from 2 s; let go to cancel).",
    "short_label": "UPDATE 5S",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-337",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L319-L337"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_up",
    "action": "HARDWARE CALIBRATION: press each labelled button and turn each knob when asked.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "299",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L299"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/panel.c",
      "lines": "3-5",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/panel.c#L3-L5"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate an octave up (to +1).",
    "short_label": "OCT +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "328-335",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L328-L335"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "448-458",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L448-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_down",
    "action": "Held together for 5 s: update mode for installing firmware (a countdown from 2 s; let go to cancel).",
    "short_label": "UPDATE 5S",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-337",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L319-L337"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_down",
    "action": "HARDWARE CALIBRATION: press each labelled button and turn each knob when asked.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "299",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L299"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/panel.c",
      "lines": "3-5",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/panel.c#L3-L5"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Tempo (60-240).",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Picks the rhythm (one of ten).",
    "short_label": "RHYTHM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/om_data.h",
      "lines": "12",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/om_data.h#L12"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Transpose, -6 to +6 semitones.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Volume.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "311-317",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L311-L317"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "play",
    "gesture": "turn",
    "action": "Level of voice 1, the shimmering harp.",
    "short_label": "VOICE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "rhythm",
    "gesture": "turn",
    "action": "Which rhythm.",
    "short_label": "RHYTHM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Reverb send of the strings.",
    "short_label": "REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "turn",
    "action": "Root of the chord button pressed last.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Fine tune, -50 to +50 cents.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "play",
    "gesture": "turn",
    "action": "Level of voice 2, the plain harp.",
    "short_label": "VOICE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "rhythm",
    "gesture": "turn",
    "action": "Tempo.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Size of the reverb plate.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "turn",
    "action": "Type of that chord (major, minor, 7th...).",
    "short_label": "TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "MIDI out on or off.",
    "short_label": "MIDI OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "play",
    "gesture": "turn",
    "action": "How long the strings ring.",
    "short_label": "SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "rhythm",
    "gesture": "turn",
    "action": "Drums level.",
    "short_label": "DRUMS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Stereo width.",
    "short_label": "WIDTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "turn",
    "action": "Transpose, -6 to +6.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Lights: On (key lights and dim glow on unlit buttons), Keys (key lights only), Off.",
    "short_label": "LIGHTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "164-184",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L164-L184"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "play",
    "gesture": "turn",
    "action": "Level of the held chord.",
    "short_label": "CHORD LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "rhythm",
    "gesture": "turn",
    "action": "Auto bass on or off. On, the rhythm also plays the held chord and its bass in time.",
    "short_label": "AUTO BASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "295-300",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L295-L300"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Reverb send of the chord and bass.",
    "short_label": "CHORD REV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "turn",
    "action": "Octave of the strum plate, -1 to +1.",
    "short_label": "OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Nothing.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "23-28",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L23-L28"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 1: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 2: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 3: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 4: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 5: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 6: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 7: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 8: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 9: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 10: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 11: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 12: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 13: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 14: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 15: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Strum plate string 16: plucks one note of the current chord (the keys go in threes: root, third, fifth; every note is folded into one F#-F octave, so a group doesn't always rise in pitch). Run a finger across to strum.",
    "short_label": "STRING 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "442-488",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L442-L488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/dsp/omni.c",
      "lines": "75-86",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L75-L86"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 1 (default F): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 2 (default C): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 3 (default G): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 4 (default Dm): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD Dm",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 5 (default Am): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD Am",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 6 (default Em): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD Em",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 7 (default G7): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD G7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 8 (default E7): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD E7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 9 (default D7): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD D7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 10 (default Bb): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD Bb",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Chord button 11 (default A7): plays its chord and bass while held (or until pressed again with CHORD HOLD).",
    "short_label": "CHORD A7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "25-26",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L25-L26"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "270-280",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L270-L280"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/project.c",
      "lines": "6-10",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L6-L10"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env",
    "action": "Plays this button's root as a minor chord.",
    "short_label": "MINOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Plays this button's root as a 7th chord.",
    "short_label": "7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_env+button_lfo",
    "action": "Plays this button's root as a minor 7th chord.",
    "short_label": "MINOR 7TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "press",
    "action": "Also picks this button for editing with KNOB 1 (root) and KNOB 2 (type).",
    "short_label": "EDIT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "239-268",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L239-L268"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "187-211",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L187-L211"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "play",
    "gesture": "shows",
    "action": "The chord (big), its notes, the strings ringing; KNOB 1-4 voice 1, voice 2, sustain, chord level.",
    "short_label": "Play page",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "292",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L292"
     }
    ]
   },
   {
    "mode": "rhythm",
    "gesture": "shows",
    "action": "The rhythm pattern; KNOB 1-4 rhythm, tempo, drums level, auto bass.",
    "short_label": "Rhythm page",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "293",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L293"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "shows",
    "action": "KNOB 1-4 reverb send of the strings, space (plate size), width, chord reverb send.",
    "short_label": "Sound page",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "294",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L294"
     }
    ]
   },
   {
    "mode": "chords",
    "gesture": "shows",
    "action": "Edit a chord button: press it, then KNOB 1 root, KNOB 2 type; KNOB 3 transpose, KNOB 4 octave.",
    "short_label": "Chords page",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "295",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L295"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "shows",
    "action": "KNOB 1-3 tune, MIDI out, lights.",
    "short_label": "Setup page",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "13",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L13"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "17-23",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L17-L23"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "296",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L296"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "shows",
    "action": "No sound; USB stays on so you can reinstall. PLAY tries FoMni again.",
    "short_label": "Safe mode",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "177-179",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L177-L179"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Three bands: header (page name, or a message), the instrument (chord name and notes, strings or rhythm), the four knob values.",
    "short_label": "LAYOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "491",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L491"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "653-696",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L653-L696"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "During normal operation, a reader connection or a summary request sends the page and active knob values, selected chord-button number on Chords, chord name, rhythm, tempo or EXT, transport state, and enabled hold/sync flags.",
    "short_label": "READ SCREEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "833-869",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L833-L869"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "883-900",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L883-L900"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/announce.c",
      "lines": "142-160",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/announce.c#L142-L160"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "While a reader listens in normal operation, sends page changes after a 200 ms pause, changed parameter values after a 120 ms pause, chord names, transport changes and button messages; sustained value changes are sent at least every 480 ms.",
    "short_label": "READ CHANGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "902-942",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L902-L942"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "76-95",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L76-L95"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/announce.c",
      "lines": "103-138",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/announce.c#L103-L138"
     }
    ]
   }
  ],
  "jack_usb": [
   {
    "mode": "any",
    "gesture": "shows",
    "action": "During normal operation, exchanges screen-reader requests and text over USB MIDI while a reader listens; BYE ends the session, as does more than five seconds without a reader heartbeat.",
    "short_label": "READER USB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "338-343",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L338-L343"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/announce.c",
      "lines": "39-46",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/announce.c#L39-L46"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/announce.c",
      "lines": "129-164",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/announce.c#L129-L164"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/main.c",
      "lines": "126-136",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/main.c#L126-L136"
     }
    ]
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "FoMni keeps one setup (page values, chord buttons, hold/sync and lights) and panel calibration in flash; v0.4 uses the same storage format as v0.3.2 and still converts v0.1 setups. From the flash atlas (generated): install (update loader): Writes the program area (every install or update). install (update loader): Erases every sector in this range whose last 256 bytes hold a valid update record (0xE4000; 0xE8000 coming from stock). No 0x97000-0xDFFFF skip (only sectors whose tail is a valid update record). every start-up: Erases the five-sector update staging area only when any of its first four bytes at 0xE0000 or the first eight update-record bytes at 0xE4F00 are not erased (0xFF). Other occupied bytes alone do not trigger cleanup (only when a probe at 0xE0000 (4 bytes) or 0xE4F00 (8 bytes) is not blank). every start-up: Nothing else: project_load and panel_init only read. update (leaving through an installer's upgrade command): Erases the five staging sectors, stages the incoming firmware's loader there and writes its update record at 0xE4F00 (only when an installer starts an update from this firmware). install (CLI or web installer, arriving from M-VAVE Open firmware): Recognizes FM1_OFFICIAL_OPEN / FM1_COMMUNITY_n and refuses direct FoMni installation. Requires the approved stock FM-1 V15 package first; command 49 must return a 47-byte FMC1 idle reply, and command 50 must acknowledge the image length and approved SHA-256 before updating. The stock loader's whole-image behavior is described only by comments, so no new stock erase range is asserted here (Only while an Open identity is running; direct FoMni selection is refused before the update starts. CLI verifies the file digest; the web page verifies the stock digest before enabling its button). What FoMni writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over FoMni's is in when_you_leave.",
  "lost": "Returning from FoMni to stock still carries the installer's warning that saved FoMni chords and sounds may be lost. The new installer route from M-VAVE Open requires stock V15 before FoMni; back up in the firmware you are leaving first. From the flash atlas (generated): Other firmwares reading FoMni's data: AMB-1 reads and uses FoMni's FoMni button calibration; Polly reads and uses FoMni's FoMni button calibration. What FoMni reads of other firmwares' data: FoMni reads and uses AMB-1's AMB-1 panel calibration; FoMni reads and uses Polly's Polly button and encoder calibration. Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "FoMni has no setup backup or export. Write down the chord buttons and page values you want to keep. Back up Felucca or a fork in its own editor before installing FoMni. If the unit runs M-VAVE Open, use the installer to put stock V15 back first, then install FoMni. Before the stock step, back up anything M-VAVE Open lets you save: that step may erase it, and survival of Open data has not been established.",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/plat.h",
    "lines": "45",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat.h#L45"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/storage.c",
    "lines": "20-22",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/storage.c#L20-L22"
   },
   {
    "kind": "source",
    "repo": "hugelton/Felucca",
    "ref": "v1.6",
    "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
    "path": "firmware/src/storage.c",
    "lines": "20-21",
    "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/storage.c#L20-L21"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "web/omni_installer.html",
    "lines": "113",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/omni_installer.html#L113"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/project.c",
    "lines": "27-45",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L27-L45"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "tools/fm1_install.py",
    "lines": "390-417",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/tools/fm1_install.py#L390-L417"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "tools/fm1_install.py",
    "lines": "422-434",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/tools/fm1_install.py#L422-L434"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "web/fm1ota.js",
    "lines": "235-252",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/fm1ota.js#L235-L252"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "web/omni_installer.html",
    "lines": "170-186",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/omni_installer.html#L170-L186"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/app.h",
    "lines": "12-24",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/app.h#L12-L24"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "tools/fm1_install.py",
    "lines": "42-45",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/tools/fm1_install.py#L42-L45"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "web/fm1ota.js",
    "lines": "15-18",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/fm1ota.js#L15-L18"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/ota.c",
    "lines": "268-289",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/ota.c#L268-L289"
   }
  ],
  "evidence": "Generated from the flash atlas (output/fm1/flash-atlas/). Each fact carries its evidence grade. Available firmware source was read at the mapped release; Open’s USER layout is read in its package and APP source; its native SDK/loader are closed. Stock V15’s layout is reported from V13 analysis; Baud Girl’s is inferred. Nothing was tested on a unit. Anything listed is at risk, whatever saved copy might survive.",
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, button calibration, favourites, MIDI LEARN map. At risk when you act: user presets 1-16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk when you act: X0X button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, favourites, MENU options. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U001-U018.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "AMB-1 panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. Carried over: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "Polly button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. Carried over: Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk when you act: user sound bank 1.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "overwrites_note": "Generated from the flash atlas (output/fm1/flash-atlas/). Each fact carries its evidence grade. Available firmware source was read at the mapped release; Open’s USER layout is read in its package and APP source; its native SDK/loader are closed. Stock V15’s layout is reported from V13 analysis; Baud Girl’s is inferred. Nothing was tested on a unit. Anything listed is at risk, whatever saved copy might survive.",
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "FoMni button calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "FoMni button calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "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": "by itself, only after a retained second-core failure, if two cores were enabled",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk by itself, under a condition: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FoMni button calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). Carried over: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "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": "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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "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 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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: FoMni button calibration; FoMni setup (pages, chord buttons, lights).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "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)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "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 calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights).",
    "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": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "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": [
     "FoMni button calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). Carried over: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "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": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "open_stock_risk": {
   "evidence": "reported",
   "note": "FoMni's source comments describe V15 as rewriting the flash, including its boot area. The proprietary loader is absent here, so whether Open's saved work survives is unconfirmed; back up whatever Open can save before restoring stock.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "tools/fm1_install.py",
     "lines": "42-45",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/tools/fm1_install.py#L42-L45"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "web/fm1ota.js",
     "lines": "15-18",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/web/fm1ota.js#L15-L18"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/ota.c",
     "lines": "268-289",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/ota.c#L268-L289"
    }
   ]
  }
 },
 "disagreements": [
  {
   "topic": "PLAY with SYNC START",
   "docs_say": "README: PLAY turns the rhythm on and off.",
   "source_says": "With SYNC START on and no chord held, PLAY doesn't start the rhythm: it waits for your first chord, and a second press cancels the wait.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "README.md",
    "lines": "27",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/README.md#L27"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "298-311",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L298-L311"
   }
  },
  {
   "topic": "Hidden gestures",
   "docs_say": "README doesn't mention the 5-second OCT- + OCT+ update mode or power-on calibration.",
   "source_says": "Both are there, inherited from Felucca by way of X0X; safe mode starts after two failed starts.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "README.md",
    "lines": "18-19",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/README.md#L18-L19"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "319-337",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L319-L337"
   },
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "297-299",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L297-L299"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/panel.c",
     "lines": "47-103",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/panel.c#L47-L103"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "382-390",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L382-L390"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "180-227",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L180-L227"
    }
   ]
  }
 ],
 "not_mapped": [
  "MIDI note/channel and clock mapping, including the v0.4 README's channel-10 drum-note table (not mapped as panel gestures).",
  "The ten rhythm names and chord type list (dsp/om_data.h, dsp/omni.c).",
  "Computer screen-reader controls and voices belong to the separate fm1-reader project; this map covers the text sent by FoMni."
 ],
 "lights": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The Play page is showing.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "748-749",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L748-L749"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The Rhythm page is showing.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "748-749",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L748-L749"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The Sound page is showing.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "748-749",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L748-L749"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The Chords page is showing.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "748-749",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L748-L749"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The Setup page is showing.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "748-749",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L748-L749"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "light": "green",
    "mode": "any",
    "gesture": "flash",
    "action": "The rhythm is playing: flashes on each beat.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   },
   {
    "light": "green",
    "mode": "any",
    "gesture": "blinking",
    "action": "SYNC START is waiting for your first chord.",
    "short_label": "WAITING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "PLAY's own (red) LED is not used; FoMni drives the green one.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "SYNC START is on.",
    "short_label": "SYNC ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "CHORD HOLD is on.",
    "short_label": "HOLD ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With Setup > Lights at On: unlit buttons glow dimly so their labels can be read.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-71",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L71"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "With Lights on (On or Keys): the chord button sounding, and each white key while its string rings.",
    "short_label": "SOUNDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-fomni",
      "ref": "v0.4",
      "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
      "path": "firmware/src/app/ui.c",
      "lines": "745-767",
      "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_a3",
   "led_a4",
   "led_as3",
   "led_as4",
   "led_b3",
   "led_b4",
   "led_c4",
   "led_c5",
   "led_cs4",
   "led_cs5",
   "led_d4",
   "led_d5",
   "led_ds4",
   "led_ds5",
   "led_e4",
   "led_e5",
   "led_f3",
   "led_f4",
   "led_f5",
   "led_fs3",
   "led_fs4",
   "led_fs5",
   "led_g3",
   "led_g4",
   "led_g5",
   "led_gs3",
   "led_gs4"
  ]
 },
 "undocumented": [
  {
   "topic": "Octave range",
   "note": "The README says OCT- / OCT+ move the strum plate an octave; it doesn't give the limit, one octave each way (-1 to +1).",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/dsp/omni.c",
     "lines": "28",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/dsp/omni.c#L28"
    }
   ]
  },
  {
   "topic": "PLAY's light",
   "note": "PLAY lights its green LED, never the red one: on for half of each beat while the rhythm plays, blinking while SYNC START waits.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "745-767",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L745-L767"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/plat_fm1.c",
     "lines": "46-49",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/plat_fm1.c#L46-L49"
    }
   ]
  }
 ],
 "fixed_after_check": "2026-10-13",
 "check_fixes": [
  {
   "error": "2 MINOR (strum wording)",
   "fixed": "the 16 white-key entries no longer say 'low to high'; they say notes fold into one F#-F octave (omni.c:75-86)"
  },
  {
   "error": "3 MINOR (copied wording)",
   "fixed": "AUTO BASS rewritten"
  },
  {
   "error": "4 MINOR (not disagreements)",
   "fixed": "Octave range and Lights moved from disagreements to a new 'undocumented' list"
  },
  {
   "error": "cross-map (previous firmware's data)",
   "fixed": "switching_note.overwrites_previous added with addresses and timing; lost/back_up_first reworded"
  },
  {
   "error": "R2 error 3 (copied wording)",
   "fixed": "ARP / CHORD HOLD reworded in fomni.md and controls.button_arp"
  }
 ],
 "status": "beta (marked beta in the FM-1 Firmware Hub catalog, catalog.json 'beta': true, read 2026-10-13)",
 "refreshed_from": {
  "release": "v0.3.2",
  "commit": "405ef41aef75f7e70afd6decc01505df07c708e9",
  "date": "2026-10-16"
 },
 "saving_note": {
  "power_off": "Switching off writes nothing. FoMni stores one setup. Autosave needs an edit marked unsaved, stopped playback, released keys and buttons, silent strings, chord and bass, and four seconds on its activity timer. Buttons, keys and KNOB 1–4 refresh that timer; SELECT, ALGORITHM and PRESETS do not. Press SAVE before starting an install. If an update session stops early and returns to FoMni, recent edits can remain in memory while the unsaved flag and dot have been cleared, so autosave will not store them until another edit marks the setup unsaved. Press SAVE again to keep them; switching off before a successful save loses them.",
  "evidence": "read-in-source",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "336-344",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L336-L344"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "769-785",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L769-L785"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/project.c",
    "lines": "47-58",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/project.c#L47-L58"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "472-486",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L472-L486"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "345-352",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/main_fm1.c#L345-L352"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/ota.c",
    "lines": "337-350",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/ota.c#L337-L350"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "1010-1019",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L1010-L1019"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "771-784",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L771-L784"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-fomni",
    "ref": "v0.4",
    "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
    "path": "firmware/src/app/ui.c",
    "lines": "582-583",
    "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L582-L583"
   }
  ]
 },
 "overwrites_without_asking": [
  {
   "what": "SAVE replaces the stored setup without a question. Quiet autosave stores later edits in the same setup. Neither provides an undo command.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "336-344",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L336-L344"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/ui.c",
     "lines": "769-785",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/ui.c#L769-L785"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/storage.c",
     "lines": "112-148",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/storage.c#L112-L148"
    }
   ]
  },
  {
   "what": "Finishing hardware calibration replaces the saved button and encoder map. An incomplete calibration leaves the previous map in place.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-fomni",
     "ref": "v0.4",
     "commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
     "path": "firmware/src/app/panel.c",
     "lines": "47-108",
     "url": "https://github.com/charlesvestal/fm1-fomni/blob/6ecd227013cc18def0e89d035b3760eb268b342b/firmware/src/app/panel.c#L47-L108"
    }
   ]
  }
 ],
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 Open data at risk",
   "fixed": "Add Open-specific backup advice before restoring stock V15, with possible erasure and unconfirmed data survival stated explicitly.",
   "at": "switching_note.back_up_first"
  },
  {
   "round": 1,
   "error": "1 Open data at risk",
   "fixed": "Grade the stock rewrite description as reported from source comments; do not assert confirmed stock erase ranges.",
   "at": "switching_note.open_stock_risk"
  },
  {
   "round": 1,
   "error": "1 Open data at risk",
   "fixed": "Add Open-specific backup advice and the uncertain survival of its saved work before the stock bridge.",
   "at": "control-maps/fomni.md:Before you switch firmware"
  },
  {
   "round": 1,
   "error": "1 Open data at risk",
   "fixed": "Add the Open backup consequence to the installer-path report and retain the reported evidence limit for stock writes.",
   "at": "refresh/work/fomni.storage.json:changes[0]"
  },
  {
   "round": 1,
   "error": "2 Aborted update clears autosave flag",
   "fixed": "Qualify autosave by the unsaved flag; explain that a returning update session clears that flag without saving pending edits, and advise SAVE before installation and after an early return.",
   "at": "saving_note.power_off"
  },
  {
   "round": 1,
   "error": "2 Aborted update clears autosave flag",
   "fixed": "Explain the aborted-update autosave gap and tell owners to SAVE before starting an install and after an early return.",
   "at": "control-maps/fomni.md:Saving"
  },
  {
   "round": 1,
   "error": "2 Aborted update clears autosave flag",
   "fixed": "Correct the save-trigger confirmations and document the unchanged returning-update path that clears the dirty flag without storing edits.",
   "at": "refresh/work/fomni.storage.json:unchanged_confirmed"
  },
  {
   "round": 1,
   "error": "3 SAVE autosave timer",
   "fixed": "Replace the four-seconds-after-any-change claim with the actual timer rule and explain why SELECT, ALGORITHM or PRESETS edits can save immediately.",
   "at": "controls.button_save[0]"
  },
  {
   "round": 1,
   "error": "4 MASTER has no reader output",
   "fixed": "Name the seven parameter encoders explicitly and state that MASTER volume has no reader announcement.",
   "at": "control-maps/fomni.md:Use a screen reader"
  },
  {
   "round": 1,
   "error": "5 Copied page sentence",
   "fixed": "Rewrite the page/knob explanation in original words after re-reading VIEW_KNOB, button(), input() and README.md:39.",
   "at": "control-maps/fomni.md:The pages"
  },
  {
   "round": 2,
   "error": "1 SAVE autosave conditions",
   "fixed": "Restore every autosave condition: an unsaved edit, stopped rhythm, released keys and buttons, silent strings/chord/bass, and the four-second activity timer; immediate saves after SELECT, ALGORITHM or PRESETS edits still require all other conditions. Re-read ui.c:472-486 and 775-780 at 6ecd227.",
   "at": "controls.button_save[0]"
  }
 ]
}